@flyingrobots/bijou-node 7.1.0 → 8.0.0-rc.1

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.
Files changed (110) hide show
  1. package/dist/chalk-token-styler.d.ts +4 -0
  2. package/dist/chalk-token-styler.d.ts.map +1 -0
  3. package/dist/chalk-token-styler.js +79 -0
  4. package/dist/chalk-token-styler.js.map +1 -0
  5. package/dist/gifenc-runtime.d.ts +5 -0
  6. package/dist/gifenc-runtime.d.ts.map +1 -0
  7. package/dist/gifenc-runtime.js +30 -0
  8. package/dist/gifenc-runtime.js.map +1 -0
  9. package/dist/index.d.ts +7 -56
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +22 -117
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.test-support.d.ts +11 -0
  14. package/dist/index.test-support.d.ts.map +1 -0
  15. package/dist/index.test-support.js +9 -0
  16. package/dist/index.test-support.js.map +1 -0
  17. package/dist/index.test-support.part01.d.ts +28 -0
  18. package/dist/index.test-support.part01.d.ts.map +1 -0
  19. package/dist/index.test-support.part01.js +89 -0
  20. package/dist/index.test-support.part01.js.map +1 -0
  21. package/dist/index.test-support.part02.d.ts +5 -0
  22. package/dist/index.test-support.part02.d.ts.map +1 -0
  23. package/dist/index.test-support.part02.js +63 -0
  24. package/dist/index.test-support.part02.js.map +1 -0
  25. package/dist/io-types.d.ts +26 -0
  26. package/dist/io-types.d.ts.map +1 -0
  27. package/dist/io-types.js +2 -0
  28. package/dist/io-types.js.map +1 -0
  29. package/dist/io.d.ts +3 -18
  30. package/dist/io.d.ts.map +1 -1
  31. package/dist/io.js +10 -17
  32. package/dist/io.js.map +1 -1
  33. package/dist/io.test-support.d.ts +5 -0
  34. package/dist/io.test-support.d.ts.map +1 -0
  35. package/dist/io.test-support.js +13 -0
  36. package/dist/io.test-support.js.map +1 -0
  37. package/dist/node-context-selection.d.ts +11 -0
  38. package/dist/node-context-selection.d.ts.map +1 -0
  39. package/dist/node-context-selection.js +77 -0
  40. package/dist/node-context-selection.js.map +1 -0
  41. package/dist/node-context.d.ts +14 -0
  42. package/dist/node-context.d.ts.map +1 -0
  43. package/dist/node-context.js +30 -0
  44. package/dist/node-context.js.map +1 -0
  45. package/dist/oled-font.d.ts +8 -0
  46. package/dist/oled-font.d.ts.map +1 -0
  47. package/dist/oled-font.js +28 -0
  48. package/dist/oled-font.js.map +1 -0
  49. package/dist/options.d.ts +48 -0
  50. package/dist/options.d.ts.map +1 -0
  51. package/dist/options.js +2 -0
  52. package/dist/options.js.map +1 -0
  53. package/dist/readline-output.d.ts +3 -0
  54. package/dist/readline-output.d.ts.map +1 -0
  55. package/dist/readline-output.js +20 -0
  56. package/dist/readline-output.js.map +1 -0
  57. package/dist/recorder.d.ts +2 -40
  58. package/dist/recorder.d.ts.map +1 -1
  59. package/dist/recorder.js +1 -240
  60. package/dist/recorder.js.map +1 -1
  61. package/dist/recorder.part01.d.ts +56 -0
  62. package/dist/recorder.part01.d.ts.map +1 -0
  63. package/dist/recorder.part01.js +76 -0
  64. package/dist/recorder.part01.js.map +1 -0
  65. package/dist/recorder.part02.d.ts +5 -0
  66. package/dist/recorder.part02.d.ts.map +1 -0
  67. package/dist/recorder.part02.js +54 -0
  68. package/dist/recorder.part02.js.map +1 -0
  69. package/dist/recorder.part03.d.ts +6 -0
  70. package/dist/recorder.part03.d.ts.map +1 -0
  71. package/dist/recorder.part03.js +118 -0
  72. package/dist/recorder.part03.js.map +1 -0
  73. package/dist/runtime.d.ts.map +1 -1
  74. package/dist/runtime.js +10 -4
  75. package/dist/runtime.js.map +1 -1
  76. package/dist/style.d.ts +1 -8
  77. package/dist/style.d.ts.map +1 -1
  78. package/dist/style.js +10 -98
  79. package/dist/style.js.map +1 -1
  80. package/dist/worker/fixtures/echo-worker.js +7 -6
  81. package/dist/worker/fixtures/echo-worker.js.map +1 -1
  82. package/dist/worker/worker-data.d.ts +25 -0
  83. package/dist/worker/worker-data.d.ts.map +1 -0
  84. package/dist/worker/worker-data.js +44 -0
  85. package/dist/worker/worker-data.js.map +1 -0
  86. package/dist/worker/worker-mouse-mode.d.ts +10 -0
  87. package/dist/worker/worker-mouse-mode.d.ts.map +1 -0
  88. package/dist/worker/worker-mouse-mode.js +14 -0
  89. package/dist/worker/worker-mouse-mode.js.map +1 -0
  90. package/dist/worker/worker-options.d.ts +33 -0
  91. package/dist/worker/worker-options.d.ts.map +1 -0
  92. package/dist/worker/worker-options.js +2 -0
  93. package/dist/worker/worker-options.js.map +1 -0
  94. package/dist/worker/worker.d.ts +5 -106
  95. package/dist/worker/worker.d.ts.map +1 -1
  96. package/dist/worker/worker.js +3 -228
  97. package/dist/worker/worker.js.map +1 -1
  98. package/dist/worker/worker.part01.d.ts +59 -0
  99. package/dist/worker/worker.part01.d.ts.map +1 -0
  100. package/dist/worker/worker.part01.js +40 -0
  101. package/dist/worker/worker.part01.js.map +1 -0
  102. package/dist/worker/worker.part02.d.ts +12 -0
  103. package/dist/worker/worker.part02.d.ts.map +1 -0
  104. package/dist/worker/worker.part02.js +121 -0
  105. package/dist/worker/worker.part02.js.map +1 -0
  106. package/dist/worker/worker.part03.d.ts +13 -0
  107. package/dist/worker/worker.part03.d.ts.map +1 -0
  108. package/dist/worker/worker.part03.js +106 -0
  109. package/dist/worker/worker.part03.js.map +1 -0
  110. package/package.json +3 -3
