@crowdedkingdoms/crowdyjs 8.21.1 → 9.0.0
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/MIGRATION.md +44 -0
- package/README.md +74 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/live-coding/assets/browser-authoring-index.json +1 -0
- package/dist/live-coding/assets/manifest.json +19 -0
- package/dist/live-coding/assets/tree-sitter-rust.wasm +0 -0
- package/dist/live-coding/assets/web-tree-sitter.wasm +0 -0
- package/dist/live-coding/browser-authoring-index.generated.d.ts +2 -0
- package/dist/live-coding/browser-authoring-index.generated.d.ts.map +1 -0
- package/dist/live-coding/browser-authoring-index.generated.js +5127 -0
- package/dist/live-coding/ide.d.ts +14 -7
- package/dist/live-coding/ide.d.ts.map +1 -1
- package/dist/live-coding/ide.js +296 -181
- package/dist/live-coding/index.d.ts +8 -0
- package/dist/live-coding/index.d.ts.map +1 -0
- package/dist/live-coding/index.js +7 -0
- package/dist/live-coding/lsp-protocol.d.ts +98 -0
- package/dist/live-coding/lsp-protocol.d.ts.map +1 -0
- package/dist/live-coding/lsp-protocol.js +70 -0
- package/dist/live-coding/monaco-services.d.ts +22 -0
- package/dist/live-coding/monaco-services.d.ts.map +1 -0
- package/dist/live-coding/monaco-services.js +69 -0
- package/dist/live-coding/platform-index.d.ts +29 -0
- package/dist/live-coding/platform-index.d.ts.map +1 -0
- package/dist/live-coding/platform-index.js +281 -0
- package/dist/live-coding/rust-analysis.d.ts +24 -0
- package/dist/live-coding/rust-analysis.d.ts.map +1 -0
- package/dist/live-coding/rust-analysis.js +312 -0
- package/dist/live-coding/rust-lsp-server.d.ts +43 -0
- package/dist/live-coding/rust-lsp-server.d.ts.map +1 -0
- package/dist/live-coding/rust-lsp-server.js +455 -0
- package/dist/live-coding/rust-lsp.worker.d.ts +2 -0
- package/dist/live-coding/rust-lsp.worker.d.ts.map +1 -0
- package/dist/live-coding/rust-lsp.worker.js +26 -0
- package/dist/live-coding/vfs.d.ts +41 -0
- package/dist/live-coding/vfs.d.ts.map +1 -0
- package/dist/live-coding/vfs.js +174 -0
- package/dist/live-coding/worker-transport.d.ts +60 -0
- package/dist/live-coding/worker-transport.d.ts.map +1 -0
- package/dist/live-coding/worker-transport.js +204 -0
- package/dist/player-runtime/glue-runtime.d.ts +13 -4
- package/dist/player-runtime/glue-runtime.d.ts.map +1 -1
- package/dist/player-runtime/glue-runtime.js +52 -8
- package/dist/player-runtime/glue-sab.d.ts +8 -5
- package/dist/player-runtime/glue-sab.d.ts.map +1 -1
- package/dist/player-runtime/glue-sab.js +36 -10
- package/dist/player-runtime/player-code-broker.d.ts +33 -4
- package/dist/player-runtime/player-code-broker.d.ts.map +1 -1
- package/dist/player-runtime/player-code-broker.js +332 -51
- package/dist/player-runtime/player-glue-worker.d.ts +3 -2
- package/dist/player-runtime/player-glue-worker.d.ts.map +1 -1
- package/dist/player-runtime/player-glue-worker.js +68 -32
- package/package.json +18 -6
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
* (COOP: same-origin + COEP: require-corp) in the browser; Node worker
|
|
15
15
|
* threads have them unconditionally, which is how this is integration-tested.
|
|
16
16
|
*
|
|
17
|
-
* Layout: [ state:i32, len:i32 ] header, then a byte data
|
|
17
|
+
* Layout: [ state:i32, len:i32, requestId:i32 ] header, then a byte data
|
|
18
|
+
* region. The request id prevents a host response that completed after the
|
|
19
|
+
* worker's timeout from waking a later request that reused the same SAB.
|
|
18
20
|
* state: 0 IDLE, 1 PENDING (worker waiting), 2 DONE.
|
|
19
21
|
* The request travels to the page as a normal postMessage (before the
|
|
20
22
|
* worker blocks); only the reply uses the SAB.
|
|
@@ -22,6 +24,7 @@
|
|
|
22
24
|
export declare const SAB_STATE_IDLE = 0;
|
|
23
25
|
export declare const SAB_STATE_PENDING = 1;
|
|
24
26
|
export declare const SAB_STATE_DONE = 2;
|
|
27
|
+
export declare const GLUE_HOST_CALL_TIMEOUT_MS = 5000;
|
|
25
28
|
export declare const SAB_HEADER_BYTES: number;
|
|
26
29
|
/** 1 MiB reply region — host-call replies (chunk/actor reads) are well under this. */
|
|
27
30
|
export declare const SAB_DATA_BYTES: number;
|
|
@@ -39,9 +42,9 @@ declare const decoder: TextDecoder;
|
|
|
39
42
|
* and wake the blocked worker. `respBytes` must already be the SDK Response
|
|
40
43
|
* envelope (`{ok,data}` / `{ok:false,error}`) the guest expects.
|
|
41
44
|
*/
|
|
42
|
-
export declare function writeGlueReply(view: GlueSab, respBytes: Uint8Array):
|
|
45
|
+
export declare function writeGlueReply(view: GlueSab, respBytes: Uint8Array, requestId?: number): boolean;
|
|
43
46
|
/** Convenience for responders holding a plain object result. */
|
|
44
|
-
export declare function writeGlueResult(view: GlueSab, result: unknown):
|
|
47
|
+
export declare function writeGlueResult(view: GlueSab, result: unknown, requestId?: number): boolean;
|
|
45
48
|
/**
|
|
46
49
|
* Requester side (worker): mark PENDING before posting the wake, block until
|
|
47
50
|
* the page flips the state to DONE, then read the reply bytes out. The
|
|
@@ -49,7 +52,7 @@ export declare function writeGlueResult(view: GlueSab, result: unknown): void;
|
|
|
49
52
|
* `waitAndRead()` — that ordering (post, then wait) is what lets the page
|
|
50
53
|
* see the request while the worker is blocked.
|
|
51
54
|
*/
|
|
52
|
-
export declare function armGlueRequest(view: GlueSab): void;
|
|
53
|
-
export declare function waitAndReadGlueReply(view: GlueSab, timeoutMs?: number): Uint8Array;
|
|
55
|
+
export declare function armGlueRequest(view: GlueSab, requestId: number): void;
|
|
56
|
+
export declare function waitAndReadGlueReply(view: GlueSab, requestId: number, timeoutMs?: number): Uint8Array;
|
|
54
57
|
export { encoder as glueEncoder, decoder as glueDecoder };
|
|
55
58
|
//# sourceMappingURL=glue-sab.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glue-sab.d.ts","sourceRoot":"","sources":["../../src/player-runtime/glue-sab.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"glue-sab.d.ts","sourceRoot":"","sources":["../../src/player-runtime/glue-sab.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAG9C,eAAO,MAAM,gBAAgB,QAAiB,CAAC;AAC/C,sFAAsF;AACtF,eAAO,MAAM,cAAc,QAAc,CAAC;AAE1C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,iBAAiB,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,SAAS,SAAiB,GAAG,OAAO,CAGjE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAM3D;AAED,QAAA,MAAM,OAAO,aAAoB,CAAC;AAClC,QAAA,MAAM,OAAO,aAAoB,CAAC;AAQlC;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,UAAU,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAkBT;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,OAAO,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAET;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,SAA4B,GACpC,UAAU,CAuBZ;AAED,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
* (COOP: same-origin + COEP: require-corp) in the browser; Node worker
|
|
15
15
|
* threads have them unconditionally, which is how this is integration-tested.
|
|
16
16
|
*
|
|
17
|
-
* Layout: [ state:i32, len:i32 ] header, then a byte data
|
|
17
|
+
* Layout: [ state:i32, len:i32, requestId:i32 ] header, then a byte data
|
|
18
|
+
* region. The request id prevents a host response that completed after the
|
|
19
|
+
* worker's timeout from waking a later request that reused the same SAB.
|
|
18
20
|
* state: 0 IDLE, 1 PENDING (worker waiting), 2 DONE.
|
|
19
21
|
* The request travels to the page as a normal postMessage (before the
|
|
20
22
|
* worker blocks); only the reply uses the SAB.
|
|
@@ -22,7 +24,8 @@
|
|
|
22
24
|
export const SAB_STATE_IDLE = 0;
|
|
23
25
|
export const SAB_STATE_PENDING = 1;
|
|
24
26
|
export const SAB_STATE_DONE = 2;
|
|
25
|
-
const
|
|
27
|
+
export const GLUE_HOST_CALL_TIMEOUT_MS = 5000;
|
|
28
|
+
const HEADER_I32 = 3; // state, len, request id
|
|
26
29
|
export const SAB_HEADER_BYTES = HEADER_I32 * 4;
|
|
27
30
|
/** 1 MiB reply region — host-call replies (chunk/actor reads) are well under this. */
|
|
28
31
|
export const SAB_DATA_BYTES = 1024 * 1024;
|
|
@@ -39,21 +42,34 @@ export function wrapGlueSab(sab) {
|
|
|
39
42
|
}
|
|
40
43
|
const encoder = new TextEncoder();
|
|
41
44
|
const decoder = new TextDecoder();
|
|
45
|
+
const overflowReply = encoder.encode(JSON.stringify({
|
|
46
|
+
ok: false,
|
|
47
|
+
error: { kind: 'response_too_large', message: 'host response exceeds reply limit' },
|
|
48
|
+
}));
|
|
42
49
|
/**
|
|
43
50
|
* Responder side (page/broker): write the reply envelope bytes into the SAB
|
|
44
51
|
* and wake the blocked worker. `respBytes` must already be the SDK Response
|
|
45
52
|
* envelope (`{ok,data}` / `{ok:false,error}`) the guest expects.
|
|
46
53
|
*/
|
|
47
|
-
export function writeGlueReply(view, respBytes) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
export function writeGlueReply(view, respBytes, requestId) {
|
|
55
|
+
if (requestId != null &&
|
|
56
|
+
(Atomics.load(view.header, 0) !== SAB_STATE_PENDING ||
|
|
57
|
+
Atomics.load(view.header, 2) !== requestId)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const payload = respBytes.length <= view.data.length ? respBytes : overflowReply;
|
|
61
|
+
if (payload.length > view.data.length) {
|
|
62
|
+
throw new RangeError('glue reply region cannot hold the overflow envelope');
|
|
63
|
+
}
|
|
64
|
+
view.data.set(payload);
|
|
65
|
+
Atomics.store(view.header, 1, payload.length);
|
|
51
66
|
Atomics.store(view.header, 0, SAB_STATE_DONE);
|
|
52
67
|
Atomics.notify(view.header, 0, 1);
|
|
68
|
+
return true;
|
|
53
69
|
}
|
|
54
70
|
/** Convenience for responders holding a plain object result. */
|
|
55
|
-
export function writeGlueResult(view, result) {
|
|
56
|
-
writeGlueReply(view, encoder.encode(JSON.stringify(result)));
|
|
71
|
+
export function writeGlueResult(view, result, requestId) {
|
|
72
|
+
return writeGlueReply(view, encoder.encode(JSON.stringify(result)), requestId);
|
|
57
73
|
}
|
|
58
74
|
/**
|
|
59
75
|
* Requester side (worker): mark PENDING before posting the wake, block until
|
|
@@ -62,16 +78,26 @@ export function writeGlueResult(view, result) {
|
|
|
62
78
|
* `waitAndRead()` — that ordering (post, then wait) is what lets the page
|
|
63
79
|
* see the request while the worker is blocked.
|
|
64
80
|
*/
|
|
65
|
-
export function armGlueRequest(view) {
|
|
81
|
+
export function armGlueRequest(view, requestId) {
|
|
66
82
|
Atomics.store(view.header, 1, 0);
|
|
83
|
+
Atomics.store(view.header, 2, requestId);
|
|
67
84
|
Atomics.store(view.header, 0, SAB_STATE_PENDING);
|
|
68
85
|
}
|
|
69
|
-
export function waitAndReadGlueReply(view, timeoutMs =
|
|
86
|
+
export function waitAndReadGlueReply(view, requestId, timeoutMs = GLUE_HOST_CALL_TIMEOUT_MS) {
|
|
70
87
|
const res = Atomics.wait(view.header, 0, SAB_STATE_PENDING, timeoutMs);
|
|
71
88
|
if (res === 'timed-out') {
|
|
89
|
+
Atomics.compareExchange(view.header, 0, SAB_STATE_PENDING, SAB_STATE_IDLE);
|
|
72
90
|
throw new Error('host call timed out');
|
|
73
91
|
}
|
|
92
|
+
if (Atomics.load(view.header, 2) !== requestId) {
|
|
93
|
+
Atomics.store(view.header, 0, SAB_STATE_IDLE);
|
|
94
|
+
throw new Error('host call reply id mismatch');
|
|
95
|
+
}
|
|
74
96
|
const len = Atomics.load(view.header, 1);
|
|
97
|
+
if (len < 0 || len > view.data.length) {
|
|
98
|
+
Atomics.store(view.header, 0, SAB_STATE_IDLE);
|
|
99
|
+
throw new Error('host call reply length is invalid');
|
|
100
|
+
}
|
|
75
101
|
const out = view.data.slice(0, len);
|
|
76
102
|
Atomics.store(view.header, 0, SAB_STATE_IDLE);
|
|
77
103
|
return out;
|
|
@@ -39,7 +39,10 @@ export interface PlayerCodeBrokerOptions {
|
|
|
39
39
|
* run (09 T7). Compute it from the same bytes the game-api served.
|
|
40
40
|
*/
|
|
41
41
|
artifactHash?: string;
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Informational server-authored fuel metadata. The browser does not enforce
|
|
44
|
+
* this value; metering must be injected into the platform artifact.
|
|
45
|
+
*/
|
|
43
46
|
fuelPerDispatch?: bigint;
|
|
44
47
|
onHostCall: (call: PlayerCodeHostCall) => Promise<unknown>;
|
|
45
48
|
/** Optional sink for HUD/overlay presentation the mod emits (BWF wires this). */
|
|
@@ -51,6 +54,10 @@ export interface PlayerCodeBrokerOptions {
|
|
|
51
54
|
hashArtifact?: (artifact: ArrayBuffer) => Promise<string>;
|
|
52
55
|
/** Wall-clock ms allowed per dispatch before the broker recycles the worker. */
|
|
53
56
|
dispatchWatchdogMs?: number;
|
|
57
|
+
/** Wall-clock ms allowed for worker creation + WASM instantiation. */
|
|
58
|
+
startupWatchdogMs?: number;
|
|
59
|
+
/** Wall-clock ms allowed while an async SDK host call is outstanding. */
|
|
60
|
+
hostCallTimeoutMs?: number;
|
|
54
61
|
/**
|
|
55
62
|
* Local tick cadence (ms) for a client mod: the worker self-drives `tick`
|
|
56
63
|
* at this interval. Omit/0 for invoke-only mods (no periodic tick). A HUD
|
|
@@ -81,15 +88,25 @@ export interface PlayerCodeBrokerOptions {
|
|
|
81
88
|
export declare class PlayerCodeBroker {
|
|
82
89
|
private readonly options;
|
|
83
90
|
private worker;
|
|
91
|
+
private workerListener;
|
|
92
|
+
private artifact;
|
|
84
93
|
private circuitOpen;
|
|
85
94
|
private consecutiveTraps;
|
|
95
|
+
private hardTimeouts;
|
|
86
96
|
private readonly rateBuckets;
|
|
87
|
-
private
|
|
97
|
+
private globalCallBucket;
|
|
98
|
+
private generation;
|
|
99
|
+
private lifecycleVersion;
|
|
100
|
+
private starting;
|
|
101
|
+
private workerReady;
|
|
102
|
+
private startupTimer;
|
|
103
|
+
private dispatchTimer;
|
|
104
|
+
private activeDispatch;
|
|
88
105
|
constructor(options: PlayerCodeBrokerOptions);
|
|
89
106
|
/**
|
|
90
107
|
* Start the worker on a platform-fetched artifact. Verifies the artifact
|
|
91
|
-
* hash (side-load refusal, T7) before handing bytes to the worker
|
|
92
|
-
*
|
|
108
|
+
* hash (side-load refusal, T7) before handing bytes to the worker. A retained
|
|
109
|
+
* copy allows the page-side hard watchdog to replace a wedged worker.
|
|
93
110
|
*/
|
|
94
111
|
start(artifact: ArrayBuffer): Promise<void>;
|
|
95
112
|
/** Terminate + respawn on a fresh artifact — the client hot-reload path. */
|
|
@@ -108,6 +125,18 @@ export declare class PlayerCodeBroker {
|
|
|
108
125
|
* the browser; the postMessage is harmless there.
|
|
109
126
|
*/
|
|
110
127
|
private reply;
|
|
128
|
+
private spawnWorker;
|
|
129
|
+
private stopWorker;
|
|
130
|
+
private armStartupTimer;
|
|
131
|
+
private clearStartupTimer;
|
|
132
|
+
private armDispatchTimer;
|
|
133
|
+
private armHostCallTimer;
|
|
134
|
+
private resumeDispatchWatchdog;
|
|
135
|
+
private finishDispatch;
|
|
136
|
+
private clearDispatchTimer;
|
|
137
|
+
private recycleWorker;
|
|
138
|
+
private openCircuit;
|
|
139
|
+
private enforceGlobalRate;
|
|
111
140
|
private enforceRate;
|
|
112
141
|
private recordTrap;
|
|
113
142
|
private assertGridScope;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player-code-broker.d.ts","sourceRoot":"","sources":["../../src/player-runtime/player-code-broker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"player-code-broker.d.ts","sourceRoot":"","sources":["../../src/player-runtime/player-code-broker.ts"],"names":[],"mappings":"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"}
|