@drayman/core 2.9.0 → 3.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.
@@ -0,0 +1,423 @@
1
+ "use strict";
2
+ // function-instance-manager.v2.ts
3
+ // A generic manager for launching and supervising thread-based workers ("function instances").
4
+ // - No method mappers. You can call ANY worker method by name.
5
+ // - Cancellable calls (request/response with cancel) are supported via a generic API.
6
+ // - Heartbeat & memory fences, graceful destroy, parent/child graphs, connection-based GC.
7
+ // - Namespace/factHub routing via generic broadcast filters.
8
+ // - Emits: 'instancesChanged' | 'destroyed' | 'memoryExceeded' | 'event' | 'console'
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.FunctionInstanceManagerV2 = void 0;
14
+ const threads_1 = require("threads");
15
+ const events_1 = require("events");
16
+ const shortid_1 = __importDefault(require("shortid"));
17
+ // ---------- Utils
18
+ const delay = (ms) => new Promise(r => setTimeout(r, ms));
19
+ const withTimeout = async (p, ms) => Promise.race([
20
+ p,
21
+ (async () => { await delay(ms); throw new Error(`Timed out after ${ms} ms`); })(),
22
+ ]);
23
+ const toMB = (x) => Math.round((x / 1048576) * 10) / 10;
24
+ const pct = (num, den) => Math.min(100, Math.round(((den > 0 ? num / den : 0) * 100)));
25
+ const safeParse = (v) => (typeof v === 'string' ? (() => { try {
26
+ return JSON.parse(v);
27
+ }
28
+ catch {
29
+ return {};
30
+ } })() : v);
31
+ // ---------- Manager
32
+ class FunctionInstanceManagerV2 extends events_1.EventEmitter {
33
+ constructor() {
34
+ super();
35
+ this.instances = {};
36
+ this.gcConnections = new Set();
37
+ this.gcInstances = new Map();
38
+ this.heartbeatTimer = setInterval(() => {
39
+ const now = Date.now();
40
+ for (const it of Object.values(this.instances)) {
41
+ if (!it || it.status !== 'ok')
42
+ continue;
43
+ if ((now - it.lastHeartbeat) > it.limits.heartbeatLimitMs) {
44
+ console.warn(`Heartbeat limit reached (${it.limits.heartbeatLimitMs} ms) — stopping ${it.id} (${it.name})`);
45
+ this.markInstanceForGC(it.id, { skipOnDestroy: true });
46
+ }
47
+ }
48
+ }, 1000);
49
+ }
50
+ // ---------- Lifecycle
51
+ async start(opts) {
52
+ const id = opts.id || shortid_1.default.generate();
53
+ const heapLimitMB = opts.heapLimitMB ?? 512;
54
+ const externalLimitMB = opts.externalLimitMB ?? 512;
55
+ const heartbeatLimitMs = opts.heartbeatLimitMs ?? 3000;
56
+ const rawWorker = new threads_1.Worker(opts.workerPath, {
57
+ resourceLimits: { maxOldGenerationSizeMb: heapLimitMB },
58
+ });
59
+ rawWorker.addEventListener('error', () => {
60
+ this.markInstanceForGC(id, { skipOnDestroy: true });
61
+ });
62
+ const worker = await threads_1.spawn(rawWorker);
63
+ const instance = {
64
+ id,
65
+ name: opts.name,
66
+ status: 'ok',
67
+ worker,
68
+ rawWorker,
69
+ startDate: new Date(),
70
+ lastHeartbeat: Date.now(),
71
+ connectionId: opts.connectionId ?? null,
72
+ namespaceId: opts.namespaceId ?? null,
73
+ parentId: opts.parentId ?? null,
74
+ factHubConnectionId: opts.factHubConnectionId ?? null,
75
+ limits: { heapLimitMB, externalLimitMB, heartbeatLimitMs },
76
+ memory: {
77
+ heap: { usedMB: 0, limitMB: heapLimitMB, pct: 0 },
78
+ external: { usedMB: 0, limitMB: externalLimitMB, pct: 0 },
79
+ },
80
+ eventsSub: undefined,
81
+ pending: {},
82
+ terminatingPromise: null,
83
+ hooks: { onConsole: opts.onConsole, onEvent: opts.onEvent },
84
+ };
85
+ // Subscribe to worker's observable stream (generic "events()" contract)
86
+ const events$ = worker.events?.();
87
+ if (events$?.subscribe) {
88
+ instance.eventsSub = events$.subscribe({
89
+ next: ({ type, payload }) => this._onWorkerEvent(instance, type, payload),
90
+ error: () => this.markInstanceForGC(id, { skipOnDestroy: true }),
91
+ complete: () => this.markInstanceForGC(id, { skipOnDestroy: true }),
92
+ });
93
+ }
94
+ // Optional init
95
+ if (opts.init?.fn) {
96
+ try {
97
+ await worker[opts.init.fn](opts.init.args || {});
98
+ }
99
+ catch {
100
+ this.markInstanceForGC(id, { skipOnDestroy: true });
101
+ }
102
+ }
103
+ this.instances[id] = instance;
104
+ this.emit('instancesChanged', this.getInstances());
105
+ this._clearGarbage();
106
+ return id;
107
+ }
108
+ async destroy(instanceId, skipOnDestroy = false) {
109
+ const it = this.instances[instanceId];
110
+ if (!it)
111
+ return;
112
+ if (it.terminatingPromise)
113
+ return it.terminatingPromise;
114
+ if (it.status === 'destroyed')
115
+ return;
116
+ it.status = 'destroying';
117
+ it.terminatingPromise = (async () => {
118
+ // Fail pending
119
+ for (const rid of Object.keys(it.pending)) {
120
+ try {
121
+ it.pending[rid].onError({ err: 'Instance was destroyed' });
122
+ }
123
+ catch { }
124
+ }
125
+ // Try to call a generic "handleDestroy*" if exists and not skipped.
126
+ if (!skipOnDestroy) {
127
+ try {
128
+ // Best-effort: call a conventional destroy method if provided by worker.
129
+ if (typeof it.worker.handleDestroyComponentInstance === 'function') {
130
+ await withTimeout(it.worker.handleDestroyComponentInstance(), 3000);
131
+ }
132
+ else if (typeof it.worker.handleDestroyFunctionInstance === 'function') {
133
+ await withTimeout(it.worker.handleDestroyFunctionInstance(), 3000);
134
+ }
135
+ }
136
+ catch (e) {
137
+ console.warn(`Destroy hook failed for ${instanceId} (${it.name})`, e);
138
+ }
139
+ }
140
+ // Terminate thread
141
+ try {
142
+ await withTimeout(threads_1.Thread.terminate(it.worker), 1000);
143
+ }
144
+ catch (e) {
145
+ console.warn(`Thread.terminate failed for ${instanceId} (${it.name})`, e);
146
+ }
147
+ // Unsubscribe
148
+ try {
149
+ it.eventsSub?.unsubscribe?.();
150
+ }
151
+ catch (e) {
152
+ console.warn(`Unsubscribe failed for ${instanceId} (${it.name})`, e);
153
+ }
154
+ it.status = 'destroyed';
155
+ delete this.instances[instanceId];
156
+ try {
157
+ this.emit('destroyed', { id: instanceId, name: it.name });
158
+ }
159
+ catch (e) {
160
+ console.warn(`Emit destroyed failed for ${instanceId} (${it.name})`, e);
161
+ }
162
+ this.emit('instancesChanged', this.getInstances());
163
+ })();
164
+ return it.terminatingPromise;
165
+ }
166
+ async dispose() {
167
+ clearInterval(this.heartbeatTimer);
168
+ const ids = Object.keys(this.instances);
169
+ for (const id of ids)
170
+ await this.destroy(id, true);
171
+ }
172
+ // ---------- GC
173
+ markConnectionForGC(connectionId) {
174
+ this.gcConnections.add(connectionId);
175
+ this._clearGarbage();
176
+ }
177
+ markInstanceForGC(instanceId, opts = {}) {
178
+ const prev = this.gcInstances.get(instanceId) || {};
179
+ this.gcInstances.set(instanceId, { skipOnDestroy: Boolean(prev.skipOnDestroy || opts.skipOnDestroy) });
180
+ this._clearGarbage();
181
+ }
182
+ _clearGarbage() {
183
+ // Mark by dead connections
184
+ const fromConnections = new Map();
185
+ for (const it of Object.values(this.instances)) {
186
+ if (it && it.connectionId && this.gcConnections.has(it.connectionId)) {
187
+ fromConnections.set(it.id, { skipOnDestroy: false });
188
+ }
189
+ }
190
+ // Merge with explicit instances
191
+ const toTerminate = new Map(fromConnections);
192
+ for (const [id, o] of this.gcInstances) {
193
+ const prev = toTerminate.get(id) || { skipOnDestroy: false };
194
+ toTerminate.set(id, { skipOnDestroy: Boolean(prev.skipOnDestroy || o.skipOnDestroy) });
195
+ }
196
+ // Act
197
+ for (const [id, o] of toTerminate) {
198
+ const it = this.instances[id];
199
+ if (!it || it.status !== 'ok')
200
+ continue;
201
+ this.destroy(id, !!o.skipOnDestroy);
202
+ }
203
+ this.gcInstances.clear();
204
+ this.gcConnections.clear();
205
+ }
206
+ // ---------- Calls
207
+ /**
208
+ * Call ANY worker method by name with args.
209
+ * Returns the worker's promise (if any). Exceptions are caught and re-thrown with context.
210
+ */
211
+ async call({ instanceId, fn, args }) {
212
+ const it = this.instances[instanceId];
213
+ if (!it || it.status !== 'ok')
214
+ throw new Error(`Instance not found: ${instanceId}`);
215
+ const method = it.worker?.[fn];
216
+ if (typeof method !== 'function')
217
+ throw new Error(`Worker method not found: ${fn} on ${instanceId}`);
218
+ try {
219
+ // auto safeParse if user passed string
220
+ const payload = safeParse(args);
221
+ return await method(payload);
222
+ }
223
+ catch (e) {
224
+ throw new Error(`Worker call failed (${fn}) for ${instanceId}: ${e?.message || e}`);
225
+ }
226
+ }
227
+ /**
228
+ * Broadcast a call to many instances optionally filtered by a predicate.
229
+ * Fails individually, returns array of settled results.
230
+ */
231
+ async broadcast({ fn, args, filter }) {
232
+ const rows = this.getInstances().filter(r => this.instances[r.id]?.status === 'ok' && (!filter || filter(r)));
233
+ const results = await Promise.allSettled(rows.map(r => this.call({ instanceId: r.id, fn, args })));
234
+ return results.map((res, i) => res.status === 'fulfilled'
235
+ ? { id: rows[i].id, ok: true, value: res.value }
236
+ : { id: rows[i].id, ok: false, error: res.reason });
237
+ }
238
+ /**
239
+ * Start a cancellable job on the worker using generic start/cancel method names.
240
+ * Worker must emit {type:'response', payload:{requestId,result,err}} when done.
241
+ */
242
+ startCancellable({ instanceId, startFn, cancelFn, args, onSuccess, onError }) {
243
+ const it = this.instances[instanceId];
244
+ if (!it || it.status !== 'ok') {
245
+ onError({ err: 'Instance was not found.' });
246
+ return { requestId: shortid_1.default.generate(), cancel: () => { } };
247
+ }
248
+ const requestId = shortid_1.default.generate();
249
+ it.pending[requestId] = { onSuccess, onError, canceled: false };
250
+ try {
251
+ const payload = { ...(safeParse(args) || {}), requestId };
252
+ const start = it.worker?.[startFn];
253
+ if (typeof start !== 'function')
254
+ throw new Error(`Worker start method not found: ${startFn}`);
255
+ start(payload);
256
+ }
257
+ catch (e) {
258
+ delete it.pending[requestId];
259
+ onError({ err: e?.message || e });
260
+ }
261
+ return {
262
+ requestId,
263
+ cancel: () => {
264
+ const cur = this.instances[instanceId];
265
+ if (!cur)
266
+ return;
267
+ const req = cur.pending[requestId];
268
+ if (!req)
269
+ return;
270
+ req.canceled = true;
271
+ try {
272
+ const cancel = cur.worker?.[cancelFn];
273
+ if (typeof cancel === 'function')
274
+ cancel({ requestId });
275
+ }
276
+ catch {
277
+ console.warn(`Failed to cancel ${startFn} (${requestId}) for ${instanceId} (${it.name})`);
278
+ }
279
+ },
280
+ };
281
+ }
282
+ /**
283
+ * Route a hub-style message to instances; by default, calls "handleEventHubEvent".
284
+ * Pass a custom fn if your worker uses another receiver.
285
+ */
286
+ routeHub({ type, data, groupId = null, namespaceId = null, fn = 'handleEventHubEvent' }) {
287
+ const rows = this.getInstances().filter(r => r.namespaceId === namespaceId && this.instances[r.id]?.status === 'ok');
288
+ for (const r of rows) {
289
+ try {
290
+ const w = this.instances[r.id].worker;
291
+ if (typeof w?.[fn] === 'function') {
292
+ w[fn]({ type, data, groupId });
293
+ }
294
+ }
295
+ catch {
296
+ console.warn(`Failed to route hub event ${type} to ${r.id} (${r.name}) via ${fn}`);
297
+ }
298
+ }
299
+ }
300
+ // ---------- Graph & Query
301
+ getInstances() {
302
+ return Object.values(this.instances).map(it => ({
303
+ id: it.id,
304
+ name: it.name,
305
+ status: it.status,
306
+ startDate: it.startDate,
307
+ connectionId: it.connectionId ?? null,
308
+ namespaceId: it.namespaceId ?? null,
309
+ parentId: it.parentId ?? null,
310
+ factHubConnectionId: it.factHubConnectionId ?? null,
311
+ memory: it.memory,
312
+ limits: it.limits,
313
+ }));
314
+ }
315
+ getRelatedByParent(rootId) {
316
+ const out = [];
317
+ const walk = (pid) => {
318
+ for (const it of Object.values(this.instances)) {
319
+ if (it.parentId === pid) {
320
+ out.push(this._row(it));
321
+ walk(it.id);
322
+ }
323
+ }
324
+ };
325
+ walk(rootId);
326
+ return out;
327
+ }
328
+ getRelatedByFactHubConnection(factHubConnectionId) {
329
+ const out = {};
330
+ const list = Object.values(this.instances).filter(x => x.factHubConnectionId === factHubConnectionId);
331
+ const queue = list.map(x => x.id);
332
+ while (queue.length) {
333
+ const cur = queue.shift();
334
+ for (const it of Object.values(this.instances)) {
335
+ if (it.parentId === cur && !out[it.id]) {
336
+ out[it.id] = this._row(it);
337
+ queue.push(it.id);
338
+ }
339
+ }
340
+ }
341
+ for (const x of list)
342
+ out[x.id] = this._row(x);
343
+ return Object.values(out);
344
+ }
345
+ // ---------- Internals
346
+ _row(it) {
347
+ return {
348
+ id: it.id,
349
+ name: it.name,
350
+ status: it.status,
351
+ startDate: it.startDate,
352
+ connectionId: it.connectionId ?? null,
353
+ namespaceId: it.namespaceId ?? null,
354
+ parentId: it.parentId ?? null,
355
+ factHubConnectionId: it.factHubConnectionId ?? null,
356
+ memory: it.memory,
357
+ limits: it.limits,
358
+ };
359
+ }
360
+ _onWorkerEvent(inst, type, payload) {
361
+ // Standardized response channel for cancellable jobs
362
+ if (type === 'response') {
363
+ const { requestId, result, err } = payload || {};
364
+ const req = inst.pending?.[requestId];
365
+ if (!req)
366
+ return;
367
+ try {
368
+ if (!req.canceled) {
369
+ err ? req.onError({ err }) : req.onSuccess({ result });
370
+ }
371
+ }
372
+ catch {
373
+ console.warn(`Failed to process response ${requestId} for ${inst.id} (${inst.name})`);
374
+ }
375
+ finally {
376
+ delete inst.pending[requestId];
377
+ }
378
+ return;
379
+ }
380
+ // Console passthrough (optional)
381
+ if (type === 'console') {
382
+ try {
383
+ inst.hooks.onConsole?.(payload, this._row(inst));
384
+ }
385
+ catch { }
386
+ this.emit('console', { id: inst.id, payload });
387
+ return;
388
+ }
389
+ // Heartbeat + memory
390
+ if (type === 'heartbeat') {
391
+ const { heapStatistics } = payload || {};
392
+ if (!heapStatistics)
393
+ return;
394
+ const heapUsedMB = toMB(heapStatistics.used_heap_size);
395
+ const extUsedMB = toMB(heapStatistics.external_memory);
396
+ inst.memory.heap.usedMB = heapUsedMB;
397
+ inst.memory.heap.pct = pct(heapUsedMB, inst.limits.heapLimitMB);
398
+ inst.memory.external.usedMB = extUsedMB;
399
+ inst.memory.external.pct = pct(extUsedMB, inst.limits.externalLimitMB);
400
+ inst.lastHeartbeat = Date.now();
401
+ const heapExceeded = heapUsedMB >= inst.limits.heapLimitMB;
402
+ const extExceeded = extUsedMB >= inst.limits.externalLimitMB;
403
+ if (heapExceeded || extExceeded) {
404
+ console.warn(`Memory limit exceeded — stopping ${inst.id} (${inst.name}) ` +
405
+ `(heap ${heapUsedMB}/${inst.limits.heapLimitMB}, external ${extUsedMB}/${inst.limits.externalLimitMB})`);
406
+ this.markInstanceForGC(inst.id, { skipOnDestroy: true });
407
+ this.emit('memoryExceeded', this._row(inst));
408
+ }
409
+ else {
410
+ this.emit('instancesChanged', this.getInstances());
411
+ }
412
+ return;
413
+ }
414
+ // Everything else is a generic event
415
+ try {
416
+ inst.hooks.onEvent?.({ type, payload, id: inst.id }, this._row(inst));
417
+ }
418
+ catch { }
419
+ this.emit('event', { id: inst.id, type, payload });
420
+ }
421
+ }
422
+ exports.FunctionInstanceManagerV2 = FunctionInstanceManagerV2;
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24taW5zdGFuY2UtbWFuYWdlci52Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mdW5jdGlvbi1pbnN0YW5jZS1tYW5hZ2VyLnYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrQ0FBa0M7QUFDbEMsK0ZBQStGO0FBQy9GLCtEQUErRDtBQUMvRCxzRkFBc0Y7QUFDdEYsMkZBQTJGO0FBQzNGLDZEQUE2RDtBQUM3RCxxRkFBcUY7Ozs7OztBQUVyRixxQ0FBZ0Q7QUFDaEQsbUNBQXNDO0FBQ3RDLHNEQUE4QjtBQWtGOUIsbUJBQW1CO0FBRW5CLE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4RSxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUssQ0FBYSxFQUFFLEVBQVUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUNyRSxDQUFDO0lBQ0QsQ0FBQyxLQUFLLElBQUksRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ3BGLENBQUMsQ0FBQztBQUVILE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FB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
package/dist/index.d.ts CHANGED
@@ -1,3 +1,37 @@
1
+ declare type ComponentInstance = {
2
+ heapLimit: number;
3
+ componentName: string;
4
+ heartbeatLimitMs: number;
5
+ externalLimit: number;
6
+ terminatingPromise: Promise<void> | null;
7
+ emit: any;
8
+ lastHeartbeat: number;
9
+ heapUsed: number;
10
+ externalUsed: number;
11
+ eventsSub?: {
12
+ unsubscribe: () => void;
13
+ };
14
+ component: string;
15
+ startDate: Date;
16
+ worker: any;
17
+ eventRequests: {
18
+ [requestId: string]: {
19
+ onSuccess: (data: {
20
+ result: any;
21
+ }) => void;
22
+ onError: (data: {
23
+ err: any;
24
+ }) => void;
25
+ canceled: boolean;
26
+ };
27
+ };
28
+ connectionId: string;
29
+ namespaceId: string;
30
+ meta?: any;
31
+ };
32
+ export declare const componentInstances: {
33
+ [componentInstanceId: string]: ComponentInstance;
34
+ };
1
35
  export declare const handleComponentEvent: ({ componentInstanceId, eventName, options, files, onSuccess, onError }: {
2
36
  componentInstanceId: any;
3
37
  eventName: any;
@@ -12,11 +46,11 @@ export declare const handleComponentEvent: ({ componentInstanceId, eventName, op
12
46
  export declare function getElementsScriptPaths({ nodeModulesPath }: {
13
47
  nodeModulesPath?: any;
14
48
  }): Promise<{}>;
15
- export declare const onUpdateComponentInstanceProps: ({ componentInstanceId, options, }: {
49
+ export declare const onUpdateComponentInstanceProps: ({ componentInstanceId, options }: {
16
50
  componentInstanceId: any;
17
51
  options: any;
18
52
  }) => void;
19
- export declare const onHandleBrowserCallback: ({ callbackId, data, }: {
53
+ export declare const onHandleBrowserCallback: ({ callbackId, data }: {
20
54
  callbackId: any;
21
55
  data: any;
22
56
  }) => void;
@@ -31,7 +65,7 @@ export declare const saveComponent: ({ script, outputFile, scriptPath }: {
31
65
  outputFile: any;
32
66
  scriptPath: any;
33
67
  }) => Promise<void>;
34
- export declare const onInitializeComponentInstance: ({ namespaceId, extensionsPath, extensionsOptions, componentNamePrefix, componentName, componentRootDir, componentInstanceId, componentOptions, connectionId, emit, onComponentInstanceConsole, browserCommands, serverCommands, onEventHubEvent, }: {
68
+ export declare const onInitializeComponentInstance: ({ namespaceId, extensionsPath, extensionsOptions, componentNamePrefix, componentName, componentRootDir, componentInstanceId, componentOptions, connectionId, emit, onComponentInstanceConsole, browserCommands, serverCommands, onEventHubEvent, heapLimit, externalLimit, heartbeatLimitMs, meta, }: {
35
69
  namespaceId?: any;
36
70
  extensionsPath?: any;
37
71
  extensionsOptions?: any;
@@ -46,6 +80,10 @@ export declare const onInitializeComponentInstance: ({ namespaceId, extensionsPa
46
80
  browserCommands: any;
47
81
  serverCommands: any;
48
82
  onEventHubEvent?: any;
83
+ heapLimit?: number;
84
+ externalLimit?: number;
85
+ heartbeatLimitMs?: number;
86
+ meta?: any;
49
87
  }) => Promise<void>;
50
88
  export declare const onDisconnect: ({ connectionId }: {
51
89
  connectionId: any;
@@ -53,21 +91,4 @@ export declare const onDisconnect: ({ connectionId }: {
53
91
  export declare const onDestroyComponentInstance: ({ componentInstanceId }: {
54
92
  componentInstanceId: any;
55
93
  }) => Promise<void>;
56
- export declare const componentInstances: {
57
- [componentInstanceId: string]: {
58
- terminate: () => Promise<void>;
59
- worker: any;
60
- eventRequests: {
61
- [requestId: string]: {
62
- onSuccess: (data: {
63
- result: any;
64
- }) => void;
65
- onError: (data: {
66
- err: any;
67
- }) => void;
68
- };
69
- };
70
- connectionId: string;
71
- namespaceId: string;
72
- };
73
- };
94
+ export {};