Rough start to Deno runtime implemenation
This commit is contained in:
parent
fdb1097a9c
commit
fba91bde10
10
.editorconfig
Normal file
10
.editorconfig
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = tab
|
||||||
|
insert_final_newline = false
|
||||||
|
max_line_length = 120
|
||||||
|
tab_width = 2
|
20
deno.jsonc
Normal file
20
deno.jsonc
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"imports": {
|
||||||
|
"std": "https://deno.land/std@0.204.0/",
|
||||||
|
// "/": "./src/",
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"include": ["src/"],
|
||||||
|
"rules": {
|
||||||
|
"tags": ["recommended"],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fmt": {
|
||||||
|
"useTabs": true,
|
||||||
|
"lineWidth": 80,
|
||||||
|
"indentWidth": 2,
|
||||||
|
"semiColons": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
},
|
||||||
|
"nodeModulesDir": true,
|
||||||
|
}
|
14
justfile
Normal file
14
justfile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Lists the available actions
|
||||||
|
default:
|
||||||
|
@just --list
|
||||||
|
|
||||||
|
# Code linting with deno
|
||||||
|
deno-lint:
|
||||||
|
deno lint
|
||||||
|
|
||||||
|
# Code linting with bun
|
||||||
|
bun-lint:
|
||||||
|
|
||||||
|
# Run with deno
|
||||||
|
deno-run:
|
||||||
|
deno run --allow-all --allow-ffi --deny-net --deny-hrtime --unstable ./src/scroll.ts
|
1
src/bun/ffi.ts
Normal file
1
src/bun/ffi.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
// Bun-specific ffi code
|
64
src/deno/ffi.ts
Normal file
64
src/deno/ffi.ts
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// Deno-specific ffi code
|
||||||
|
|
||||||
|
// Determine library extension based on
|
||||||
|
// your OS.
|
||||||
|
let libSuffix = '';
|
||||||
|
switch (Deno.build.os) {
|
||||||
|
case 'windows':
|
||||||
|
libSuffix = 'dll';
|
||||||
|
break;
|
||||||
|
case 'darwin':
|
||||||
|
libSuffix = 'dylib';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
libSuffix = 'so';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const cSharedLib = `./libc.${libSuffix}`;
|
||||||
|
const cStdLib = Deno.dlopen(
|
||||||
|
cSharedLib,
|
||||||
|
{
|
||||||
|
termios: {
|
||||||
|
type: {
|
||||||
|
struct: [
|
||||||
|
// c_iflag
|
||||||
|
'u32',
|
||||||
|
// c_oflag
|
||||||
|
'u32',
|
||||||
|
// c_cflag
|
||||||
|
'u32',
|
||||||
|
// c_lflag
|
||||||
|
'u32',
|
||||||
|
// c_cc[20]
|
||||||
|
'u8', 'u8', 'u8', 'u8', 'u8',
|
||||||
|
'u8', 'u8', 'u8', 'u8', 'u8',
|
||||||
|
'u8', 'u8', 'u8', 'u8', 'u8',
|
||||||
|
'u8', 'u8', 'u8', 'u8', 'u8',
|
||||||
|
// __ispeed
|
||||||
|
'i32',
|
||||||
|
// __ospeed
|
||||||
|
'i32',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tcgetattr: {
|
||||||
|
parameters: ['i32', 'pointer'],
|
||||||
|
result: 'i32',
|
||||||
|
},
|
||||||
|
tcsetattr: {
|
||||||
|
parameters: ['i32', 'i32', 'pointer'],
|
||||||
|
result: 'i32',
|
||||||
|
},
|
||||||
|
cfmakeraw: {
|
||||||
|
parameters: ['pointer'],
|
||||||
|
result: 'void',
|
||||||
|
},
|
||||||
|
} as const,
|
||||||
|
);
|
||||||
|
|
||||||
|
export default cStdLib.symbols;
|
||||||
|
export const termios = cStdLib.symbols.termios;
|
||||||
|
export const tcgetattr = cStdLib.symbols.tcgetattr;
|
||||||
|
export const tcsetattr = cStdLib.symbols.tcsetattr;
|
||||||
|
export const cfmakeraw = cStdLib.symbols.cfmakeraw;
|
15
src/deno/index.ts
Normal file
15
src/deno/index.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* The main entrypoint when using Deno as the runtime
|
||||||
|
*/
|
||||||
|
export async function main(): Promise<number> {
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
for await (const chunk of Deno.stdin.readable) {
|
||||||
|
const char = String(decoder.decode(chunk)).trim();
|
||||||
|
|
||||||
|
if (char === 'q') {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
@ -1,6 +1,24 @@
|
|||||||
/**
|
/**
|
||||||
* The starting point for running scroll
|
* The starting point for running scroll
|
||||||
*/
|
*/
|
||||||
(() => {
|
|
||||||
// Now, to do stuff
|
export enum RunTime {
|
||||||
|
Bun = 'bun',
|
||||||
|
Deno = 'deno',
|
||||||
|
Unknown = 'common',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine the runtime strategy, and go!
|
||||||
|
*/
|
||||||
|
(async () => {
|
||||||
|
let RUNTIME = RunTime.Unknown;
|
||||||
|
if ('Deno' in globalThis) {
|
||||||
|
RUNTIME = RunTime.Deno;
|
||||||
|
const { main } = await import('./deno/index.ts');
|
||||||
|
await main();
|
||||||
|
}
|
||||||
|
if ('Bun' in globalThis) {
|
||||||
|
RUNTIME = RunTime.Bun;
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
|
Loading…
Reference in New Issue
Block a user