@makano/rew 1.1.73 → 1.1.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/rew/cli/cli.js +189 -144
- package/lib/rew/cli/log.js +18 -19
- package/lib/rew/cli/run.js +7 -9
- package/lib/rew/cli/utils.js +109 -95
- package/lib/rew/const/config_path.js +4 -0
- package/lib/rew/const/default.js +21 -3
- package/lib/rew/const/files.js +11 -8
- package/lib/rew/const/opt.js +6 -6
- package/lib/rew/css/theme.css +1 -1
- package/lib/rew/functions/core.js +7 -9
- package/lib/rew/functions/emitter.js +2 -2
- package/lib/rew/functions/exec.js +19 -15
- package/lib/rew/functions/export.js +4 -6
- package/lib/rew/functions/fs.js +21 -18
- package/lib/rew/functions/future.js +1 -1
- package/lib/rew/functions/import.js +55 -25
- package/lib/rew/functions/map.js +2 -5
- package/lib/rew/functions/match.js +21 -5
- package/lib/rew/functions/path.js +2 -2
- package/lib/rew/functions/require.js +16 -13
- package/lib/rew/functions/stdout.js +11 -11
- package/lib/rew/functions/types.js +67 -42
- package/lib/rew/html/ui.html +5 -6
- package/lib/rew/html/ui.js +100 -58
- package/lib/rew/main.js +3 -3
- package/lib/rew/misc/findAppInfo.js +16 -0
- package/lib/rew/misc/findAppPath.js +21 -0
- package/lib/rew/misc/seededid.js +13 -0
- package/lib/rew/models/struct.js +1 -1
- package/lib/rew/modules/compiler.js +90 -58
- package/lib/rew/modules/context.js +35 -22
- package/lib/rew/modules/runtime.js +1 -1
- package/lib/rew/pkgs/conf.js +50 -33
- package/lib/rew/pkgs/data.js +7 -2
- package/lib/rew/pkgs/date.js +8 -9
- package/lib/rew/pkgs/env.js +3 -5
- package/lib/rew/pkgs/modules/data/bintree.js +1 -1
- package/lib/rew/pkgs/modules/data/doublylinked.js +1 -1
- package/lib/rew/pkgs/modules/data/linkedList.js +1 -1
- package/lib/rew/pkgs/modules/data/queue.js +1 -2
- package/lib/rew/pkgs/modules/data/stack.js +1 -1
- package/lib/rew/pkgs/modules/threads/worker.js +31 -21
- package/lib/rew/pkgs/modules/ui/classes.js +68 -61
- package/lib/rew/pkgs/pkgs.js +5 -6
- package/lib/rew/pkgs/rune.js +437 -0
- package/lib/rew/pkgs/threads.js +30 -22
- package/lib/rew/pkgs/ui.js +68 -44
- package/package.json +8 -2
package/lib/rew/pkgs/threads.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const { Worker } = require(
|
|
2
|
-
const emitter = require(
|
|
3
|
-
const future = require(
|
|
4
|
-
const { struct } = require(
|
|
5
|
-
const path = require(
|
|
1
|
+
const { Worker } = require("worker_threads");
|
|
2
|
+
const emitter = require("../functions/emitter");
|
|
3
|
+
const future = require("../functions/future");
|
|
4
|
+
const { struct } = require("../models/struct");
|
|
5
|
+
const path = require("path");
|
|
6
6
|
|
|
7
7
|
module.exports = (context) => ({
|
|
8
8
|
thread: (cb) => {
|
|
@@ -10,7 +10,7 @@ module.exports = (context) => ({
|
|
|
10
10
|
|
|
11
11
|
const stopWorker = (worker) => {
|
|
12
12
|
workers.splice(workers.indexOf(worker), 1);
|
|
13
|
-
worker.terminate()
|
|
13
|
+
worker.terminate();
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
const athread = {
|
|
@@ -19,53 +19,61 @@ module.exports = (context) => ({
|
|
|
19
19
|
workers.forEach(stopWorker);
|
|
20
20
|
},
|
|
21
21
|
start: (context) => {
|
|
22
|
-
let dataResult = future(() => {}),
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
let dataResult = future(() => {}),
|
|
23
|
+
listener = emitter();
|
|
24
|
+
const worker = new Worker(
|
|
25
|
+
path.resolve(__dirname, "./modules/threads/worker.js"),
|
|
26
|
+
{
|
|
27
|
+
workerData: { context, cb: cb.toString() },
|
|
28
|
+
},
|
|
29
|
+
);
|
|
26
30
|
workers.push(worker);
|
|
27
31
|
|
|
28
32
|
const stop = () => stopWorker(worker);
|
|
29
33
|
|
|
30
|
-
worker.on(
|
|
31
|
-
if (data.type ===
|
|
34
|
+
worker.on("message", (data) => {
|
|
35
|
+
if (data.type === "result") {
|
|
32
36
|
dataResult.resolve(data.result);
|
|
33
37
|
stop();
|
|
34
|
-
} else if (data.type ===
|
|
38
|
+
} else if (data.type === "error") {
|
|
35
39
|
reject(new Error(data.error));
|
|
36
40
|
stop();
|
|
37
|
-
} else if (data.type ===
|
|
41
|
+
} else if (data.type === "event") {
|
|
38
42
|
listener.emit(data.event, data.data);
|
|
39
43
|
}
|
|
40
44
|
});
|
|
41
45
|
|
|
42
|
-
worker.on(
|
|
46
|
+
worker.on("error", (error) => {
|
|
43
47
|
console.log(error);
|
|
44
48
|
stop();
|
|
45
49
|
});
|
|
46
50
|
|
|
47
51
|
let exiting = false;
|
|
48
52
|
|
|
49
|
-
worker.on(
|
|
50
|
-
if(exiting) return;
|
|
53
|
+
worker.on("exit", (code) => {
|
|
54
|
+
if (exiting) return;
|
|
51
55
|
stop();
|
|
52
56
|
if (code !== 0) {
|
|
53
57
|
throw new Error(`Worker stopped with exit code ${code}`);
|
|
54
58
|
}
|
|
55
59
|
});
|
|
56
60
|
|
|
57
|
-
worker.postMessage({ type:
|
|
61
|
+
worker.postMessage({ type: "start" });
|
|
58
62
|
|
|
59
63
|
return {
|
|
60
64
|
on: (e, cb) => listener.on(e, cb),
|
|
61
65
|
off: (e, cb) => listener.off(e, cb),
|
|
62
|
-
emit: (e, data) =>
|
|
66
|
+
emit: (e, data) =>
|
|
67
|
+
worker?.postMessage({ type: "event", event: e, data }),
|
|
63
68
|
get: () => dataResult.wait(),
|
|
64
|
-
stop: () => {
|
|
69
|
+
stop: () => {
|
|
70
|
+
exiting = true;
|
|
71
|
+
stop();
|
|
72
|
+
},
|
|
65
73
|
};
|
|
66
|
-
}
|
|
74
|
+
},
|
|
67
75
|
};
|
|
68
76
|
|
|
69
77
|
return athread;
|
|
70
|
-
}
|
|
78
|
+
},
|
|
71
79
|
});
|
package/lib/rew/pkgs/ui.js
CHANGED
|
@@ -4,7 +4,7 @@ const fs = require("fs");
|
|
|
4
4
|
const { uiClasses } = require("./modules/ui/classes");
|
|
5
5
|
const { generateRandomID } = require("../functions/id");
|
|
6
6
|
const { THEME_PATH } = require("../const/files");
|
|
7
|
-
const readline = require(
|
|
7
|
+
const readline = require("readline");
|
|
8
8
|
const emitter = require("../functions/emitter");
|
|
9
9
|
|
|
10
10
|
const BIN_PATH = path.resolve(__dirname, "../../../bin/ui");
|
|
@@ -12,27 +12,31 @@ const HTML_STRING = fs.readFileSync(
|
|
|
12
12
|
path.resolve(__dirname, "../html/ui.html"),
|
|
13
13
|
{ encoding: "utf-8" },
|
|
14
14
|
);
|
|
15
|
-
const JS_STRING = fs.readFileSync(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
);
|
|
15
|
+
const JS_STRING = fs.readFileSync(path.resolve(__dirname, "../html/ui.js"), {
|
|
16
|
+
encoding: "utf-8",
|
|
17
|
+
});
|
|
19
18
|
|
|
20
|
-
const replaceString = (string, options) =>
|
|
19
|
+
const replaceString = (string, options) =>
|
|
20
|
+
string.replace(/\$OPTIONS\(([^)]+)\)/g, (_, n) =>
|
|
21
|
+
n.startsWith("json.")
|
|
22
|
+
? JSON.stringify(options[n.split("json.")[1]] || "{}")
|
|
23
|
+
: options[n] || _,
|
|
24
|
+
);
|
|
21
25
|
|
|
22
26
|
const defaultOptions = {
|
|
23
27
|
title: "Title",
|
|
24
28
|
onExit: () => process.exit(),
|
|
25
|
-
style:
|
|
29
|
+
style: "",
|
|
26
30
|
stylePath: THEME_PATH,
|
|
27
|
-
exec: () => {
|
|
28
|
-
execContext: {}
|
|
31
|
+
exec: () => {},
|
|
32
|
+
execContext: {},
|
|
29
33
|
};
|
|
30
34
|
|
|
31
35
|
module.exports = (context) => ({
|
|
32
36
|
start: (o = {}) => {
|
|
33
37
|
const options = {
|
|
34
38
|
...defaultOptions,
|
|
35
|
-
...o
|
|
39
|
+
...o,
|
|
36
40
|
};
|
|
37
41
|
|
|
38
42
|
const hookedSocketListeners = {};
|
|
@@ -42,9 +46,13 @@ module.exports = (context) => ({
|
|
|
42
46
|
|
|
43
47
|
options.runId = runId;
|
|
44
48
|
|
|
45
|
-
if (fs.existsSync(options.stylePath))
|
|
49
|
+
if (fs.existsSync(options.stylePath))
|
|
50
|
+
options.style =
|
|
51
|
+
fs.readFileSync(options.stylePath, { encoding: "utf-8" }) +
|
|
52
|
+
"\n" +
|
|
53
|
+
options.style;
|
|
46
54
|
|
|
47
|
-
options.style =
|
|
55
|
+
options.style = " */\n" + options.style + "\n/* ";
|
|
48
56
|
|
|
49
57
|
const HTML = replaceString(HTML_STRING, options);
|
|
50
58
|
const JS = replaceString(JS_STRING, options);
|
|
@@ -56,39 +64,44 @@ module.exports = (context) => ({
|
|
|
56
64
|
const queue = [];
|
|
57
65
|
|
|
58
66
|
const send = (data) => {
|
|
59
|
-
const content = fs.readFileSync(tmpFile, { encoding:
|
|
67
|
+
const content = fs.readFileSync(tmpFile, { encoding: "utf-8" });
|
|
60
68
|
if (content) {
|
|
61
69
|
queue.push(data);
|
|
62
70
|
} else {
|
|
63
|
-
fs.writeFileSync(
|
|
71
|
+
fs.writeFileSync(
|
|
72
|
+
tmpFile,
|
|
73
|
+
typeof data !== "string" ? JSON.stringify(data) : data,
|
|
74
|
+
);
|
|
64
75
|
}
|
|
65
|
-
}
|
|
76
|
+
};
|
|
66
77
|
|
|
67
78
|
const sendEvent = (data) => {
|
|
68
|
-
send({
|
|
69
|
-
|
|
79
|
+
send({
|
|
80
|
+
action: "JS",
|
|
81
|
+
data: `window.recieveMessage(${JSON.stringify(data)})`,
|
|
82
|
+
});
|
|
83
|
+
};
|
|
70
84
|
|
|
71
85
|
const g_emitter = emitter();
|
|
72
86
|
|
|
73
87
|
const recieve = (data) => {
|
|
74
|
-
g_emitter.emit(
|
|
75
|
-
}
|
|
88
|
+
g_emitter.emit("recieve", data);
|
|
89
|
+
};
|
|
76
90
|
|
|
77
91
|
const rl = readline.createInterface({
|
|
78
92
|
input: process.stdin,
|
|
79
|
-
output: process.stdout
|
|
93
|
+
output: process.stdout,
|
|
80
94
|
});
|
|
81
95
|
|
|
82
|
-
rl.question(
|
|
96
|
+
rl.question("", () => {});
|
|
83
97
|
|
|
84
|
-
fs.writeFileSync(tmpFile,
|
|
98
|
+
fs.writeFileSync(tmpFile, "");
|
|
85
99
|
|
|
86
|
-
fs.watch(tmpFile, { encoding:
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
});
|
|
100
|
+
fs.watch(tmpFile, { encoding: "utf-8" }).on("change", () => {
|
|
101
|
+
if (queue.length) {
|
|
102
|
+
send(queue.pop());
|
|
103
|
+
}
|
|
104
|
+
});
|
|
92
105
|
|
|
93
106
|
const p = spawn(options.bin || BIN_PATH, [runId]);
|
|
94
107
|
|
|
@@ -102,10 +115,10 @@ module.exports = (context) => ({
|
|
|
102
115
|
fs.unlinkSync(tmpFile);
|
|
103
116
|
});
|
|
104
117
|
|
|
105
|
-
g_emitter.on(
|
|
106
|
-
if (edata.action.startsWith(
|
|
118
|
+
g_emitter.on("recieve", (edata) => {
|
|
119
|
+
if (edata.action.startsWith("hook:")) {
|
|
107
120
|
const hook = hookedSocketListeners[edata.data.rid];
|
|
108
|
-
const type = edata.action.split(
|
|
121
|
+
const type = edata.action.split("hook:")[1];
|
|
109
122
|
if (hook && hook.type == type) {
|
|
110
123
|
hookedSocketListeners[edata.data.rid].cb(edata.data.object);
|
|
111
124
|
if (hook.once) delete hookedSocketListeners[edata.data.rid];
|
|
@@ -119,19 +132,30 @@ module.exports = (context) => ({
|
|
|
119
132
|
const d = data.toString().split("RESPONSE::")[1];
|
|
120
133
|
const jd = JSON.parse(d);
|
|
121
134
|
recieve(jd);
|
|
122
|
-
} else if (data.toString().trim().endsWith(
|
|
123
|
-
console.log(
|
|
124
|
-
r(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
+
} else if (data.toString().trim().endsWith("SETUP::READY")) {
|
|
136
|
+
console.log("READY");
|
|
137
|
+
r(
|
|
138
|
+
uiClasses(
|
|
139
|
+
context,
|
|
140
|
+
options,
|
|
141
|
+
sendEvent,
|
|
142
|
+
(cb) => {
|
|
143
|
+
g_emitter.on("recieve", cb);
|
|
144
|
+
},
|
|
145
|
+
(rid, type, cb, once = true) => {
|
|
146
|
+
// Add hook
|
|
147
|
+
hookedSocketListeners[rid] = { type, cb, once };
|
|
148
|
+
},
|
|
149
|
+
(rid) => {
|
|
150
|
+
// Remove hook
|
|
151
|
+
delete hookedSocketListeners[rid];
|
|
152
|
+
},
|
|
153
|
+
),
|
|
154
|
+
);
|
|
155
|
+
} else if (data.toString().endsWith("SETUP::HTML")) {
|
|
156
|
+
send({ action: "JS2", data: JS, isSetup: true });
|
|
157
|
+
} else if (data.toString() == "INIT::READY") {
|
|
158
|
+
send({ action: "HTML", data: HTML });
|
|
135
159
|
} else {
|
|
136
160
|
console.log(data.toString());
|
|
137
161
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@makano/rew",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.81",
|
|
4
4
|
"description": "A simple coffescript runtime",
|
|
5
5
|
"main": "lib/rew/main.js",
|
|
6
6
|
"directories": {
|
|
@@ -24,7 +24,11 @@
|
|
|
24
24
|
"type": "git",
|
|
25
25
|
"url": "git+https://github.com/kevinj045/rew.git"
|
|
26
26
|
},
|
|
27
|
-
"keywords": [
|
|
27
|
+
"keywords": [
|
|
28
|
+
"coffescript",
|
|
29
|
+
"rew",
|
|
30
|
+
"runtime"
|
|
31
|
+
],
|
|
28
32
|
"author": "makano",
|
|
29
33
|
"license": "ISC",
|
|
30
34
|
"dependencies": {
|
|
@@ -34,6 +38,8 @@
|
|
|
34
38
|
"chalk": "^5.3.0",
|
|
35
39
|
"chokidar": "^3.6.0",
|
|
36
40
|
"js-yaml": "^4.1.0",
|
|
41
|
+
"tiny-msgpack": "^2.2.0",
|
|
42
|
+
"uuid": "^9.0.1",
|
|
37
43
|
"vm": "^0.1.0",
|
|
38
44
|
"yargs": "^17.7.2"
|
|
39
45
|
},
|