@@ -1,107 +1,6 @@
1
- import { type BijouContext } from '@flyingrobots/bijou';
2
- import type { App, RunOptions } from '@flyingrobots/bijou-tui';
3
- interface WorkerInstance {
4
- postMessage(message: unknown): void;
5
- on(event: string, handler: (value: any) => void): void;
6
- terminate(): Promise<number>;
7
- }
8
- interface WorkerParentPort {
9
- on(event: string, listener: (msg: any) => void): void;
10
- off(event: string, listener: (msg: any) => void): void;
11
- postMessage(message: unknown): void;
12
- }
13
- interface WorkerThreadBindings {
14
- isMainThread: boolean;
15
- parentPort: WorkerParentPort | null;
16
- workerData: unknown;
17
- createWorker(entry: string, options: Record<string, unknown>): WorkerInstance;
18
- createNodeContext(): BijouContext;
19
- runApp<Model, M>(app: App<Model, M>, options: RunOptions<M>): Promise<void>;
20
- scheduleTimeout(callback: () => void, ms: number): ReturnType<typeof setTimeout>;
21
- }
22
- export type WorkerMessage = {
23
- type: 'io:data';
24
- data: string;
25
- } | {
26
- type: 'io:resize';
27
- columns: number;
28
- rows: number;
29
- } | {
30
- type: 'data';
31
- payload: unknown;
32
- } | {
33
- type: 'quit';
34
- };
35
- export type MainMessage = {
36
- type: 'render:frame';
37
- output: string;
38
- } | {
39
- type: 'error';
40
- message: string;
41
- } | {
42
- type: 'data';
43
- payload: unknown;
44
- } | {
45
- type: 'quit';
46
- };
47
- /**
48
- * Checks if the current environment is running inside a Bijou Worker.
49
- */
50
- export declare function isBijouWorker(): boolean;
51
- /**
52
- * Sends a custom data message from the worker to the main thread.
53
- * This will be received via the `onMessage` callback in `runInWorker`.
54
- */
55
- export declare function sendToMain(payload: unknown): void;
56
- /**
57
- * Options for starting an app in a background worker.
58
- */
59
- export interface RunWorkerOptions {
60
- /** The absolute path to the file containing the worker entry point. */
61
- entry: string;
62
- /** Optional Bijou context for the host thread. */
63
- ctx?: BijouContext;
64
- /** Enter the alternate screen buffer on startup. */
65
- altScreen?: boolean;
66
- /** Hide the cursor on startup. */
67
- hideCursor?: boolean;
68
- /** Enable mouse input (SGR mode). */
69
- mouse?: boolean;
70
- /** Optional BCSS stylesheet string. */
71
- css?: string;
72
- /** Optional callback for custom data messages sent from the worker via `sendToMain`. */
73
- onMessage?: (payload: unknown) => void;
74
- /** Optional arguments passed to the Node.js worker process (e.g. ['--import', 'tsx']). */
75
- execArgv?: string[];
76
- }
77
- /**
78
- * Handle for a running background worker.
79
- */
80
- export interface WorkerHandle {
81
- /** Sends a custom data message to the worker thread. */
82
- send(payload: unknown): void;
83
- /** Forcefully terminates the worker thread. */
84
- terminate(): Promise<void>;
85
- /** A promise that resolves when the worker exits cleanly. */
86
- onExit: Promise<void>;
87
- }
88
- /**
89
- * Spawns a background worker thread to run the TEA application.
90
- * The main thread delegates all logic to the worker, only handling raw I/O
91
- * and frame rendering (to keep the TTY responsive).
92
- *
93
- * @param options - Configuration including the path to the worker entry file.
94
- * @returns A handle to the running worker.
95
- */
96
- export declare function runInWorker(options: RunWorkerOptions, bindings?: WorkerThreadBindings): WorkerHandle;
97
- /**
98
- * The entry point for the worker thread. Must be called in the file
99
- * specified by `options.entry` in `runInWorker()`.
100
- *
101
- * Intercepts the normal `run()` execution, redirecting I/O to the parent port.
102
- *
103
- * @param app - The TEA app to run.
104
- */
105
- export declare function startWorkerApp<Model, M>(app: App<Model, M>, bindings?: WorkerThreadBindings): Promise<void>;
106
- export {};
1
+ export type { RunWorkerOptions, WorkerHandle } from './worker-options.js';
2
+ export type { WorkerMessage, MainMessage } from './worker.part01.js';
3
+ export { isBijouWorker, sendToMain } from './worker.part01.js';
4
+ export { runInWorker } from './worker.part02.js';
5
+ export { startWorkerApp } from './worker.part03.js';
107
6
  //# sourceMappingURL=worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,229 +1,4 @@
