@mikrojs/native 0.0.7 → 0.2.0-pr-14.20260426233358
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/README.md +1 -1
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/include/mikrojs/mikrojs.h +9 -0
- package/include/mikrojs/private.h +8 -0
- package/package.json +3 -3
- package/prebuilds/darwin-arm64/mikrojs.napi.node +0 -0
- package/prebuilds/linux-arm64/mikrojs.napi.node +0 -0
- package/prebuilds/linux-x64/mikrojs.napi.node +0 -0
- package/runtime/globals.d.ts +5 -1
- package/runtime/http/helpers.ts +3 -20
- package/scripts/compare-minifiers.js +1 -1
- package/src/mik_console.cpp +8 -0
- package/src/mik_inspect.cpp +2 -2
- package/src/mikrojs.cpp +5 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @mikrojs/native
|
|
2
2
|
|
|
3
|
-
Standalone, platform-independent C++ runtime library for
|
|
3
|
+
Standalone, platform-independent C++ runtime library for Mikro.js, powered by QuickJS-NG. Zero ESP-IDF dependencies. Runs on any POSIX host for development and testing, and on ESP32 via a thin platform adapter.
|
|
4
4
|
|
|
5
5
|
## Directory structure
|
|
6
6
|
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,11 @@ export declare class MikroRuntime {
|
|
|
7
7
|
evalModuleContent(filename: string, content: string): void;
|
|
8
8
|
/** Evaluate a script (not module) and return the stringified result. Returns undefined if the result is undefined/null. */
|
|
9
9
|
evalScript(code: string): string | undefined;
|
|
10
|
+
/** Evaluate a script as the REPL would: inspect the result (so objects
|
|
11
|
+
* render as `{...}` instead of `[object Object]`) and stash the value
|
|
12
|
+
* as `globalThis._` for follow-up expressions. Mirrors the firmware
|
|
13
|
+
* REPL's eval path. Returns undefined for `undefined` results. */
|
|
14
|
+
evalForRepl(code: string, depth?: number): string | undefined;
|
|
10
15
|
loop(): Promise<void>;
|
|
11
16
|
/** Run one iteration of the event loop synchronously. Returns 0 on success. */
|
|
12
17
|
loopOnce(): number;
|
|
@@ -41,6 +46,21 @@ export declare class MikroRuntime {
|
|
|
41
46
|
* This is the cost of the runtime + context + built-in prototypes, before
|
|
42
47
|
* any user modules are loaded. */
|
|
43
48
|
getProfileBaseline(): number;
|
|
49
|
+
/** Snapshot the QuickJS heap. Mirrors the firmware's `/mem` directive
|
|
50
|
+
* which calls JS_ComputeMemoryUsage directly. `heapTotal` is
|
|
51
|
+
* `malloc_limit` (or 0 if no limit is set). */
|
|
52
|
+
memoryUsage(): {
|
|
53
|
+
heapUsed: number;
|
|
54
|
+
heapTotal: number;
|
|
55
|
+
};
|
|
56
|
+
/** Trigger QuickJS garbage collection. Mirrors the firmware's `/gc`
|
|
57
|
+
* directive (JS_RunGC on the underlying JSRuntime). */
|
|
58
|
+
gc(): void;
|
|
59
|
+
/** Install the test-helper globals (`__testEmit`, `__testFileDone`) on
|
|
60
|
+
* this runtime. Opt-in so ordinary dev/REPL runs don't carry them.
|
|
61
|
+
* Mirrors `MIK_EnableTestHelpers` — call it per test-file the same way
|
|
62
|
+
* the firmware supervisor does. */
|
|
63
|
+
enableTestHelpers(): void;
|
|
44
64
|
}
|
|
45
65
|
/** Serialize a JSON string to QuickJS binary JSON (bjson) format. */
|
|
46
66
|
export declare function jsonToBjson(json: string): Buffer;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../addon/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EAGnB,YAAY,EACb,MAAM,YAAY,CAAA;AAuBnB,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,OAAO,CAAC,EAAE,mBAAmB;IAIzC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,IAAI;IAIjD,kFAAkF;IAClF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI1D,2HAA2H;IAC3H,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI5C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,+EAA+E;IAC/E,QAAQ,IAAI,MAAM;IAIlB,IAAI,IAAI,IAAI;IAIZ,OAAO,IAAI,IAAI;IAIf;;oEAEgE;IAChE,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxD;mEAC+D;IAC/D,aAAa,IAAI,WAAW,EAAE;IAI9B;kFAC8E;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7C;;+DAE2D;IAC3D,eAAe,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI;IAInF;;uFAEmF;IACnF,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAI5F;;sFAEkF;IAClF,eAAe,IAAI,IAAI;IAIvB;yDACqD;IACrD,UAAU,IAAI,YAAY,EAAE;IAI5B;;sCAEkC;IAClC,kBAAkB,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../addon/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EAGnB,YAAY,EACb,MAAM,YAAY,CAAA;AAuBnB,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,OAAO,CAAC,EAAE,mBAAmB;IAIzC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,IAAI;IAIjD,kFAAkF;IAClF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI1D,2HAA2H;IAC3H,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI5C;;;uEAGmE;IACnE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,GAAG,SAAS;IAIxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,+EAA+E;IAC/E,QAAQ,IAAI,MAAM;IAIlB,IAAI,IAAI,IAAI;IAIZ,OAAO,IAAI,IAAI;IAIf;;oEAEgE;IAChE,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxD;mEAC+D;IAC/D,aAAa,IAAI,WAAW,EAAE;IAI9B;kFAC8E;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7C;;+DAE2D;IAC3D,eAAe,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI;IAInF;;uFAEmF;IACnF,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAI5F;;sFAEkF;IAClF,eAAe,IAAI,IAAI;IAIvB;yDACqD;IACrD,UAAU,IAAI,YAAY,EAAE;IAI5B;;sCAEkC;IAClC,kBAAkB,IAAI,MAAM;IAI5B;;oDAEgD;IAChD,WAAW,IAAI;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC;IAIpD;4DACwD;IACxD,EAAE,IAAI,IAAI;IAIV;;;wCAGoC;IACpC,iBAAiB,IAAI,IAAI;CAG1B;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAEhG;AAED,wGAAwG;AACxG,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,MAAM,CA4BR;AAED,YAAY,EAAC,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAC,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -36,6 +36,13 @@ export class MikroRuntime {
|
|
|
36
36
|
evalScript(code) {
|
|
37
37
|
return this.native.evalScript(code);
|
|
38
38
|
}
|
|
39
|
+
/** Evaluate a script as the REPL would: inspect the result (so objects
|
|
40
|
+
* render as `{...}` instead of `[object Object]`) and stash the value
|
|
41
|
+
* as `globalThis._` for follow-up expressions. Mirrors the firmware
|
|
42
|
+
* REPL's eval path. Returns undefined for `undefined` results. */
|
|
43
|
+
evalForRepl(code, depth = 2) {
|
|
44
|
+
return this.native.evalForRepl(code, depth);
|
|
45
|
+
}
|
|
39
46
|
loop() {
|
|
40
47
|
return this.native.loop();
|
|
41
48
|
}
|
|
@@ -94,6 +101,24 @@ export class MikroRuntime {
|
|
|
94
101
|
getProfileBaseline() {
|
|
95
102
|
return this.native.getProfileBaseline();
|
|
96
103
|
}
|
|
104
|
+
/** Snapshot the QuickJS heap. Mirrors the firmware's `/mem` directive
|
|
105
|
+
* which calls JS_ComputeMemoryUsage directly. `heapTotal` is
|
|
106
|
+
* `malloc_limit` (or 0 if no limit is set). */
|
|
107
|
+
memoryUsage() {
|
|
108
|
+
return this.native.memoryUsage();
|
|
109
|
+
}
|
|
110
|
+
/** Trigger QuickJS garbage collection. Mirrors the firmware's `/gc`
|
|
111
|
+
* directive (JS_RunGC on the underlying JSRuntime). */
|
|
112
|
+
gc() {
|
|
113
|
+
this.native.gc();
|
|
114
|
+
}
|
|
115
|
+
/** Install the test-helper globals (`__testEmit`, `__testFileDone`) on
|
|
116
|
+
* this runtime. Opt-in so ordinary dev/REPL runs don't carry them.
|
|
117
|
+
* Mirrors `MIK_EnableTestHelpers` — call it per test-file the same way
|
|
118
|
+
* the firmware supervisor does. */
|
|
119
|
+
enableTestHelpers() {
|
|
120
|
+
this.native.enableTestHelpers();
|
|
121
|
+
}
|
|
97
122
|
}
|
|
98
123
|
/** Serialize a JSON string to QuickJS binary JSON (bjson) format. */
|
|
99
124
|
export function jsonToBjson(json) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../addon/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../addon/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -34,6 +34,13 @@ export interface NativeMikroRuntime {
|
|
|
34
34
|
enableProfiling(): void;
|
|
35
35
|
getProfile(): ProfileEntry[];
|
|
36
36
|
getProfileBaseline(): number;
|
|
37
|
+
memoryUsage(): {
|
|
38
|
+
heapUsed: number;
|
|
39
|
+
heapTotal: number;
|
|
40
|
+
};
|
|
41
|
+
gc(): void;
|
|
42
|
+
enableTestHelpers(): void;
|
|
43
|
+
evalForRepl(code: string, depth?: number): string | undefined;
|
|
37
44
|
}
|
|
38
45
|
export interface NativeBindings {
|
|
39
46
|
MikroRuntime: new (options?: MikroRuntimeOptions) => NativeMikroRuntime;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../addon/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACpD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC5C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,QAAQ,IAAI,MAAM,CAAA;IAClB,IAAI,IAAI,IAAI,CAAA;IACZ,OAAO,IAAI,IAAI,CAAA;IACf,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACxD,aAAa,IAAI,WAAW,EAAE,CAAA;IAC9B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,eAAe,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IACnF,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;IAC5F,eAAe,IAAI,IAAI,CAAA;IACvB,UAAU,IAAI,YAAY,EAAE,CAAA;IAC5B,kBAAkB,IAAI,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../addon/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACpD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC5C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,QAAQ,IAAI,MAAM,CAAA;IAClB,IAAI,IAAI,IAAI,CAAA;IACZ,OAAO,IAAI,IAAI,CAAA;IACf,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACxD,aAAa,IAAI,WAAW,EAAE,CAAA;IAC9B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,eAAe,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IACnF,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;IAC5F,eAAe,IAAI,IAAI,CAAA;IACvB,UAAU,IAAI,YAAY,EAAE,CAAA;IAC5B,kBAAkB,IAAI,MAAM,CAAA;IAC5B,WAAW,IAAI;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,CAAA;IACpD,EAAE,IAAI,IAAI,CAAA;IACV,iBAAiB,IAAI,IAAI,CAAA;IACzB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAC9D;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,KAAK,OAAO,CAAC,EAAE,mBAAmB,KAAK,kBAAkB,CAAA;IACvE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACjC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;CAClF"}
|
|
@@ -115,6 +115,15 @@ void MIK_SetPreprocessor(MIKRuntime* mik_rt, MIKPreprocessFn fn, void* opaque);
|
|
|
115
115
|
* the mikrojs/test built-in falls back to a console.log path when absent. */
|
|
116
116
|
void MIK_EnableTestHelpers(MIKRuntime* mik_rt);
|
|
117
117
|
|
|
118
|
+
/* Optional handler called by __testEmit when the runtime is NOT in protocol
|
|
119
|
+
* mode (i.e. the firmware UART/USJ wire path is inactive). The handler
|
|
120
|
+
* receives the JSON event payload and is responsible for routing it to
|
|
121
|
+
* whatever channel the host expects. Used by the Node addon to forward
|
|
122
|
+
* MSG_TEST events to the host bridge so `mikro sim test` can deliver them
|
|
123
|
+
* over its own transport without going through the wire protocol. */
|
|
124
|
+
typedef void (*MIKTestEmitHandlerFn)(const char* json, size_t len, void* opaque);
|
|
125
|
+
void MIK_SetTestEmitHandler(MIKRuntime* mik_rt, MIKTestEmitHandlerFn fn, void* opaque);
|
|
126
|
+
|
|
118
127
|
/* Memory profiling — records per-module QuickJS heap growth. Storage lives
|
|
119
128
|
* outside the tracked runtime heap so instrumentation does not pollute the
|
|
120
129
|
* numbers being measured. Enable before loading user code; read entries at
|
|
@@ -135,6 +135,14 @@ struct MIKRuntime {
|
|
|
135
135
|
bool oom_flagged = false;
|
|
136
136
|
MIKOOMHandlerFn oom_handler_fn = nullptr;
|
|
137
137
|
void* oom_handler_opaque = nullptr;
|
|
138
|
+
/* Optional handler for __testEmit when not running in protocol mode.
|
|
139
|
+
* The firmware uses protocol mode + mik__repl_proto_send_output to
|
|
140
|
+
* deliver MSG_TEST frames; the Node addon registers a handler here
|
|
141
|
+
* that pushes the same payload onto the host bridge so vitest-style
|
|
142
|
+
* test runners (mikro sim test) can receive events without going
|
|
143
|
+
* through the wire protocol. NULL means __testEmit is a no-op. */
|
|
144
|
+
void (*test_emit_fn)(const char* json, size_t len, void* opaque) = nullptr;
|
|
145
|
+
void* test_emit_opaque = nullptr;
|
|
138
146
|
};
|
|
139
147
|
|
|
140
148
|
void mik__pub_fs_register(JSContext* ctx);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikrojs/native",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.2.0-pr-14.20260426233358+07b444f",
|
|
4
4
|
"description": "Mikro.js C++ runtime library and Node.js native addon",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"esp32",
|
|
@@ -75,11 +75,11 @@
|
|
|
75
75
|
"cmake-js": "^8.0.0",
|
|
76
76
|
"node-addon-api": "^8.7.0",
|
|
77
77
|
"node-gyp-build": "^4.8.4",
|
|
78
|
-
"@mikrojs/quickjs": "0.0.
|
|
78
|
+
"@mikrojs/quickjs": "0.2.0-pr-14.20260426233358+07b444f"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@swc/core": "^1.15.30",
|
|
82
|
-
"@types/node": "^
|
|
82
|
+
"@types/node": "^24.12.2",
|
|
83
83
|
"esbuild": "^0.28.0",
|
|
84
84
|
"terser": "^5.46.2"
|
|
85
85
|
},
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/runtime/globals.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ declare class TextEncoder {
|
|
|
23
23
|
|
|
24
24
|
declare class TextDecoder {
|
|
25
25
|
constructor(label?: 'utf-8' | 'utf8')
|
|
26
|
-
decode(input?:
|
|
26
|
+
decode(input?: Uint8Array, options?: {stream?: boolean}): string
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
declare class AbortError extends Error {
|
|
@@ -53,6 +53,10 @@ declare class AbortController {
|
|
|
53
53
|
abort(reason?: unknown): void
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
declare interface JSON {
|
|
57
|
+
parse(text: string, reviver?: (this: any, key: string, value: any) => any): unknown
|
|
58
|
+
}
|
|
59
|
+
|
|
56
60
|
declare interface ImportMeta {
|
|
57
61
|
readonly url: string
|
|
58
62
|
readonly main: boolean
|
package/runtime/http/helpers.ts
CHANGED
|
@@ -9,9 +9,7 @@ export interface RequestOptions {
|
|
|
9
9
|
method?: string
|
|
10
10
|
/** Headers as pairs or a record. Keys used as-is (no implicit case change). */
|
|
11
11
|
headers?: [string, string][] | Record<string, string>
|
|
12
|
-
/**
|
|
13
|
-
json?: unknown
|
|
14
|
-
/** Raw body. Mutually exclusive with `json`. */
|
|
12
|
+
/** Raw body. */
|
|
15
13
|
body?: Uint8Array | string
|
|
16
14
|
/** Total wallclock deadline; transport enforces. */
|
|
17
15
|
timeoutMs?: number
|
|
@@ -87,21 +85,14 @@ const textEncoder = new TextEncoder()
|
|
|
87
85
|
|
|
88
86
|
/**
|
|
89
87
|
* Normalize `RequestOptions` into the byte-oriented shape a transport actually
|
|
90
|
-
* sends: final body bytes (or null) and header pairs.
|
|
91
|
-
*
|
|
92
|
-
* UTF-8-encodes string bodies.
|
|
88
|
+
* sends: final body bytes (or null) and header pairs. UTF-8-encodes string
|
|
89
|
+
* bodies.
|
|
93
90
|
*/
|
|
94
91
|
export function prepareBody(opts: RequestOptions): {
|
|
95
92
|
body: Uint8Array | null
|
|
96
93
|
headers: [string, string][]
|
|
97
94
|
} {
|
|
98
95
|
const headers = normalizeHeaders(opts.headers)
|
|
99
|
-
if (opts.json !== undefined) {
|
|
100
|
-
if (!hasHeader(headers, 'content-type')) {
|
|
101
|
-
headers.push(['content-type', 'application/json'])
|
|
102
|
-
}
|
|
103
|
-
return {body: textEncoder.encode(JSON.stringify(opts.json)), headers}
|
|
104
|
-
}
|
|
105
96
|
if (opts.body === undefined) return {body: null, headers}
|
|
106
97
|
if (typeof opts.body === 'string') return {body: textEncoder.encode(opts.body), headers}
|
|
107
98
|
return {body: opts.body, headers}
|
|
@@ -186,14 +177,6 @@ function normalizeHeaders(
|
|
|
186
177
|
return out
|
|
187
178
|
}
|
|
188
179
|
|
|
189
|
-
function hasHeader(headers: [string, string][], name: string): boolean {
|
|
190
|
-
const lower = name.toLowerCase()
|
|
191
|
-
for (const [k] of headers) {
|
|
192
|
-
if (k.toLowerCase() === lower) return true
|
|
193
|
-
}
|
|
194
|
-
return false
|
|
195
|
-
}
|
|
196
|
-
|
|
197
180
|
async function drain(source: AsyncIterable<Uint8Array>): Promise<Uint8Array> {
|
|
198
181
|
const parts: Uint8Array[] = []
|
|
199
182
|
let total = 0
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import {execSync} from 'node:child_process'
|
|
14
|
-
import {existsSync, mkdirSync,
|
|
14
|
+
import {existsSync, mkdirSync, rmSync, writeFileSync} from 'node:fs'
|
|
15
15
|
import {join} from 'node:path'
|
|
16
16
|
import {fileURLToPath} from 'node:url'
|
|
17
17
|
|
package/src/mik_console.cpp
CHANGED
|
@@ -376,6 +376,14 @@ static JSValue mik__test_emit(JSContext* ctx, JSValue /*this_val*/, int argc, JS
|
|
|
376
376
|
if (!str) return JS_EXCEPTION;
|
|
377
377
|
if (mik__repl_is_protocol_mode()) {
|
|
378
378
|
mik__repl_proto_send_output(MIK_MSG_TEST, str, len);
|
|
379
|
+
} else {
|
|
380
|
+
/* Non-protocol mode (e.g. Node addon for the simulator): if the host
|
|
381
|
+
* registered a handler via MIK_SetTestEmitHandler, route the payload
|
|
382
|
+
* there. Without a handler, this is a no-op — same as before. */
|
|
383
|
+
MIKRuntime* mik_rt = MIK_GetRuntime(ctx);
|
|
384
|
+
if (mik_rt && mik_rt->test_emit_fn) {
|
|
385
|
+
mik_rt->test_emit_fn(str, len, mik_rt->test_emit_opaque);
|
|
386
|
+
}
|
|
379
387
|
}
|
|
380
388
|
JS_FreeCString(ctx, str);
|
|
381
389
|
return JS_UNDEFINED;
|
package/src/mik_inspect.cpp
CHANGED
|
@@ -309,8 +309,8 @@ static std::string inspect_number(JSContext* ctx, JSValue value, InspectOpts& op
|
|
|
309
309
|
if (std::isnan(d)) return stylize("NaN", MIK_TOKEN_NUMBER, opts);
|
|
310
310
|
if (d == INFINITY) return stylize("Infinity", MIK_TOKEN_NUMBER, opts);
|
|
311
311
|
if (d == -INFINITY) return stylize("-Infinity", MIK_TOKEN_NUMBER, opts);
|
|
312
|
-
if (d == 0.0) {
|
|
313
|
-
return stylize(
|
|
312
|
+
if (d == 0.0 && std::signbit(d)) {
|
|
313
|
+
return stylize("-0", MIK_TOKEN_NUMBER, opts);
|
|
314
314
|
}
|
|
315
315
|
|
|
316
316
|
/* Use JS_ToCString which formats numbers correctly (integer or float) */
|
package/src/mikrojs.cpp
CHANGED
|
@@ -438,6 +438,11 @@ void MIK_SetErrorHandler(MIKRuntime* mik_rt, MIKErrorHandlerFn fn, void* opaque)
|
|
|
438
438
|
mik_rt->error_handler_opaque = opaque;
|
|
439
439
|
}
|
|
440
440
|
|
|
441
|
+
void MIK_SetTestEmitHandler(MIKRuntime* mik_rt, MIKTestEmitHandlerFn fn, void* opaque) {
|
|
442
|
+
mik_rt->test_emit_fn = fn;
|
|
443
|
+
mik_rt->test_emit_opaque = opaque;
|
|
444
|
+
}
|
|
445
|
+
|
|
441
446
|
void MIK_RegisterNativeModuleInit(MIKRuntime* mik_rt, const char* name,
|
|
442
447
|
MIKNativeModuleInitFn init_fn) {
|
|
443
448
|
mik_rt->native_modules.push_back({name, init_fn});
|