@livestore/utils 0.4.0-dev.5 → 0.4.0-dev.6

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 (44) hide show
  1. package/dist/.tsbuildinfo.json +1 -1
  2. package/dist/effect/Effect.d.ts +1 -2
  3. package/dist/effect/Effect.d.ts.map +1 -1
  4. package/dist/effect/Effect.js +2 -2
  5. package/dist/effect/Effect.js.map +1 -1
  6. package/dist/effect/RpcClient.d.ts.map +1 -1
  7. package/dist/effect/RpcClient.js +1 -0
  8. package/dist/effect/RpcClient.js.map +1 -1
  9. package/dist/effect/index.d.ts +1 -1
  10. package/dist/effect/index.d.ts.map +1 -1
  11. package/dist/effect/index.js +1 -1
  12. package/dist/effect/index.js.map +1 -1
  13. package/dist/mod.d.ts +2 -0
  14. package/dist/mod.d.ts.map +1 -1
  15. package/dist/mod.js +4 -0
  16. package/dist/mod.js.map +1 -1
  17. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
  18. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +54 -10
  19. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
  20. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +182 -3
  21. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +1 -1
  22. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +12 -3
  23. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +1 -1
  24. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +7 -1
  25. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +1 -1
  26. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +11 -1
  27. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +1 -1
  28. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +16 -0
  29. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
  30. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +98 -2
  31. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
  32. package/dist/node/mod.js +2 -2
  33. package/dist/node/mod.js.map +1 -1
  34. package/package.json +7 -9
  35. package/src/effect/Effect.ts +15 -3
  36. package/src/effect/RpcClient.ts +1 -0
  37. package/src/effect/index.ts +1 -0
  38. package/src/mod.ts +9 -0
  39. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +59 -10
  40. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +253 -3
  41. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +14 -1
  42. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +14 -1
  43. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +111 -3
  44. package/src/node/mod.ts +2 -2
@@ -28,11 +28,11 @@ declare const Person_base: Schema.Class<Person, {
28
28
  name: typeof Schema.String;
29
29
  data: typeof Schema.Uint8Array;
30
30
  }>, never, {
31
- readonly data: Uint8Array<ArrayBufferLike>;
32
- } & {
33
31
  readonly id: number;
34
32
  } & {
35
33
  readonly name: string;
34
+ } & {
35
+ readonly data: Uint8Array<ArrayBufferLike>;
36
36
  }, {}, {}>;
37
37
  export declare class Person extends Person_base {
38
38
  }
@@ -48,6 +48,15 @@ declare const RunnerInterrupt_base: Schema.TaggedRequestClass<RunnerInterrupt, "
48
48
  }, typeof Schema.Void, typeof Schema.Never>;
49
49
  export declare class RunnerInterrupt extends RunnerInterrupt_base {
50
50
  }