1
- import { Worker, isMainThread, parentPort, workerData } from 'node:worker_threads';
2
- import { resolve as resolvePath } from 'node:path';
3
- import { installRuntimeViewportOverlay, readRuntimeViewport, updateRuntimeViewport, } from '@flyingrobots/bijou';
4
- import { run } from '@flyingrobots/bijou-tui';
5
- import { createNodeContext } from '../index.js';
6
- function defaultWorkerThreadBindings() {
7
- return {
8
- isMainThread,
9
- parentPort,
10
- workerData,
11
- createWorker(entry, options) {
12
- return new Worker(entry, options);
13
- },
14
- createNodeContext,
15
- runApp: run,
16
- scheduleTimeout(callback, ms) {
17
- return setTimeout(callback, ms);
18
- },
19
- };
20
- }
21
- // ---------------------------------------------------------------------------
22
- // Worker Environment API
23
- // ---------------------------------------------------------------------------
24
- /**
25
- * Checks if the current environment is running inside a Bijou Worker.
26
- */
27
- export function isBijouWorker() {
28
- const bindings = defaultWorkerThreadBindings();
29
- return !bindings.isMainThread && bindings.workerData?.isBijouWorker === true;
30
- }
31
- /**
32
- * Sends a custom data message from the worker to the main thread.
33
- * This will be received via the `onMessage` callback in `runInWorker`.
34
- */
35
- export function sendToMain(payload) {
36
- const bindings = defaultWorkerThreadBindings();
37
- if (bindings.parentPort) {
38
- bindings.parentPort.postMessage({ type: 'data', payload });
39
- }
40
- }
41
- /**
42
- * Spawns a background worker thread to run the TEA application.
43
- * The main thread delegates all logic to the worker, only handling raw I/O
44
- * and frame rendering (to keep the TTY responsive).
45
- *
46
- * @param options - Configuration including the path to the worker entry file.
47
- * @returns A handle to the running worker.
48
- */
49
- export function runInWorker(options, bindings = defaultWorkerThreadBindings()) {
50
- if (!bindings.isMainThread) {
51
- throw new Error('runInWorker must be called from the main thread.');
52
- }
53
- const ctx = options.ctx ?? bindings.createNodeContext();
54
- installRuntimeViewportOverlay(ctx);
55
- const useAltScreen = options.altScreen ?? true;
56
- const useHideCursor = options.hideCursor ?? true;
57
- const useMouse = options.mouse ?? false;
58
- // Setup main thread screen
59
- if (useAltScreen || useHideCursor) {
60
- ctx.io.write('\x1b[?1049h'); // ENTER_ALT_SCREEN
61
- if (useHideCursor)
62
- ctx.io.write('\x1b[?25l'); // HIDE_CURSOR
63
- }
64
- if (useMouse) {
65
- ctx.io.write('\x1b[?1000h\x1b[?1002h\x1b[?1006h'); // ENABLE_MOUSE
66
- }
67
- // Spawn the worker with structured-clone-safe options only.
68
- const serializableOptions = {
69
- altScreen: options.altScreen,
70
- hideCursor: options.hideCursor,
71
- mouse: options.mouse,
72
- css: options.css,
73
- };
74
- const worker = bindings.createWorker(resolvePath(options.entry), {
75
- workerData: {
76
- isBijouWorker: true,
77
- options: serializableOptions,
78
- runtime: readRuntimeViewport(ctx.runtime),
79
- },
80
- execArgv: options.execArgv,
81
- // Pipe stdout/stderr so we can capture logs if needed, but primarily use IPC
82
- });
83
- // 1. Pipe Main Stdin -> Worker IPC
84
- const inputHandle = ctx.io.rawInput((data) => {
85
- worker.postMessage({ type: 'io:data', data });
86
- });
87
- const resizeHandle = ctx.io.onResize((columns, rows) => {
88
- const nextViewport = updateRuntimeViewport(ctx.runtime, columns, rows);
89
- worker.postMessage({ type: 'io:resize', ...nextViewport });
90
- });
91
- const onExit = new Promise((resolve, reject) => {
92
- let requestedQuit = false;
93
- let forcedTerminate = false;
94
- // 2. Pipe Worker IPC -> Main Stdout
95
- worker.on('message', (msg) => {
96
- if (msg.type === 'render:frame') {
97
- ctx.io.write(msg.output);
98
- }
99
- else if (msg.type === 'error') {
100
- if (ctx.io.writeError)
101
- ctx.io.writeError(msg.message);
102
- else
103
- ctx.io.write(msg.message);
104
- }
105
- else if (msg.type === 'data') {
106
- if (options.onMessage)
107
- options.onMessage(msg.payload);
108
- }
109
- else if (msg.type === 'quit') {
110
- requestedQuit = true;
111
- bindings.scheduleTimeout(() => {
112
- if (requestedQuit) {
113
- forcedTerminate = true;
114
- void worker.terminate();
115
- }
116
- }, 50);
117
- }
118
- });
119
- worker.on('error', (err) => {
120
- cleanup();
121
- reject(err);
122
- });
123
- worker.on('exit', (code) => {
124
- cleanup();
125
- if (requestedQuit && (code === 0 || forcedTerminate)) {
126
- resolve();
127
- return;
128
- }
129
- if (code !== 0)
130
- reject(new Error(`Worker stopped with exit code ${code}`));
131
- else
132
- resolve();
133
- });
134
- function cleanup() {
135
- inputHandle.dispose();
136
- resizeHandle.dispose();
137
- if (useMouse) {
138
- ctx.io.write('\x1b[?1000l\x1b[?1002l\x1b[?1006l'); // DISABLE_MOUSE
139
- }
140
- if (useAltScreen || useHideCursor) {
141
- ctx.io.write('\x1b[?1049l'); // EXIT_ALT_SCREEN
142
- if (useHideCursor)
143
- ctx.io.write('\x1b[?25h'); // SHOW_CURSOR
144
- }
145
- }
146
- });
147
- return {
148
- send: (payload) => worker.postMessage({ type: 'data', payload }),
149
- terminate: async () => { await worker.terminate(); },
150
- onExit
151
- };
152
- }
153
- // ---------------------------------------------------------------------------
154
- // Worker Thread Logic
155
- // ---------------------------------------------------------------------------
156
- /**
157
- * The entry point for the worker thread. Must be called in the file
158
- * specified by `options.entry` in `runInWorker()`.
159
- *
160
- * Intercepts the normal `run()` execution, redirecting I/O to the parent port.
161
- *
162
- * @param app - The TEA app to run.
163
- */
164
- export async function startWorkerApp(app, bindings = defaultWorkerThreadBindings()) {
165
- if (bindings.isMainThread || !bindings.parentPort) {
166
- throw new Error('startWorkerApp must be called from within a worker thread.');
167
- }
168
- const initData = bindings.workerData;
169
- // Create a proxy Context that speaks IPC instead of true I/O
170
- const proxyCtx = bindings.createNodeContext();
171
- installRuntimeViewportOverlay(proxyCtx);
172
- const { setDefaultContext } = await import('@flyingrobots/bijou');
173
- setDefaultContext(proxyCtx);
174
- updateRuntimeViewport(proxyCtx.runtime, initData.runtime?.columns ?? proxyCtx.runtime.columns, initData.runtime?.rows ?? proxyCtx.runtime.rows);
175
- // Hijack the WritePort to send frames back to main thread
176
- proxyCtx.io.write = (data) => {
177
- bindings.parentPort.postMessage({ type: 'render:frame', output: data });
178
- };
179
- proxyCtx.io.writeError = (data) => {
180
- bindings.parentPort.postMessage({ type: 'error', message: data });
181
- };
182
- // We need to bypass the standard run() setup since the main thread
183
- // already handled alt screen and mouse modes. We tell run() to do nothing.
184
- const proxyOptions = {
185
- ...initData.options,
186
- ctx: proxyCtx,
187
- altScreen: false,
188
- hideCursor: false,
189
- mouse: false,
190
- };
191
- // Override the io.rawInput to listen to IPC messages instead of process.stdin
192
- proxyCtx.io.rawInput = (handler) => {
193
- const listener = (msg) => {
194
- if (msg.type === 'io:data')
195
- handler(msg.data);
196
- };
197
- bindings.parentPort.on('message', listener);
198
- return {
199
- dispose: () => bindings.parentPort.off('message', listener)
200
- };
201
- };
202
- proxyCtx.io.onResize = (handler) => {
203
- const listener = (msg) => {
204
- if (msg.type === 'io:resize') {
205
- const nextViewport = updateRuntimeViewport(proxyCtx.runtime, msg.columns, msg.rows);
206
- handler(nextViewport.columns, nextViewport.rows);
207
- }
208
- };
209
- bindings.parentPort.on('message', listener);
210
- return {
211
- dispose: () => bindings.parentPort.off('message', listener)
212
- };
213
- };
214
- proxyCtx.io.onData = (handler) => {
215
- const listener = (msg) => {
216
- if (msg.type === 'data')
217
- handler(msg.payload);
218
- };
219
- bindings.parentPort.on('message', listener);
220
- return {
221
- dispose: () => bindings.parentPort.off('message', listener)
222
- };
223
- };
224
- // Run the app using the proxy context
225
- await bindings.runApp(app, proxyOptions);
226
- // Signal main thread to shut down
227
- bindings.parentPort.postMessage({ type: 'quit' });
228
- }
1
+ export { isBijouWorker, sendToMain } from './worker.part01.js';
2
+ export { runInWorker } from './worker.part02.js';
3
+ export { startWorkerApp } from './worker.part03.js';
229
4
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAwBhD,SAAS,2BAA2B;IAClC,OAAO;QACL,YAAY;QACZ,UAAU;QACV,UAAU;QACV,YAAY,CAAC,KAAK,EAAE,OAAO;YACzB,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,iBAAiB;QACjB,MAAM,EAAE,GAAG;QACX,eAAe,CAAC,QAAQ,EAAE,EAAE;YAC1B,OAAO,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC;AAkBD,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAK,QAAQ,CAAC,UAAiD,EAAE,aAAa,KAAK,IAAI,CAAC;AACvH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAwB,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAwDD;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,OAAyB,EACzB,WAAiC,2BAA2B,EAAE;IAE9D,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IACxD,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IAExC,2BAA2B;IAC3B,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;QAClC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB;QAChD,IAAI,aAAa;YAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;IAC9D,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,eAAe;IACpE,CAAC;IAED,4DAA4D;IAC5D,MAAM,mBAAmB,GAA8B;QACrD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;IAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC/D,UAAU,EAAE;YACV,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;SAChB;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,6EAA6E;KAC9E,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAY,EAAE,EAAE;QACnD,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAA0B,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAe,EAAE,IAAY,EAAE,EAAE;QACrE,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,YAAY,EAA0B,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,oCAAoC;QACpC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAgB,EAAE,EAAE;YACxC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAChC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAChC,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU;oBAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;;oBACjD,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,SAAS;oBAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,aAAa,GAAG,IAAI,CAAC;gBACrB,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE;oBAC5B,IAAI,aAAa,EAAE,CAAC;wBAClB,eAAe,GAAG,IAAI,CAAC;wBACvB,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;oBAC1B,CAAC;gBACH,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,EAAE,CAAC;YACV,IAAI,aAAa,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC;gBACrD,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;;gBACtE,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,SAAS,OAAO;YACd,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,YAAY,CAAC,OAAO,EAAE,CAAC;YAEvB,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,gBAAgB;YACrE,CAAC;YACD,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;gBAClC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB;gBAC/C,IAAI,aAAa;oBAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;YAC9D,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAA0B,CAAC;QACjG,SAAS,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAkB,EAClB,WAAiC,2BAA2B,EAAE;IAE9D,IAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAA6B,CAAC;IAExD,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IAC9C,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAClE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,qBAAqB,CACnB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EACrD,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAChD,CAAC;IAEF,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QACnC,QAAQ,CAAC,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAwB,CAAC,CAAC;IACjG,CAAC,CAAC;IACF,QAAQ,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QACxC,QAAQ,CAAC,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAwB,CAAC,CAAC;IAC3F,CAAC,CAAC;IAEF,oEAAoE;IACpE,2EAA2E;IAC3E,MAAM,YAAY,GAAkB;QAClC,GAAG,QAAQ,CAAC,OAAO;QACnB,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,KAAK;KACb,CAAC;IAEF,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAE,EAAE;YACtC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,QAAQ,CAAC,UAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC7D,CAAC;IACJ,CAAC,CAAC;IAEF,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAE,EAAE;YACtC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpF,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,UAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC7D,CAAC;IACJ,CAAC,CAAC;IAEF,QAAQ,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAE,EAAE;YACtC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,QAAQ,CAAC,UAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC7D,CAAC;IACJ,CAAC,CAAC;IAEF,sCAAsC;IACtC,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEzC,kCAAkC;IAClC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAwB,CAAC,CAAC;AAC1E,CAAC"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type BijouContext } from '@flyingrobots/bijou';
2
+ import type { App, RunOptions } from '@flyingrobots/bijou-tui';
3
+ export interface WorkerInstance {
4
+ postMessage(message: unknown): void;
5
+ on(event: 'message', handler: (value: MainMessage) => void): void;
6
+ on(event: 'error', handler: (value: Error) => void): void;
7
+ on(event: 'exit', handler: (value: number) => void): void;
8
+ terminate(): Promise<number>;
9
+ }
10
+ export interface WorkerParentPort {
11
+ on(event: 'message', listener: (msg: unknown) => void): void;
12
+ off(event: 'message', listener: (msg: unknown) => void): void;
13
+ postMessage(message: unknown): void;
14
+ }
15
+ export interface WorkerThreadBindings {
16
+ isMainThread: boolean;
17
+ parentPort: WorkerParentPort | null;
18
+ workerData: unknown;
19
+ createWorker(entry: string, options: Record<string, unknown>): WorkerInstance;
20
+ createNodeContext(): BijouContext;
21
+ runApp<Model, M>(app: App<Model, M>, options: RunOptions<M>): Promise<void>;
22
+ scheduleTimeout(callback: () => void, ms: number): ReturnType<typeof setTimeout>;
23
+ }
24
+ export declare function defaultWorkerThreadBindings(): WorkerThreadBindings;
25
+ export type WorkerMessage = {
26
+ type: 'io:data';
27
+ data: string;
28
+ } | {
29
+ type: 'io:resize';
30
+ columns: number;
31
+ rows: number;
32
+ } | {
33
+ type: 'data';
34
+ payload: unknown;
35
+ } | {
36
+ type: 'quit';
37
+ };
38
+ export type MainMessage = {
39
+ type: 'render:frame';
40
+ output: string;
41
+ } | {
42
+ type: 'error';
43
+ message: string;
44
+ } | {
45
+ type: 'data';
46
+ payload: unknown;
47
+ } | {
48
+ type: 'quit';
49
+ };
50
+ /**
51
+ * Checks if the current environment is running inside a Bijou Worker.
52
+ */
53
+ export declare function isBijouWorker(): boolean;
54
+ /**
55
+ * Sends a custom data message from the worker to the main thread.
56
+ * This will be received via the `onMessage` callback in `runInWorker`.
57
+ */
58
+ export declare function sendToMain(payload: unknown): void;
59
+ //# sourceMappingURL=worker.part01.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.part01.d.ts","sourceRoot":"","sources":["../../src/worker/worker.part01.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAK/D,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;IAClE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B;AACD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC;AACD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC;IAC9E,iBAAiB,IAAI,YAAY,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,eAAe,CACb,QAAQ,EAAE,MAAM,IAAI,EACpB,EAAE,EAAE,MAAM,GACT,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CAClC;AACD,wBAAgB,2BAA2B,IAAI,oBAAoB,CAclE;AAKD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACrB,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACrB;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAGvC;AACD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQjD"}
@@ -0,0 +1,40 @@
1
+ import { Worker, isMainThread, parentPort, workerData, } from 'node:worker_threads';
2
+ import { run } from '@flyingrobots/bijou-tui';
3
+ import { createNodeContext } from '../node-context.js';
4
+ import { hasBijouWorkerFlag } from './worker-data.js';
5
+ export function defaultWorkerThreadBindings() {
6
+ return {
7
+ isMainThread,
8
+ parentPort,
9
+ workerData,
10
+ createWorker(entry, options) {
11
+ return new Worker(entry, options);
12
+ },
13
+ createNodeContext,
14
+ runApp: run,
15
+ scheduleTimeout(callback, ms) {
16
+ return setTimeout(callback, ms);
17
+ },
18
+ };
19
+ }
20
+ /**
21
+ * Checks if the current environment is running inside a Bijou Worker.
22
+ */
23
+ export function isBijouWorker() {
24
+ const bindings = defaultWorkerThreadBindings();
25
+ return !bindings.isMainThread && hasBijouWorkerFlag(bindings.workerData);
26
+ }
27
+ /**
28
+ * Sends a custom data message from the worker to the main thread.
29
+ * This will be received via the `onMessage` callback in `runInWorker`.
30
+ */
31
+ export function sendToMain(payload) {
32
+ const bindings = defaultWorkerThreadBindings();
33
+ if (bindings.parentPort) {
34
+ bindings.parentPort.postMessage({
35
+ type: 'data',
36
+ payload,
37
+ });
38
+ }
39
+ }
40
+ //# sourceMappingURL=worker.part01.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.part01.js","sourceRoot":"","sources":["../../src/worker/worker.part01.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,YAAY,EACZ,UAAU,EACV,UAAU,GACX,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AA0BtD,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,YAAY;QACZ,UAAU;QACV,UAAU;QACV,YAAY,CAAC,KAAK,EAAE,OAAO;YACzB,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,iBAAiB;QACjB,MAAM,EAAE,GAAG;QACX,eAAe,CAAC,QAAQ,EAAE,EAAE;YAC1B,OAAO,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC;AAeD;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC3E,CAAC;AACD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;YAC9B,IAAI,EAAE,MAAM;YACZ,OAAO;SACc,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { RunWorkerOptions, WorkerHandle } from './worker-options.js';
2
+ import { type WorkerThreadBindings } from './worker.part01.js';
3
+ /**
4
+ * Spawns a background worker thread to run the TEA application.
5
+ * The main thread delegates all logic to the worker, only handling raw I/O
6
+ * and frame rendering (to keep the TTY responsive).
7
+ *
8
+ * @param options - Configuration including the path to the worker entry file.
9
+ * @returns A handle to the running worker.
10
+ */
11
+ export declare function runInWorker(options: RunWorkerOptions, bindings?: WorkerThreadBindings): WorkerHandle;
12
+ //# sourceMappingURL=worker.part02.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.part02.d.ts","sourceRoot":"","sources":["../../src/worker/worker.part02.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,GAAE,oBAAoD,GAC7D,YAAY,CAuGd"}
@@ -0,0 +1,121 @@
1
+ import { resolve as resolvePath } from 'node:path';
2
+ import { installRuntimeViewportOverlay, readRuntimeViewport, updateRuntimeViewport, } from '@flyingrobots/bijou';
3
+ import { DISABLE_MOUSE, mouseModeEnableSequence, resolveWorkerMouseMode, } from './worker-mouse-mode.js';
4
+ import { defaultWorkerThreadBindings, } from './worker.part01.js';
5
+ /**
6
+ * Spawns a background worker thread to run the TEA application.
7
+ * The main thread delegates all logic to the worker, only handling raw I/O
8
+ * and frame rendering (to keep the TTY responsive).
9
+ *
10
+ * @param options - Configuration including the path to the worker entry file.
11
+ * @returns A handle to the running worker.
12
+ */
13
+ export function runInWorker(options, bindings = defaultWorkerThreadBindings()) {
14
+ if (!bindings.isMainThread) {
15
+ throw new Error('runInWorker must be called from the main thread.');
16
+ }
17
+ const ctx = options.ctx ?? bindings.createNodeContext();
18
+ installRuntimeViewportOverlay(ctx);
19
+ const useAltScreen = options.altScreen ?? true;
20
+ const useHideCursor = options.hideCursor ?? true;
21
+ const mouseMode = resolveWorkerMouseMode(options);
22
+ const useMouse = mouseMode !== undefined;
23
+ if (useAltScreen || useHideCursor) {
24
+ ctx.io.write('\x1b[?1049h'); // ENTER_ALT_SCREEN
25
+ if (useHideCursor)
26
+ ctx.io.write('\x1b[?25l'); // HIDE_CURSOR
27
+ }
28
+ if (useMouse) {
29
+ ctx.io.write(mouseModeEnableSequence(mouseMode)); // ENABLE_MOUSE
30
+ }
31
+ else {
32
+ ctx.io.write(DISABLE_MOUSE);
33
+ }
34
+ const serializableOptions = {
35
+ altScreen: options.altScreen,
36
+ hideCursor: options.hideCursor,
37
+ mouse: options.mouse,
38
+ mouseMode: options.mouseMode,
39
+ css: options.css,
40
+ };
41
+ const worker = bindings.createWorker(resolvePath(options.entry), {
42
+ workerData: {
43
+ isBijouWorker: true,
44
+ options: serializableOptions,
45
+ runtime: readRuntimeViewport(ctx.runtime),
46
+ },
47
+ execArgv: options.execArgv,
48
+ // Pipe stdout/stderr so we can capture logs if needed, but primarily use IPC
49
+ });
50
+ const inputHandle = ctx.io.rawInput((data) => {
51
+ worker.postMessage({ type: 'io:data', data });
52
+ });
53
+ const resizeHandle = ctx.io.onResize((columns, rows) => {
54
+ const nextViewport = updateRuntimeViewport(ctx.runtime, columns, rows);
55
+ worker.postMessage({
56
+ type: 'io:resize',
57
+ ...nextViewport,
58
+ });
59
+ });
60
+ const onExit = new Promise((resolve, reject) => {
61
+ let requestedQuit = false;
62
+ let forcedTerminate = false;
63
+ worker.on('message', (msg) => {
64
+ if (msg.type === 'render:frame') {
65
+ ctx.io.write(msg.output);
66
+ }
67
+ else if (msg.type === 'error') {
68
+ ctx.io.writeError(msg.message);
69
+ }
70
+ else if (msg.type === 'data') {
71
+ options.onMessage?.(msg.payload);
72
+ }
73
+ else {
74
+ requestedQuit = true;
75
+ bindings.scheduleTimeout(() => {
76
+ if (requestedQuit) {
77
+ forcedTerminate = true;
78
+ void worker.terminate();
79
+ }
80
+ }, 50);
81
+ }
82
+ });
83
+ worker.on('error', (err) => {
84
+ cleanup();
85
+ reject(err);
86
+ });
87
+ worker.on('exit', (code) => {
88
+ cleanup();
89
+ if (requestedQuit && (code === 0 || forcedTerminate)) {
90
+ resolve();
91
+ return;
92
+ }
93
+ if (code !== 0)
94
+ reject(new Error(`Worker stopped with exit code ${String(code)}`));
95
+ else
96
+ resolve();
97
+ });
98
+ function cleanup() {
99
+ inputHandle.dispose();
100
+ resizeHandle.dispose();
101
+ if (useMouse) {
102
+ ctx.io.write(DISABLE_MOUSE);
103
+ }
104
+ if (useAltScreen || useHideCursor) {
105
+ ctx.io.write('\x1b[?1049l'); // EXIT_ALT_SCREEN
106
+ if (useHideCursor)
107
+ ctx.io.write('\x1b[?25h'); // SHOW_CURSOR
108
+ }
109
+ }
110
+ });
111
+ return {
112
+ send: (payload) => {
113
+ worker.postMessage({ type: 'data', payload });
114
+ },
115
+ terminate: async () => {
116
+ await worker.terminate();
117
+ },
118
+ onExit,
119
+ };
120
+ }
121
+ //# sourceMappingURL=worker.part02.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.part02.js","sourceRoot":"","sources":["../../src/worker/worker.part02.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { App } from '@flyingrobots/bijou-tui';
2
+ import { type WorkerMessage, type WorkerThreadBindings } from './worker.part01.js';
3
+ /**
4
+ * The entry point for the worker thread. Must be called in the file
5
+ * specified by `options.entry` in `runInWorker()`.
6
+ *
7
+ * Intercepts the normal `run()` execution, redirecting I/O to the parent port.
8
+ *
9
+ * @param app - The TEA app to run.
10
+ */
11
+ export declare function startWorkerApp<Model, M>(app: App<Model, M>, bindings?: WorkerThreadBindings): Promise<void>;
12
+ export declare function isWorkerMessage(msg: unknown): msg is WorkerMessage;
13
+ //# sourceMappingURL=worker.part03.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.part03.d.ts","sourceRoot":"","sources":["../../src/worker/worker.part03.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAc,MAAM,yBAAyB,CAAC;AAO/D,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAE1B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,CAAC,EAC3C,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAClB,QAAQ,GAAE,oBAAoD,GAC7D,OAAO,CAAC,IAAI,CAAC,CAwFf;AACD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,aAAa,CASlE"}