@antelopejs/interface-core 0.0.9 → 0.0.11
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/errors.d.ts +12 -0
- package/dist/errors.js +21 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -9
- package/dist/index.js +91 -25
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +87 -12
- package/dist/internal.js +108 -21
- package/dist/internal.js.map +1 -1
- package/dist/modules.d.ts +6 -0
- package/dist/modules.js +67 -28
- package/dist/modules.js.map +1 -1
- package/dist/proxies.d.ts +64 -129
- package/dist/proxies.js +372 -220
- package/dist/proxies.js.map +1 -1
- package/dist/runtime.js +2 -2
- package/dist/runtime.js.map +1 -1
- package/dist/tests/generation-cleanup.test.d.ts +1 -0
- package/dist/tests/generation-cleanup.test.js +116 -0
- package/dist/tests/generation-cleanup.test.js.map +1 -0
- package/dist/tests/implement-interface-validation.test.d.ts +1 -0
- package/dist/tests/implement-interface-validation.test.js +45 -0
- package/dist/tests/implement-interface-validation.test.js.map +1 -0
- package/dist/tests/interface-connections.test.d.ts +1 -0
- package/dist/tests/interface-connections.test.js +36 -0
- package/dist/tests/interface-connections.test.js.map +1 -0
- package/dist/tests/module-ownership-context.test.js +18 -0
- package/dist/tests/module-ownership-context.test.js.map +1 -1
- package/dist/tests/provider-context.test.d.ts +1 -0
- package/dist/tests/provider-context.test.js +117 -0
- package/dist/tests/provider-context.test.js.map +1 -0
- package/dist/tests/provider-routing.test.d.ts +1 -0
- package/dist/tests/provider-routing.test.js +78 -0
- package/dist/tests/provider-routing.test.js.map +1 -0
- package/dist/tests/queue-and-cleanup.test.d.ts +1 -0
- package/dist/tests/queue-and-cleanup.test.js +73 -0
- package/dist/tests/queue-and-cleanup.test.js.map +1 -0
- package/dist/tests/registering-proxy-replay.test.js +9 -0
- package/dist/tests/registering-proxy-replay.test.js.map +1 -1
- package/dist/tests/runtime-protocol.test.d.ts +1 -0
- package/dist/tests/runtime-protocol.test.js +49 -0
- package/dist/tests/runtime-protocol.test.js.map +1 -0
- package/dist/tests/runtime.test.js +18 -2
- package/dist/tests/runtime.test.js.map +1 -1
- package/docs/2.proxies.md +18 -1
- package/docs/5.modules.md +22 -0
- package/package.json +3 -2
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const __1 = require("..");
|
|
5
|
+
const internal_1 = require("../internal");
|
|
6
|
+
const modules_1 = require("../modules");
|
|
7
|
+
describe("bounded queues and resilient cleanup", () => {
|
|
8
|
+
const originalQueueLimit = internal_1.internal.maxPendingOperations;
|
|
9
|
+
let originalReporter;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
originalReporter = internal_1.internal.runtimeErrorReporter;
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
internal_1.internal.maxPendingOperations = originalQueueLimit;
|
|
15
|
+
internal_1.internal.runtimeErrorReporter = originalReporter;
|
|
16
|
+
});
|
|
17
|
+
it("bounds missing-provider call queues while preserving queued bootstrap calls", async () => {
|
|
18
|
+
internal_1.internal.maxPendingOperations = 2;
|
|
19
|
+
const proxy = new __1.AsyncProxy("test.call-bound");
|
|
20
|
+
const first = proxy.call(1);
|
|
21
|
+
const second = proxy.call(2);
|
|
22
|
+
const error = await proxy.call(3).then(() => undefined, (reason) => reason);
|
|
23
|
+
(0, chai_1.expect)(error).to.be.instanceOf(__1.ProviderQueueFullError);
|
|
24
|
+
proxy.onCall((value) => value * 2, true);
|
|
25
|
+
(0, chai_1.expect)(await Promise.all([first, second])).to.deep.equal([2, 4]);
|
|
26
|
+
});
|
|
27
|
+
it("bounds queued registrations", () => {
|
|
28
|
+
internal_1.internal.maxPendingOperations = 1;
|
|
29
|
+
const proxy = new __1.RegisteringProxy("test.registration-bound");
|
|
30
|
+
proxy.register("first");
|
|
31
|
+
(0, chai_1.expect)(() => proxy.register("second")).to.throw(__1.ProviderQueueFullError);
|
|
32
|
+
});
|
|
33
|
+
it("continues registration cleanup after an unregister callback throws", () => {
|
|
34
|
+
const proxy = new __1.RegisteringProxy("test.cleanup-errors");
|
|
35
|
+
const unregistered = [];
|
|
36
|
+
const errors = [];
|
|
37
|
+
internal_1.internal.runtimeErrorReporter = (error, details) => {
|
|
38
|
+
errors.push({ error, details });
|
|
39
|
+
};
|
|
40
|
+
(0, modules_1.RunWithModuleContext)({ module: "provider" }, () => {
|
|
41
|
+
proxy.onHandlers(() => undefined, (id) => {
|
|
42
|
+
unregistered.push(id);
|
|
43
|
+
if (id === "first") {
|
|
44
|
+
throw new Error("cleanup failed");
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
(0, modules_1.RunWithModuleContext)({ module: "consumer" }, () => {
|
|
49
|
+
proxy.register("first");
|
|
50
|
+
proxy.register("second");
|
|
51
|
+
});
|
|
52
|
+
modules_1.Events.ModuleDestroyed.emit("consumer");
|
|
53
|
+
(0, chai_1.expect)(unregistered).to.deep.equal(["first", "second"]);
|
|
54
|
+
(0, chai_1.expect)(errors.some(({ details }) => details.operation === "unregister")).to.equal(true);
|
|
55
|
+
});
|
|
56
|
+
it("continues event delivery and reports handler errors", () => {
|
|
57
|
+
const event = new __1.EventProxy("test.event-errors");
|
|
58
|
+
const calls = [];
|
|
59
|
+
const operations = [];
|
|
60
|
+
internal_1.internal.runtimeErrorReporter = (_, details) => {
|
|
61
|
+
operations.push(details.operation);
|
|
62
|
+
};
|
|
63
|
+
event.register(() => {
|
|
64
|
+
calls.push("first");
|
|
65
|
+
throw new Error("event failed");
|
|
66
|
+
});
|
|
67
|
+
event.register(() => calls.push("second"));
|
|
68
|
+
event.emit();
|
|
69
|
+
(0, chai_1.expect)(calls).to.deep.equal(["first", "second"]);
|
|
70
|
+
(0, chai_1.expect)(operations).to.include("event-emit");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=queue-and-cleanup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-and-cleanup.test.js","sourceRoot":"","sources":["../../src/tests/queue-and-cleanup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,5 +43,14 @@ describe("RegisteringProxy onRegister replay", () => {
|
|
|
43
43
|
}, true);
|
|
44
44
|
(0, chai_1.expect)(seen).to.deep.equal(["a", "b"]);
|
|
45
45
|
});
|
|
46
|
+
it("keeps legacy split handlers on the same manual route", () => {
|
|
47
|
+
const proxy = new __1.RegisteringProxy("test.split-manual-handlers");
|
|
48
|
+
const calls = [];
|
|
49
|
+
proxy.onRegister((id) => calls.push(`register:${id}`), true);
|
|
50
|
+
proxy.onUnregister((id) => calls.push(`unregister:${id}`));
|
|
51
|
+
proxy.register("item");
|
|
52
|
+
proxy.unregister("item");
|
|
53
|
+
(0, chai_1.expect)(calls).to.deep.equal(["register:item", "unregister:item"]);
|
|
54
|
+
});
|
|
46
55
|
});
|
|
47
56
|
//# sourceMappingURL=registering-proxy-replay.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registering-proxy-replay.test.js","sourceRoot":"","sources":["../../src/tests/registering-proxy-replay.test.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAC9B,0BAAsC;AACtC,0CAAuC;AAEvC,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,IAAI,aAAkD,CAAC;IAEvD,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,mBAAQ,CAAC,mBAAmB,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,mBAAQ,CAAC,mBAAmB,GAAG,aAAa,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,KAAK,GAAG,IAAI,oBAAgB,EAAqC,CAAC;QACxE,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7B,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE7B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,mBAAQ,CAAC,mBAAmB,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAErE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7D,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,mBAAQ,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,oBAAgB,EAAwB,CAAC;QAC3D,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEpB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAI,EAAE,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"registering-proxy-replay.test.js","sourceRoot":"","sources":["../../src/tests/registering-proxy-replay.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const node_child_process_1 = require("node:child_process");
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const chai_1 = require("chai");
|
|
7
|
+
const __1 = require("..");
|
|
8
|
+
const modules_1 = require("../modules");
|
|
9
|
+
describe("global runtime protocol", () => {
|
|
10
|
+
let copyPath;
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
if (copyPath) {
|
|
13
|
+
(0, node_fs_1.rmSync)((0, node_path_1.dirname)(copyPath), { force: true, recursive: true });
|
|
14
|
+
copyPath = undefined;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
it("converges compatible physical copies and accepts foreign proxy brands", async () => {
|
|
18
|
+
const temporary = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)(process.cwd(), ".interface-core-copy-"));
|
|
19
|
+
copyPath = (0, node_path_1.join)(temporary, "dist");
|
|
20
|
+
(0, node_fs_1.cpSync)((0, node_path_1.join)(__dirname, ".."), copyPath, { recursive: true });
|
|
21
|
+
const foreign = require((0, node_path_1.join)(copyPath, "index.js"));
|
|
22
|
+
const foreignModules = require((0, node_path_1.join)(copyPath, "modules.js"));
|
|
23
|
+
const localProxy = new __1.AsyncProxy("test.cross-copy");
|
|
24
|
+
const foreignProxy = new foreign.AsyncProxy("test.cross-copy");
|
|
25
|
+
(0, chai_1.expect)(foreignProxy).not.to.be.instanceOf(__1.AsyncProxy);
|
|
26
|
+
(0, chai_1.expect)((0, __1.RunWithResponsibleModule)("shared-owner", () => foreign.GetResponsibleModule())).to.equal("shared-owner");
|
|
27
|
+
(0, modules_1.RunWithModuleContext)({ module: "provider", owner: "provider#copy", provider: "provider" }, () => foreign.ImplementInterface({ proxy: localProxy }, {
|
|
28
|
+
proxy: () => foreignModules.GetModuleContext()?.owner ?? "missing",
|
|
29
|
+
}));
|
|
30
|
+
(0, chai_1.expect)(await (0, modules_1.RunWithModuleContext)({
|
|
31
|
+
module: "consumer",
|
|
32
|
+
owner: "consumer#copy",
|
|
33
|
+
providerRoutes: { "async:test.cross-copy": "provider" },
|
|
34
|
+
}, () => foreignProxy.call())).to.equal("provider#copy");
|
|
35
|
+
});
|
|
36
|
+
it("fails clearly when a realm already contains an incompatible protocol", () => {
|
|
37
|
+
const internalPath = (0, node_path_1.join)(__dirname, "..", "internal.js");
|
|
38
|
+
const script = `
|
|
39
|
+
globalThis[Symbol.for("@antelopejs/interface-core/runtime")] = { protocol: 999 };
|
|
40
|
+
require(${JSON.stringify(internalPath)});
|
|
41
|
+
`;
|
|
42
|
+
const result = (0, node_child_process_1.spawnSync)(process.execPath, ["-e", script], {
|
|
43
|
+
encoding: "utf8",
|
|
44
|
+
});
|
|
45
|
+
(0, chai_1.expect)(result.status).not.to.equal(0);
|
|
46
|
+
(0, chai_1.expect)(result.stderr).to.include("Incompatible @antelopejs/interface-core runtime protocol");
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=runtime-protocol.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-protocol.test.js","sourceRoot":"","sources":["../../src/tests/runtime-protocol.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,12 +56,20 @@ describe("runtime interface", () => {
|
|
|
56
56
|
projectPath: "/tmp/project",
|
|
57
57
|
env: "default",
|
|
58
58
|
};
|
|
59
|
-
(0, __1.ImplementInterface)(runtime, {
|
|
59
|
+
(0, __1.ImplementInterface)(runtime, {
|
|
60
|
+
GetRuntimeInfo: () => info,
|
|
61
|
+
RegisterDevServer: () => undefined,
|
|
62
|
+
});
|
|
60
63
|
(0, chai_1.expect)(await (0, runtime_1.GetRuntimeInfo)()).to.deep.equal(info);
|
|
61
64
|
});
|
|
62
65
|
it("passes name and endpoints to the RegisterDevServer implementation", async () => {
|
|
63
66
|
const received = [];
|
|
64
67
|
(0, __1.ImplementInterface)(runtime, {
|
|
68
|
+
GetRuntimeInfo: () => ({
|
|
69
|
+
dev: false,
|
|
70
|
+
projectPath: "/tmp/project",
|
|
71
|
+
env: "test",
|
|
72
|
+
}),
|
|
65
73
|
RegisterDevServer: (name, endpoints) => {
|
|
66
74
|
received.push([name, endpoints]);
|
|
67
75
|
},
|
|
@@ -79,7 +87,10 @@ describe("runtime interface", () => {
|
|
|
79
87
|
projectPath: "/tmp/project",
|
|
80
88
|
env: "production",
|
|
81
89
|
};
|
|
82
|
-
(0, __1.ImplementInterface)(runtime, {
|
|
90
|
+
(0, __1.ImplementInterface)(runtime, {
|
|
91
|
+
GetRuntimeInfo: () => info,
|
|
92
|
+
RegisterDevServer: () => undefined,
|
|
93
|
+
});
|
|
83
94
|
(0, chai_1.expect)(await pending).to.deep.equal(info);
|
|
84
95
|
});
|
|
85
96
|
it("replays RegisterDevServer calls queued before the implementation is attached", async () => {
|
|
@@ -89,6 +100,11 @@ describe("runtime interface", () => {
|
|
|
89
100
|
const pending = (0, runtime_1.RegisterDevServer)("api", endpoints);
|
|
90
101
|
const received = [];
|
|
91
102
|
(0, __1.ImplementInterface)(runtime, {
|
|
103
|
+
GetRuntimeInfo: () => ({
|
|
104
|
+
dev: false,
|
|
105
|
+
projectPath: "/tmp/project",
|
|
106
|
+
env: "test",
|
|
107
|
+
}),
|
|
92
108
|
RegisterDevServer: (name, registered) => {
|
|
93
109
|
received.push([name, registered]);
|
|
94
110
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/tests/runtime.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA8B;AAC9B,0BAAyD;AACzD,oDAAsC;AACtC,wCAKoB;AAMpB,SAAS,gBAAgB;IACvB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,KAAK,GAAI,IAAwB,CAAC,KAAK,CAAC;IAC9C,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,CAAC;AACjB,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,wBAAc,CAAC,CAAC;QAC3B,UAAU,CAAC,2BAAiB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAgB;YACxB,GAAG,EAAE,IAAI;YACT,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,SAAS;SACf,CAAC;QACF,IAAA,sBAAkB,EAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/tests/runtime.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA8B;AAC9B,0BAAyD;AACzD,oDAAsC;AACtC,wCAKoB;AAMpB,SAAS,gBAAgB;IACvB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,KAAK,GAAI,IAAwB,CAAC,KAAK,CAAC;IAC9C,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,CAAC;AACjB,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,wBAAc,CAAC,CAAC;QAC3B,UAAU,CAAC,2BAAiB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAgB;YACxB,GAAG,EAAE,IAAI;YACT,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,SAAS;SACf,CAAC;QACF,IAAA,sBAAkB,EAAC,OAAO,EAAE;YAC1B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;YAC1B,iBAAiB,EAAE,GAAG,EAAE,CAAC,SAAS;SACnC,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,MAAM,IAAA,wBAAc,GAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,QAAQ,GAAyC,EAAE,CAAC;QAC1D,IAAA,sBAAkB,EAAC,OAAO,EAAE;YAC1B,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;gBACrB,GAAG,EAAE,KAAK;gBACV,WAAW,EAAE,cAAc;gBAC3B,GAAG,EAAE,MAAM;aACZ,CAAC;YACF,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;gBACrC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,SAAS,GAAwB;YACrC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;SACpD,CAAC;QACF,MAAM,IAAA,2BAAiB,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE1C,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,OAAO,GAAG,IAAA,wBAAc,GAAE,CAAC;QACjC,MAAM,IAAI,GAAgB;YACxB,GAAG,EAAE,KAAK;YACV,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,YAAY;SAClB,CAAC;QACF,IAAA,sBAAkB,EAAC,OAAO,EAAE;YAC1B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;YAC1B,iBAAiB,EAAE,GAAG,EAAE,CAAC,SAAS;SACnC,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,SAAS,GAAwB;YACrC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;SACpD,CAAC;QACF,MAAM,OAAO,GAAG,IAAA,2BAAiB,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAyC,EAAE,CAAC;QAC1D,IAAA,sBAAkB,EAAC,OAAO,EAAE;YAC1B,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;gBACrB,GAAG,EAAE,KAAK;gBACV,WAAW,EAAE,cAAc;gBAC3B,GAAG,EAAE,MAAM;aACZ,CAAC;YACF,iBAAiB,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE;gBACtC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;YACpC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC;QACd,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/docs/2.proxies.md
CHANGED
|
@@ -31,6 +31,8 @@ const greeting = await proxy.call("Bob"); // "Hello, Bob!"
|
|
|
31
31
|
|
|
32
32
|
Attaches a callback function to the proxy. The proxy automatically tracks the calling module and detaches the callback when that module is unloaded. Pass `manualDetach: true` to disable automatic cleanup.
|
|
33
33
|
|
|
34
|
+
When attachment occurs inside `RunWithModuleContext`, calls execute in the captured provider context rather than the consumer context. The captured module, owner generation, provider, and provider routes remain available across nested calls and `await`. Calls reject with `ModuleContextInvalidatedError` if the captured owner has been destroyed.
|
|
35
|
+
|
|
34
36
|
```ts
|
|
35
37
|
// Automatic cleanup (default) - detaches when the module unloads
|
|
36
38
|
proxy.onCall(myHandler);
|
|
@@ -127,10 +129,14 @@ routeRegistry.unregister("about");
|
|
|
127
129
|
|
|
128
130
|
Attaches the register callback. Any previously registered entries replay through this callback immediately. Automatic module-aware detachment applies unless `manualDetach` is `true`.
|
|
129
131
|
|
|
132
|
+
Register replay and direct registration execute in the provider context captured when the callback attaches.
|
|
133
|
+
|
|
130
134
|
### `onUnregister(callback)`
|
|
131
135
|
|
|
132
136
|
Attaches the unregister callback. This callback is detached at the same time as the register callback.
|
|
133
137
|
|
|
138
|
+
Unregistration executes in the context captured when this callback attaches.
|
|
139
|
+
|
|
134
140
|
### `register(id, ...args)`
|
|
135
141
|
|
|
136
142
|
Registers an entry with the given identifier. If a register callback is attached, it executes immediately. Otherwise, the entry is stored and replayed when a callback is attached. The calling module is tracked for automatic cleanup.
|
|
@@ -208,6 +214,17 @@ const connections = GetInterfaceInstances("database");
|
|
|
208
214
|
const primary = GetInterfaceInstance("database", "primary");
|
|
209
215
|
```
|
|
210
216
|
|
|
217
|
+
Each `InterfaceConnection` includes the provider module ID and whether that provider is selected for unqualified calls:
|
|
218
|
+
|
|
219
|
+
```ts
|
|
220
|
+
interface InterfaceConnection {
|
|
221
|
+
id?: string;
|
|
222
|
+
path: string;
|
|
223
|
+
provider: string;
|
|
224
|
+
selected: boolean;
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
211
228
|
## `GetResponsibleModule`
|
|
212
229
|
|
|
213
230
|
`GetResponsibleModule` inspects the call stack to determine which module is responsible for the current execution. The proxy classes use this internally for automatic cleanup tracking.
|
|
@@ -235,7 +252,7 @@ await RunWithResponsibleModule("my-module", async () => {
|
|
|
235
252
|
|
|
236
253
|
The module loader should wrap known module-owned entry points, including module evaluation and lifecycle hooks. Existing callers need no migration: outside an explicit context, `GetResponsibleModule` retains stack-based resolution as a backward-compatible fallback. Automatic proxy detachment and registration cleanup use the resolved module in both paths.
|
|
237
254
|
|
|
238
|
-
Ownership contexts are scoped to a loaded module generation.
|
|
255
|
+
Ownership contexts are scoped to a loaded module generation. Loaders that can overlap old and replacement instances should use `RunWithModuleContext` and provide a unique `owner` for every generation. `ModuleDestroyed` invalidates and cleans only the active event context's owner while preserving the existing module ID event contract. Detached asynchronous work from that owner then receives a `ModuleContextInvalidatedError`.
|
|
239
256
|
|
|
240
257
|
## Next steps
|
|
241
258
|
|
package/docs/5.modules.md
CHANGED
|
@@ -35,6 +35,26 @@ loaded -> constructed -> active -> constructed -> loaded
|
|
|
35
35
|
| `active` | Module is fully started and providing services |
|
|
36
36
|
| `unknown` | Module status cannot be determined |
|
|
37
37
|
|
|
38
|
+
## Module execution context
|
|
39
|
+
|
|
40
|
+
`RunWithModuleContext` propagates module ownership and provider routing through synchronous and asynchronous work:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { RunWithModuleContext } from "@antelopejs/interface-core/modules";
|
|
44
|
+
|
|
45
|
+
await RunWithModuleContext(
|
|
46
|
+
{
|
|
47
|
+
module: "search-provider",
|
|
48
|
+
owner: "search-provider#42",
|
|
49
|
+
provider: "search-provider",
|
|
50
|
+
providerRoutes: routes,
|
|
51
|
+
},
|
|
52
|
+
() => constructModule(),
|
|
53
|
+
);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`module` remains the stable public module ID. `owner` identifies one lifecycle generation and should be unique when old and replacement instances can overlap. Providers capture this full context when attaching callbacks. `GetModuleContext` returns the active context and throws `ModuleContextInvalidatedError` after its owner is destroyed.
|
|
57
|
+
|
|
38
58
|
## Lifecycle events
|
|
39
59
|
|
|
40
60
|
The `Events` namespace exposes four `EventProxy` instances that fire during module lifecycle transitions.
|
|
@@ -81,6 +101,8 @@ Events.ModuleDestroyed.register((moduleId: string) => {
|
|
|
81
101
|
});
|
|
82
102
|
```
|
|
83
103
|
|
|
104
|
+
The event signature remains the module ID. When emitted inside `RunWithModuleContext`, cleanup targets that context's `owner`; without an explicit owner it retains the module-level behavior used by earlier releases.
|
|
105
|
+
|
|
84
106
|
## Management functions
|
|
85
107
|
|
|
86
108
|
These functions are declared as `InterfaceFunction` proxies. They are available once the core runtime provides their implementation.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antelopejs/interface-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"description": "AntelopeJS core interface primitives - proxies, decorators, interface functions, and logging",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"antelopejs",
|
|
@@ -78,7 +78,8 @@
|
|
|
78
78
|
"lint": "biome check .",
|
|
79
79
|
"prepack": "pnpm run build",
|
|
80
80
|
"release": "pnpm run lint && pnpm run prepack && release-it",
|
|
81
|
-
"test": "pnpm run build && ajs module test ."
|
|
81
|
+
"test": "pnpm run build && ajs module test .",
|
|
82
|
+
"test:package": "node test/package-consumer.mjs"
|
|
82
83
|
},
|
|
83
84
|
"antelopeJs": {
|
|
84
85
|
"test": "src/antelope.test.ts",
|