51
+ declare const StartStubbornWorker_base: Schema.TaggedRequestClass<StartStubbornWorker, "StartStubbornWorker", {
52
+ readonly _tag: Schema.tag<"StartStubbornWorker">;
53
+ } & {
54
+ blockDuration: typeof Schema.Number;
55
+ }, Schema.Struct<{
56
+ pid: typeof Schema.Number;
57
+ }>, typeof Schema.Never>;
58
+ export declare class StartStubbornWorker extends StartStubbornWorker_base {
59
+ }
51
60
  declare const InitialMessage_base: Schema.TaggedRequestClass<InitialMessage, "InitialMessage", {
52
61
  readonly _tag: Schema.tag<"InitialMessage">;
53
62
  } & {
@@ -69,7 +78,7 @@ declare const GetSpan_base: Schema.TaggedRequestClass<GetSpan, "GetSpan", {
69
78
  }>, typeof Schema.Never>;
70
79
  export declare class GetSpan extends GetSpan_base {
71
80
  }
72
- export declare const WorkerMessage: Schema.Union<[typeof GetUserById, typeof GetPersonById, typeof InitialMessage, typeof GetSpan, typeof RunnerInterrupt]>;
81
+ export declare const WorkerMessage: Schema.Union<[typeof GetUserById, typeof GetPersonById, typeof InitialMessage, typeof GetSpan, typeof RunnerInterrupt, typeof StartStubbornWorker]>;
73
82
  export type WorkerMessage = Schema.Schema.Type<typeof WorkerMessage>;
74
83
  export {};
75
84
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;;;;;;;;;;;;AAEvC,qBAAa,IAAK,SAAQ,SAGxB;CAAG;;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAM/B;CAAG;;;;;;;;;;;;;;;;AAEL,qBAAa,MAAO,SAAQ,WAK1B;CAAG;;;;;;AAEL,qBAAa,aAAc,SAAQ,kBAMjC;CAAG;;;;AAEL,qBAAa,eAAgB,SAAQ,oBAInC;CAAG;;;;;;;AAEL,qBAAa,cAAe,SAAQ,mBAQlC;CAAG;;;;;;;;;;;;AAEL,qBAAa,OAAQ,SAAQ,YAc3B;CAAG;AAEL,eAAO,MAAM,aAAa,yHAAqF,CAAA;AAC/G,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;;;;;;;;;;;;AAEvC,qBAAa,IAAK,SAAQ,SAGxB;CAAG;;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAM/B;CAAG;;;;;;;;;;;;;;;;AAEL,qBAAa,MAAO,SAAQ,WAK1B;CAAG;;;;;;AAEL,qBAAa,aAAc,SAAQ,kBAMjC;CAAG;;;;AAEL,qBAAa,eAAgB,SAAQ,oBAInC;CAAG;;;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAIvC;CAAG;;;;;;;AAEL,qBAAa,cAAe,SAAQ,mBAQlC;CAAG;;;;;;;;;;;;AAEL,qBAAa,OAAQ,SAAQ,YAc3B;CAAG;AAEL,eAAO,MAAM,aAAa,qJAOzB,CAAA;AACD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,CAAA"}
@@ -34,6 +34,12 @@ export class RunnerInterrupt extends Schema.TaggedRequest()('RunnerInterrupt', {
34
34
  payload: {},
35
35
  }) {
36
36
  }
37
+ export class StartStubbornWorker extends Schema.TaggedRequest()('StartStubbornWorker', {
38
+ failure: Schema.Never,
39
+ success: Schema.Struct({ pid: Schema.Number }),
40
+ payload: { blockDuration: Schema.Number },
41
+ }) {
42
+ }
37
43
  export class InitialMessage extends Schema.TaggedRequest()('InitialMessage', {
38
44
  failure: Schema.Never,
39
45
  success: Schema.Void,
@@ -58,5 +64,5 @@ export class GetSpan extends Schema.TaggedRequest()('GetSpan', {
58
64
  payload: {},
59
65
  }) {
60
66
  }
61
- export const WorkerMessage = Schema.Union(GetUserById, GetPersonById, InitialMessage, GetSpan, RunnerInterrupt);
67
+ export const WorkerMessage = Schema.Union(GetUserById, GetPersonById, InitialMessage, GetSpan, RunnerInterrupt, StartStubbornWorker);
62
68
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,MAAM,OAAO,IAAK,SAAQ,MAAM,CAAC,KAAK,CAAO,MAAM,CAAC,CAAC;IACnD,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAEL,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,aAAa,EAAe,CAAC,aAAa,EAAE;IAClF,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC,MAAM;KAClB;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,MAAO,SAAQ,MAAM,CAAC,KAAK,CAAS,QAAQ,CAAC,CAAC;IACzD,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC,UAAU;CACxB,CAAC;CAAG;AAEL,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,aAAa,EAAiB,CAAC,eAAe,EAAE;IACxF,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC,MAAM;KAClB;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,aAAa,EAAmB,CAAC,iBAAiB,EAAE;IAC9F,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC,IAAI;IACpB,OAAO,EAAE,EAAE;CACZ,CAAC;CAAG;AAEL,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,aAAa,EAAkB,CAAC,gBAAgB,EAAE;IAC3F,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC,IAAI;IACpB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,IAAI,EAAE,MAAM,CAAC,UAAU;QACvB,iCAAiC;KAClC;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,OAAQ,SAAQ,MAAM,CAAC,aAAa,EAAW,CAAC,SAAS,EAAE;IACtE,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,MAAM,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CACH;KACF,CAAC;IACF,OAAO,EAAE,EAAE;CACZ,CAAC;CAAG;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,MAAM,OAAO,IAAK,SAAQ,MAAM,CAAC,KAAK,CAAO,MAAM,CAAC,CAAC;IACnD,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAEL,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,aAAa,EAAe,CAAC,aAAa,EAAE;IAClF,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC,MAAM;KAClB;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,MAAO,SAAQ,MAAM,CAAC,KAAK,CAAS,QAAQ,CAAC,CAAC;IACzD,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC,UAAU;CACxB,CAAC;CAAG;AAEL,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,aAAa,EAAiB,CAAC,eAAe,EAAE;IACxF,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC,MAAM;KAClB;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,aAAa,EAAmB,CAAC,iBAAiB,EAAE;IAC9F,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC,IAAI;IACpB,OAAO,EAAE,EAAE;CACZ,CAAC;CAAG;AAEL,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,aAAa,EAAuB,CAAC,qBAAqB,EAAE;IAC1G,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9C,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;CAC1C,CAAC;CAAG;AAEL,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,aAAa,EAAkB,CAAC,gBAAgB,EAAE;IAC3F,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC,IAAI;IACpB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,IAAI,EAAE,MAAM,CAAC,UAAU;QACvB,iCAAiC;KAClC;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,OAAQ,SAAQ,MAAM,CAAC,aAAa,EAAW,CAAC,SAAS,EAAE;IACtE,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,MAAM,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CACH;KACF,CAAC;IACF,OAAO,EAAE,EAAE;CACZ,CAAC;CAAG;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CACvC,WAAW,EACX,aAAa,EACb,cAAc,EACd,OAAO,EACP,eAAe,EACf,mBAAmB,CACpB,CAAA"}
@@ -12,7 +12,7 @@ const WorkerLive = Runner.layerSerialized(WorkerMessage, {
12
12
  GetUserById: (req) => Effect.map(Name, (name) => new User({ id: req.id, name })),
13
13
  // InitialMessage: (req) => Layer.succeed(Name, req.name),
14
14
  InitialMessage: (req) => Effect.gen(function* () {
15
- yield* Effect.addFinalizer(() => Effect.log('closing worker scope'));
15
+ // yield* Effect.addFinalizer(() => Effect.log('closing worker scope'))
16
16
  return Layer.succeed(Name, req.name);
17
17
  }).pipe(Layer.unwrapScoped),
18
18
  // InitialMessage: (req) =>
@@ -36,6 +36,16 @@ const WorkerLive = Runner.layerSerialized(WorkerMessage, {
36
36
  };
37
37
  }).pipe(Effect.withSpan('GetSpan')),
38
38
  RunnerInterrupt: () => Effect.interrupt,
39
+ StartStubbornWorker: ({ blockDuration }) => Effect.gen(function* () {
40
+ // Start a blocking operation that won't respond to normal shutdown signals
41
+ const pid = process.pid;
42
+ yield* Effect.fork(Effect.gen(function* () {
43
+ // Block for the specified duration, ignoring shutdown attempts
44
+ yield* Effect.sleep(`${blockDuration} millis`);
45
+ yield* Effect.log('Stubborn worker finished blocking');
46
+ }).pipe(Effect.uninterruptible));
47
+ return { pid };
48
+ }),
39
49
  }).pipe(Layer.provide(ChildProcessRunner.layer));
40
50
  // }).pipe(Layer.provide(PlatformNode.NodeWorkerRunner.layer))
41
51
  PlatformNode.NodeRuntime.runMain(Runner.launch(WorkerLive));
@@ -1 +1 @@
1
- {"version":3,"file":"serializedWorker.js","sourceRoot":"","sources":["../../../../src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serializedWorker.js","sourceRoot":"","sources":["../../../../src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,21 @@ import * as Worker from '@effect/platform/Worker';
3
3
  import * as Layer from 'effect/Layer';
4
4
  export declare const layerWorker: Layer.Layer<Worker.PlatformWorker, never, never>;
5
5
  export declare const layerManager: Layer.Layer<Worker.WorkerManager, never, never>;
6
+ /**
7
+ * @example
8
+ * ```ts
9
+ * import * as ChildProcess from 'node:child_process'
10
+ * import { Effect, Worker } from '@effect/platform/Worker'
11
+ * import { ChildProcessWorker } from '@livestore/utils/node'
12
+ *
13
+ * Worker.makePoolSerialized<WorkerMessage>({
14
+ * size: 1,
15
+ * initialMessage: () => new InitialMessage({ name: 'test', data: new Uint8Array([1, 2, 3]) }),
16
+ * }).pipe(
17
+ * Effect.provide(ChildProcessWorker.layer(() => ChildProcess.fork(new URL('worker.ts', import.meta.url)))),
18
+ * )
19
+ * ```
20
+ *
21
+ */
6
22
  export declare const layer: (spawn: (id: number) => ChildProcess.ChildProcess) => Layer.Layer<Worker.Spawner | Worker.WorkerManager, never, never>;
7
23
  //# sourceMappingURL=ChildProcessWorker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChildProcessWorker.d.ts","sourceRoot":"","sources":["../../../src/node/ChildProcessRunner/ChildProcessWorker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,YAAY,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AAKjD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAgDrC,eAAO,MAAM,WAAW,kDAA2D,CAAA;AAEnF,eAAO,MAAM,YAAY,iDAAkD,CAAA;AAE3E,eAAO,MAAM,KAAK,GAAI,OAAO,CAAC,EAAE,EAAE,MAAM,KAAK,YAAY,CAAC,YAAY,qEACf,CAAA"}
1
+ {"version":3,"file":"ChildProcessWorker.d.ts","sourceRoot":"","sources":["../../../src/node/ChildProcessRunner/ChildProcessWorker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,YAAY,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AAKjD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AA4IrC,eAAO,MAAM,WAAW,kDAA2D,CAAA;AAEnF,eAAO,MAAM,YAAY,iDAAkD,CAAA;AAE3E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,KAAK,GAAI,OAAO,CAAC,EAAE,EAAE,MAAM,KAAK,YAAY,CAAC,YAAY,qEACf,CAAA"}
@@ -5,16 +5,96 @@ import * as Effect from 'effect/Effect';
5
5
  import * as Exit from 'effect/Exit';
6
6
  import * as Layer from 'effect/Layer';
7
7
  import * as Scope from 'effect/Scope';
8
+ // Track child processes for cleanup on process signals
9
+ const childProcesses = new Set();
10
+ // Force cleanup all tracked child processes
11
+ const forceCleanupChildren = (signal = 'SIGKILL') => {
12
+ for (const child of childProcesses) {
13
+ try {
14
+ if (!child.killed) {
15
+ child.kill(signal);
16
+ }
17
+ }
18
+ catch {
19
+ // Ignore errors during cleanup
20
+ }
21
+ }
22
+ childProcesses.clear();
23
+ };
24
+ // Install signal handlers once to clean up all child processes
25
+ let signalHandlersInstalled = false;
26
+ const installSignalHandlers = () => {
27
+ if (signalHandlersInstalled)
28
+ return;
29
+ signalHandlersInstalled = true;
30
+ // Use 'beforeExit' instead of signal handlers since tests may interfere with signals
31
+ process.on('beforeExit', () => {
32
+ forceCleanupChildren('SIGKILL');
33
+ });
34
+ // Also try to cleanup on uncaught exceptions
35
+ process.on('uncaughtException', () => {
36
+ forceCleanupChildren('SIGKILL');
37
+ });
38
+ // Install signal handlers but make them more robust
39
+ const sigintHandler = () => {
40
+ forceCleanupChildren('SIGINT');
41
+ };
42
+ const sigtermHandler = () => {
43
+ forceCleanupChildren('SIGTERM');
44
+ };
45
+ const exitHandler = () => {
46
+ forceCleanupChildren('SIGKILL');
47
+ };
48
+ // Add handlers that will persist even if tests remove/add other handlers
49
+ process.prependListener('SIGINT', sigintHandler);
50
+ process.prependListener('SIGTERM', sigtermHandler);
51
+ process.prependListener('exit', exitHandler);
52
+ };
8
53
  const platformWorkerImpl = Worker.makePlatform()({
9
54
  setup({ scope, worker: childProcess }) {
10
55
  return Effect.flatMap(Deferred.make(), (exitDeferred) => {
56
+ // Install signal handlers for process-wide cleanup
57
+ installSignalHandlers();
58
+ // Track this child process for cleanup
59
+ childProcesses.add(childProcess);
11
60
  childProcess.on('exit', () => {
61
+ // Remove from tracking when process exits
62
+ childProcesses.delete(childProcess);
12
63
  Deferred.unsafeDone(exitDeferred, Exit.void);
13
64
  });
65
+ childProcess.send(['setup-parent-death-detection', { parentPid: process.pid }]);
14
66
  return Effect.as(Scope.addFinalizer(scope, Effect.suspend(() => {
15
- childProcess.send([1]);
67
+ // Try graceful shutdown first
68
+ try {
69
+ childProcess.send([1]);
70
+ }
71
+ catch {
72
+ // IPC channel might be closed, proceed to forceful termination
73
+ }
16
74
  return Deferred.await(exitDeferred);
17
- }).pipe(Effect.timeout(5000), Effect.interruptible, Effect.catchAllCause(() => Effect.sync(() => childProcess.kill())))), {
75
+ }).pipe(Effect.timeout(3000), // Reduced timeout for faster cleanup
76
+ Effect.interruptible, Effect.catchAllCause(() => Effect.sync(() => {
77
+ // Enhanced cleanup with escalating signals
78
+ if (!childProcess.killed) {
79
+ try {
80
+ // First try SIGTERM
81
+ childProcess.kill('SIGTERM');
82
+ // If still running after a short delay, use SIGKILL
83
+ setTimeout(() => {
84
+ if (!childProcess.killed) {
85
+ childProcess.kill('SIGKILL');
86
+ }
87
+ }, 1000);
88
+ }
89
+ catch {
90
+ // Process might already be dead
91
+ }
92
+ finally {
93
+ // Ensure it's removed from tracking
94
+ childProcesses.delete(childProcess);
95
+ }
96
+ }
97
+ })))), {
18
98
  postMessage: (message) => childProcess.send(message),
19
99
  on: (event, handler) => childProcess.on(event, handler),
20
100
  });
@@ -38,5 +118,21 @@ const platformWorkerImpl = Worker.makePlatform()({
38
118
  });
39
119
  export const layerWorker = Layer.succeed(Worker.PlatformWorker, platformWorkerImpl);
40
120
  export const layerManager = Layer.provide(Worker.layerManager, layerWorker);
121
+ /**
122
+ * @example
123
+ * ```ts
124
+ * import * as ChildProcess from 'node:child_process'
125
+ * import { Effect, Worker } from '@effect/platform/Worker'
126
+ * import { ChildProcessWorker } from '@livestore/utils/node'
127
+ *
128
+ * Worker.makePoolSerialized<WorkerMessage>({
129
+ * size: 1,
130
+ * initialMessage: () => new InitialMessage({ name: 'test', data: new Uint8Array([1, 2, 3]) }),
131
+ * }).pipe(
132
+ * Effect.provide(ChildProcessWorker.layer(() => ChildProcess.fork(new URL('worker.ts', import.meta.url)))),
133
+ * )
134
+ * ```
135
+ *
136
+ */
41
137
  export const layer = (spawn) => Layer.merge(layerManager, Worker.layerSpawner(spawn));
42
138
  //# sourceMappingURL=ChildProcessWorker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChildProcessWorker.js","sourceRoot":"","sources":["../../../src/node/ChildProcessRunner/ChildProcessWorker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChildProcessWorker.js","sourceRoot":"","sources":["../../../src/node/ChildProcessRunner/ChildProcessWorker.ts"],"names":[],"mappings":"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"}
package/dist/node/mod.js CHANGED
@@ -27,8 +27,8 @@ export const getFreePort = Effect.async((cb, signal) => {
27
27
  }
28
28
  });
29
29
  // Error handling in case the server encounters an error
30
- server.on('error', (err) => {
31
- server.close(() => cb(Effect.fail(new UnknownError({ cause: err }))));
30
+ server.on('error', (cause) => {
31
+ server.close(() => cb(Effect.fail(new UnknownError({ cause, payload: 'Failed to get a free port' }))));
32
32
  });
33
33
  });
34
34
  export const OtelLiveDummy = Layer.suspend(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAC7D,OAAO,KAAK,YAAY,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,kBAAkB,MAAM,4CAA4C,CAAA;AAChF,OAAO,KAAK,kBAAkB,MAAM,4CAA4C,CAAA;AAEhF,yCAAyC;AACzC,6EAA6E;AAE7E,6EAA6E;AAE7E,MAAM,CAAC,MAAM,WAAW,GAAwC,MAAM,CAAC,KAAK,CAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;IAChH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IAElC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAC,CAAA;IAEF,4CAA4C;IAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;QAEhC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAuC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;IAClF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;IAE7E,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CACvF,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CACnC,CAAA;IAED,OAAO,WAAW,CAAA;AACpB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAC7D,OAAO,KAAK,YAAY,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,kBAAkB,MAAM,4CAA4C,CAAA;AAChF,OAAO,KAAK,kBAAkB,MAAM,4CAA4C,CAAA;AAEhF,yCAAyC;AACzC,6EAA6E;AAE7E,6EAA6E;AAE7E,MAAM,CAAC,MAAM,WAAW,GAAwC,MAAM,CAAC,KAAK,CAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;IAChH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IAElC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAC,CAAA;IAEF,4CAA4C;IAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;QAEhC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAuC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;IAClF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;IAE7E,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CACvF,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CACnC,CAAA;IAED,OAAO,WAAW,CAAA;AACpB,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@livestore/utils",
3
- "version": "0.4.0-dev.5",
3
+ "version": "0.4.0-dev.6",
4
4
  "type": "module",
5
5
  "sideEffects": [
6
- "./src/global.ts"
6
+ "./src/global.ts",
7
+ "./dist/global.js"
7
8
  ],
8
9
  "exports": {
9
10
  ".": {
@@ -75,7 +76,7 @@
75
76
  "@effect/cli": "^0.69.2",
76
77
  "@effect/cluster": "^0.48.2",
77
78
  "@effect/experimental": "^0.54.6",
78
- "@effect/opentelemetry": "0.56.4",
79
+ "@effect/opentelemetry": "^0.56.4",
79
80
  "@effect/platform": "^0.90.6",
80
81
  "@effect/platform-browser": "^0.70.0",
81
82
  "@effect/platform-bun": "^0.79.0",
@@ -85,15 +86,12 @@
85
86
  "@effect/rpc": "^0.69.1",
86
87
  "@effect/sql": "^0.44.2",
87
88
  "@effect/typeclass": "^0.36.0",
88
- "@opentelemetry/api": "1.9.0",
89
+ "@opentelemetry/api": "^1.9.0",
89
90
  "@opentelemetry/resources": "^2.0.1",
90
- "effect": "3.17.9"
91
+ "effect": "^3.17.9"
91
92
  },
92
93
  "publishConfig": {
93
- "access": "public",
94
- "sideEffects": [
95
- "./dist/global.js"
96
- ]
94
+ "access": "public"
97
95
  },
98
96
  "react-native": "./dist/index.js",
99
97
  "scripts": {
@@ -1,6 +1,18 @@
1
1
  import * as OtelTracer from '@effect/opentelemetry/Tracer'
2
- import type { Context, Duration, Stream } from 'effect'
3
- import { Cause, Deferred, Effect, Fiber, FiberRef, HashSet, Logger, pipe, Scope } from 'effect'
2
+ import {
3
+ Cause,
4
+ type Context,
5
+ Deferred,
6
+ Duration,
7
+ Effect,
8
+ Fiber,
9
+ FiberRef,
10
+ HashSet,
11
+ Logger,
12
+ pipe,
13
+ Scope,
14
+ type Stream,
15
+ } from 'effect'
4
16
  import type { UnknownException } from 'effect/Cause'
5
17
  import { log } from 'effect/Console'
6
18
  import type { LazyArg } from 'effect/Function'
@@ -166,7 +178,7 @@ export const logDuration =
166
178
  const start = Date.now()
167
179
  const res = yield* eff
168
180
  const end = Date.now()
169
- yield* Effect.log(`${label}: ${end - start}ms`)
181
+ yield* Effect.log(`${label}: ${Duration.format(end - start)}`)
170
182
  return res
171
183
  })
172
184
 
@@ -118,6 +118,7 @@ export const makeProtocolSocketWithIsConnected = (options: {
118
118
  ) {
119
119
  return
120
120
  }
121
+ // yield* Effect.logError('Error in socket', cause)
121
122
  return yield* writeResponse({
122
123
  _tag: 'ClientProtocolError',
123
124
  error: new RpcClientError.RpcClientError({
@@ -66,6 +66,7 @@ export {
66
66
  Equal,
67
67
  ExecutionStrategy,
68
68
  Exit,
69
+ FastCheck,
69
70
  Fiber,
70
71
  FiberHandle,
71
72
  FiberId,
package/src/mod.ts CHANGED
@@ -234,4 +234,13 @@ export const isPromise = (value: any): value is Promise<unknown> => typeof value
234
234
 
235
235
  export const isIterable = <T>(value: any): value is Iterable<T> => typeof value?.[Symbol.iterator] === 'function'
236
236
 
237
+ /** This utility "lies" as a means of compat with libs that don't explicitly type optionals as unioned with `undefined`. */
238
+ export const omitUndefineds = <T extends Record<keyof any, unknown>>(
239
+ rec: T,
240
+ ): {
241
+ [K in keyof T]: Exclude<T[K], undefined>
242
+ } => {
243
+ return rec as never
244
+ }
245
+
237
246
  export { objectToString as errorToString } from './misc.ts'
@@ -13,6 +13,43 @@ import * as Layer from 'effect/Layer'
13
13
  import * as Runtime from 'effect/Runtime'
14
14
  import * as Scope from 'effect/Scope'
15
15
 
16
+ // Parent death monitoring setup
17
+ let parentDeathDetectionEnabled = false
18
+
19
+ const setupParentDeathMonitoring = (parentPid: number) => {
20
+ if (parentDeathDetectionEnabled) return
21
+ parentDeathDetectionEnabled = true
22
+
23
+ let consecutiveFailures = 0
24
+ const maxFailures = 3 // Require 3 consecutive failures before self-terminating
25
+
26
+ // Check if parent is still alive every 2 seconds (more conservative)
27
+ const checkParentAlive = () => {
28
+ try {
29
+ // Send signal 0 to check if process exists (doesn't actually send signal)
30
+ process.kill(parentPid, 0)
31
+ // If we reach here, parent is still alive, reset failure counter and check again later
32
+ consecutiveFailures = 0
33
+ setTimeout(checkParentAlive, 2000)
34
+ } catch {
35
+ consecutiveFailures++
36
+ console.warn(`[Worker ${process.pid}] Parent check failed (${consecutiveFailures}/${maxFailures})`)
37
+
38
+ if (consecutiveFailures >= maxFailures) {
39
+ // Parent process has been gone for multiple checks, self-terminate
40
+ console.error(`[Worker ${process.pid}] Parent process ${parentPid} confirmed dead, self-terminating`)
41
+ process.exit(0)
42
+ } else {
43
+ // Try again sooner on failure
44
+ setTimeout(checkParentAlive, 1000)
45
+ }
46
+ }
47
+ }
48
+
49
+ // Start monitoring after a longer initial delay to let things settle
50
+ setTimeout(checkParentAlive, 5000)
51
+ }
52
+
16
53
  const platformRunnerImpl = Runner.PlatformRunner.of({
17
54
  [Runner.PlatformRunnerTypeId]: Runner.PlatformRunnerTypeId,
18
55
  start<I, O>(closeLatch: typeof CloseLatch.Service) {
@@ -43,18 +80,30 @@ const platformRunnerImpl = Runner.PlatformRunner.of({
43
80
  Deferred.unsafeDone(closeLatch, Exit.die(exit.cause))
44
81
  }
45
82
  }
46
- port.on('message', (message: Runner.BackingRunner.Message<I>) => {
83
+ port.on('message', (message: Runner.BackingRunner.Message<I> | any) => {
47
84
  // console.log('message', message)
48
- if (message[0] === 0) {
49
- const result = handler(0, message[1])
50
- if (Effect.isEffect(result)) {
51
- const fiber = runFork(result)
52
- fiber.addObserver(onExit)
53
- FiberSet.unsafeAdd(fiberSet, fiber)
85
+
86
+ // Handle parent death detection setup messages
87
+ if (Array.isArray(message) && message[0] === 'setup-parent-death-detection' && message[1]?.parentPid) {
88
+ const parentPid = message[1].parentPid
89
+ // console.log(`[Worker ${process.pid}] Setting up parent death detection for parent ${parentPid}`)
90
+ setupParentDeathMonitoring(parentPid)
91
+ return
92
+ }
93
+
94
+ // Handle normal Effect worker messages
95
+ if (Array.isArray(message) && typeof message[0] === 'number') {
96
+ if (message[0] === 0) {
97
+ const result = handler(0, message[1])
98
+ if (Effect.isEffect(result)) {
99
+ const fiber = runFork(result)
100
+ fiber.addObserver(onExit)
101
+ FiberSet.unsafeAdd(fiberSet, fiber)
102
+ }
103
+ } else {
104
+ Deferred.unsafeDone(closeLatch, Exit.void)
105
+ port.close()
54
106
  }
55
- } else {
56
- Deferred.unsafeDone(closeLatch, Exit.void)
57
- port.close()
58
107
  }
59
108
  })
60
109
  port.on('messageerror', (cause) => {