@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.
- package/dist/.tsbuildinfo.json +1 -1
- package/dist/effect/Effect.d.ts +1 -2
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +2 -2
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/RpcClient.d.ts.map +1 -1
- package/dist/effect/RpcClient.js +1 -0
- package/dist/effect/RpcClient.js.map +1 -1
- package/dist/effect/index.d.ts +1 -1
- package/dist/effect/index.d.ts.map +1 -1
- package/dist/effect/index.js +1 -1
- package/dist/effect/index.js.map +1 -1
- package/dist/mod.d.ts +2 -0
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +4 -0
- package/dist/mod.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js +54 -10
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +182 -3
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +12 -3
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +7 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +11 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +16 -0
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js +98 -2
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
- package/dist/node/mod.js +2 -2
- package/dist/node/mod.js.map +1 -1
- package/package.json +7 -9
- package/src/effect/Effect.ts +15 -3
- package/src/effect/RpcClient.ts +1 -0
- package/src/effect/index.ts +1 -0
- package/src/mod.ts +9 -0
- package/src/node/ChildProcessRunner/ChildProcessRunner.ts +59 -10
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +253 -3
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +14 -1
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +14 -1
- package/src/node/ChildProcessRunner/ChildProcessWorker.ts +111 -3
- 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,
|
|
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,
|
|
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":"AAAA,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/D,wEAAwE;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKzD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAe,MAAM,CAAC,CAAA;AAErD,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,aAAa,EAAE;IACvD,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QACrB,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACzE,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACzE,CAAA;IACH,CAAC;IACD,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,0DAA0D;IAC1D,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,
|
|
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;
|
|
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
|
-
|
|
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(
|
|
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":"AACA,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,MAAM,kBAAkB,GAAG,MAAM,CAAC,YAAY,EAA6B,CAAC;IAC1E,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE;QACnC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAqB,EAAE,CAAC,YAAY,EAAE,EAAE;YACzE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC3B,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9C,CAAC,CAAC,CAAA;
|
|
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', (
|
|
31
|
-
server.close(() => cb(Effect.fail(new UnknownError({ cause:
|
|
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(() => {
|
package/dist/node/mod.js.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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": {
|
package/src/effect/Effect.ts
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import * as OtelTracer from '@effect/opentelemetry/Tracer'
|
|
2
|
-
import
|
|
3
|
-
|
|
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}
|
|
181
|
+
yield* Effect.log(`${label}: ${Duration.format(end - start)}`)
|
|
170
182
|
return res
|
|
171
183
|
})
|
|
172
184
|
|
package/src/effect/RpcClient.ts
CHANGED
|
@@ -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({
|
package/src/effect/index.ts
CHANGED
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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) => {
|