@xentobias/worker-rpc 1.0.4 → 1.0.5

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.
@@ -13,6 +13,18 @@ export interface ExposeOptions {
13
13
  /** Maximum depth for nested objects (default: 10) */
14
14
  maxDepth?: number;
15
15
  }
16
+ /** Options for graceful shutdown */
17
+ export interface ShutdownOptions {
18
+ /** Timeout in milliseconds to wait for pending calls (default: 30000) */
19
+ timeout?: number;
20
+ }
21
+ /** Result of a graceful shutdown operation */
22
+ export interface ShutdownResult {
23
+ /** Whether the shutdown completed successfully (all calls finished) */
24
+ success: boolean;
25
+ /** Whether the shutdown timed out */
26
+ timeout: boolean;
27
+ }
16
28
  /**
17
29
  * RPC Endpoint - handles bidirectional communication with a worker
18
30
  */
@@ -96,6 +108,30 @@ export declare class Endpoint {
96
108
  * Send a message to the target
97
109
  */
98
110
  private send;
111
+ /**
112
+ * Get the number of pending calls
113
+ */
114
+ getPendingCallCount(): number;
115
+ /**
116
+ * Check if there are any pending calls
117
+ */
118
+ hasPendingCalls(): boolean;
119
+ /**
120
+ * Gracefully shut down the endpoint, waiting for pending calls to complete
121
+ *
122
+ * @param options - Shutdown options
123
+ * @returns Promise that resolves with the shutdown result
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * // Wait up to 5 seconds for pending calls to complete
128
+ * const result = await endpoint.shutdown({ timeout: 5000 });
129
+ * if (result.timedOut) {
130
+ * console.log(`${result.terminatedCalls} calls were forcefully terminated`);
131
+ * }
132
+ * ```
133
+ */
134
+ shutdown(options?: ShutdownOptions): Promise<ShutdownResult>;
99
135
  /**
100
136
  * Release this endpoint and clean up resources
101
137
  */
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,UAAU,EAGf,KAAK,aAAa,EAEnB,MAAM,SAAS,CAAC;AAYjB,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAqB;IAE1C,sCAAsC;IACtC,OAAO,CAAC,YAAY,CAAkC;IAEtD,2DAA2D;IAC3D,OAAO,CAAC,SAAS,CAA+C;IAEhE,iEAAiE;IACjE,OAAO,CAAC,eAAe,CAAmC;IAE1D,6CAA6C;IAC7C,OAAO,CAAC,mBAAmB,CAA4C;IAEvE,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB;IAYhE;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,KAAK;IAMb;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI;IAO7D;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;YACW,UAAU;IAsDxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAmCrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBnB;;OAEG;YACW,cAAc;IA8D5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;YACW,cAAc;IAgD5B;;OAEG;IACU,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA2DtE;;OAEG;IACH,OAAO,CAAC,IAAI;IAQZ;;OAEG;IACI,OAAO,IAAI,IAAI;IAkCtB;;OAEG;IACI,SAAS,IAAI,aAAa;CAGlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,eAAe,GACxB,QAAQ,CAEV"}
1
+ {"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,UAAU,EAGf,KAAK,aAAa,EAEnB,MAAM,SAAS,CAAC;AAYjB,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAqB;IAE1C,sCAAsC;IACtC,OAAO,CAAC,YAAY,CAAkC;IAEtD,2DAA2D;IAC3D,OAAO,CAAC,SAAS,CAA+C;IAEhE,iEAAiE;IACjE,OAAO,CAAC,eAAe,CAAmC;IAE1D,6CAA6C;IAC7C,OAAO,CAAC,mBAAmB,CAA4C;IAEvE,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB;IAYhE;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,KAAK;IAMb;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI;IAO7D;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;YACW,UAAU;IAsDxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAmCrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBnB;;OAEG;YACW,cAAc;IA8D5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;YACW,cAAc;IAgD5B;;OAEG;IACU,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA2DtE;;OAEG;IACH,OAAO,CAAC,IAAI;IAQZ;;OAEG;IACI,mBAAmB,IAAI,MAAM;IAIpC;;OAEG;IACI,eAAe,IAAI,OAAO;IAIjC;;;;;;;;;;;;;;OAcG;IACU,QAAQ,CACnB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC;IAwE1B;;OAEG;IACI,OAAO,IAAI,IAAI;IAkCtB;;OAEG;IACI,SAAS,IAAI,aAAa;CAGlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,eAAe,GACxB,QAAQ,CAEV"}
package/dist/index.js CHANGED
@@ -345,6 +345,69 @@ class Endpoint {
345
345
  this.debug("sending", MessageType[message.t], message);
346
346
  this.target.postMessage(message, transferables);
347
347
  }
348
+ getPendingCallCount() {
349
+ return this.pendingCalls.size;
350
+ }
351
+ hasPendingCalls() {
352
+ return this.pendingCalls.size > 0;
353
+ }
354
+ async shutdown(options = {}) {
355
+ const { timeout = DEFAULT_TIMEOUT } = options;
356
+ if (this.released) {
357
+ return {
358
+ success: true,
359
+ timeout: false
360
+ };
361
+ }
362
+ if (!this.hasPendingCalls()) {
363
+ this.release();
364
+ return {
365
+ success: true,
366
+ timeout: false
367
+ };
368
+ }
369
+ return new Promise((resolve) => {
370
+ let resolved = false;
371
+ const complete = (result) => {
372
+ if (resolved)
373
+ return;
374
+ resolved = true;
375
+ clearTimeout(timeoutId);
376
+ if (!this.released) {
377
+ this.release();
378
+ }
379
+ resolve(result);
380
+ };
381
+ const timeoutId = setTimeout(() => {
382
+ complete({
383
+ success: false,
384
+ timeout: true
385
+ });
386
+ }, timeout);
387
+ for (const [, pending] of this.pendingCalls) {
388
+ const originalResolve = pending.resolve;
389
+ const originalReject = pending.reject;
390
+ pending.resolve = (value) => {
391
+ originalResolve(value);
392
+ if (!this.hasPendingCalls()) {
393
+ complete({
394
+ success: true,
395
+ timeout: false
396
+ });
397
+ }
398
+ };
399
+ pending.reject = (error) => {
400
+ originalReject(error);
401
+ if (!this.hasPendingCalls()) {
402
+ complete({
403
+ success: true,
404
+ timeout: false
405
+ });
406
+ }
407
+ };
408
+ }
409
+ });
410
+ }
348
411
  release() {
349
412
  if (this.released) {
350
413
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xentobias/worker-rpc",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "High-performance, type-safe RPC for Workers",
5
5
  "module": "src/index.ts",
6
6
  "main": "dist/index.js",
@@ -19,6 +19,7 @@
19
19
  "build": "bun build ./src/index.ts --outdir ./dist --target bun && tsc --declaration",
20
20
  "typecheck": "tsc --noEmit",
21
21
  "test": "bun test",
22
+ "prepublishOnly": "bun run build",
22
23
  "example": "bun run examples/basic/main.ts",
23
24
  "example:nested": "bun run examples/nested/main.ts",
24
25
  "example:callbacks": "bun run examples/callbacks/main.ts",