stitchkit 0.74.1 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-runtime/sqlite-purge.d.ts +3 -3
- package/dist/agent-runtime/sqlite-purge.d.ts.map +1 -1
- package/dist/agent-runtime/sqlite.d.ts +5 -17
- package/dist/agent-runtime/sqlite.d.ts.map +1 -1
- package/dist/agent-runtime-coding-tools.js +2 -1
- package/dist/agent-runtime-harness.js +5 -4
- package/dist/agent-runtime-sqlite-bun.d.ts +1 -1
- package/dist/agent-runtime-sqlite-bun.d.ts.map +1 -1
- package/dist/agent-runtime-sqlite-node.d.ts +1 -1
- package/dist/agent-runtime-sqlite-node.d.ts.map +1 -1
- package/dist/agent-runtime.js +8 -7
- package/dist/application/keyspace-sqlite.d.ts +31 -0
- package/dist/application/keyspace-sqlite.d.ts.map +1 -0
- package/dist/application/keyspace.d.ts +142 -0
- package/dist/application/keyspace.d.ts.map +1 -0
- package/dist/application/watch-hub.d.ts +113 -0
- package/dist/application/watch-hub.d.ts.map +1 -0
- package/dist/application.d.ts +4 -0
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +455 -0
- package/dist/cli.js +7 -6
- package/dist/contract/index.js +2 -1
- package/dist/{index-aczggrty.js → index-28jsdwt1.js} +1 -1
- package/dist/index-35z5h2ty.js +594 -0
- package/dist/{index-f6n5n7nz.js → index-4kp4fxvp.js} +4 -18
- package/dist/{index-118v0z41.js → index-52400rdd.js} +8 -3
- package/dist/{index-da1aqnhb.js → index-65kathdm.js} +6 -4
- package/dist/{index-jqtsc9mj.js → index-6wr9f6qm.js} +2 -2
- package/dist/{index-7qy2ex0m.js → index-885chjxq.js} +1 -1
- package/dist/{index-k2zczx1g.js → index-9c5dbr5q.js} +1 -1
- package/dist/{index-s2rchahr.js → index-9my2n66s.js} +4 -4
- package/dist/{index-nemjkxjp.js → index-e0a57ymn.js} +1 -1
- package/dist/{index-vbf2p6me.js → index-endzd8sj.js} +1 -1
- package/dist/{index-vj3vvpaa.js → index-hsz2mmk0.js} +1 -17
- package/dist/{index-s4c8wy8m.js → index-k68e5jz0.js} +2 -2
- package/dist/index-rxfy4cq7.js +17 -0
- package/dist/{index-58jzmnn4.js → index-v5dm4bwq.js} +1 -1
- package/dist/{index-m668wzyc.js → index-v7xjfy10.js} +1 -1
- package/dist/index-vdvmcy7r.js +22 -0
- package/dist/{index-ezmn6ac6.js → index-xgahrwdf.js} +3 -3
- package/dist/index.js +26 -611
- package/dist/internal/sqlite.d.ts +27 -0
- package/dist/internal/sqlite.d.ts.map +1 -0
- package/dist/internal/stable-digest.d.ts +24 -0
- package/dist/internal/stable-digest.d.ts.map +1 -0
- package/dist/live/events.d.ts +155 -0
- package/dist/live/events.d.ts.map +1 -0
- package/dist/live/watch-client.d.ts +66 -0
- package/dist/live/watch-client.d.ts.map +1 -0
- package/dist/live/watch-contract.d.ts +157 -0
- package/dist/live/watch-contract.d.ts.map +1 -0
- package/dist/live.d.ts +18 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +284 -0
- package/dist/node.js +5 -4
- package/dist/observability/index.js +4 -3
- package/dist/primitives.js +2 -1
- package/dist/remote.js +3 -2
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/event-bus.d.ts +49 -1
- package/dist/server/event-bus.d.ts.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +224 -12
- package/dist/server/middleware/trust-fence.d.ts +116 -0
- package/dist/server/middleware/trust-fence.d.ts.map +1 -0
- package/dist/server/types.d.ts +16 -1
- package/dist/server/types.d.ts.map +1 -1
- package/dist/testing.js +3 -2
- package/dist/tool-invoker.js +6 -5
- package/dist/tools/mcp-round.d.ts.map +1 -1
- package/dist/tools.js +15 -30
- package/llms-full.txt +412 -4
- package/llms.txt +1 -0
- package/package.json +6 -2
package/dist/live.js
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LiveStatePhaseSchema,
|
|
3
|
+
LiveStateStopReasonSchema
|
|
4
|
+
} from "./index-35z5h2ty.js";
|
|
5
|
+
import {
|
|
6
|
+
bytesToBase64Url
|
|
7
|
+
} from "./index-rxfy4cq7.js";
|
|
8
|
+
|
|
9
|
+
// src/live/events.ts
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
function assertName(kind, value) {
|
|
12
|
+
if (value.length === 0) {
|
|
13
|
+
throw new Error(`[stitchkit] defineEvents: ${kind} name cannot be empty.`);
|
|
14
|
+
}
|
|
15
|
+
if (/\s/.test(value)) {
|
|
16
|
+
throw new Error(`[stitchkit] defineEvents: ${kind} name "${value}" cannot contain whitespace.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function defineEvents(config, topics) {
|
|
20
|
+
const prefix = config.prefix;
|
|
21
|
+
if (prefix !== undefined)
|
|
22
|
+
assertName("prefix", prefix);
|
|
23
|
+
const declared = {};
|
|
24
|
+
for (const [name, topic] of Object.entries(topics)) {
|
|
25
|
+
assertName("topic", name);
|
|
26
|
+
if (topic.mode === "emit") {
|
|
27
|
+
if (topic.whenAllDefer !== undefined) {
|
|
28
|
+
throw new Error(`[stitchkit] defineEvents: topic "${name}" declares whenAllDefer, which only a 'decision' topic has. Its mode is 'emit'.`);
|
|
29
|
+
}
|
|
30
|
+
if (topic.listenerTimeoutMs !== undefined) {
|
|
31
|
+
throw new Error(`[stitchkit] defineEvents: topic "${name}" declares listenerTimeoutMs, but mode 'emit' never waits for a listener.`);
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
if (topic.listenerTimeoutMs === undefined) {
|
|
35
|
+
throw new Error(`[stitchkit] defineEvents: topic "${name}" has mode '${topic.mode}', which waits for listeners, so it must declare listenerTimeoutMs.`);
|
|
36
|
+
}
|
|
37
|
+
if (!Number.isFinite(topic.listenerTimeoutMs) || topic.listenerTimeoutMs <= 0) {
|
|
38
|
+
throw new Error(`[stitchkit] defineEvents: topic "${name}" declares listenerTimeoutMs ${String(topic.listenerTimeoutMs)}; it must be finite and greater than zero.`);
|
|
39
|
+
}
|
|
40
|
+
if (topic.mode === "decision" && topic.whenAllDefer === undefined) {
|
|
41
|
+
throw new Error(`[stitchkit] defineEvents: topic "${name}" has mode 'decision', so it must declare whenAllDefer: 'allow' or 'deny' — the outcome when every listener defers. There is no default, because a default would decide it silently.`);
|
|
42
|
+
}
|
|
43
|
+
if (topic.mode === "serial" && topic.whenAllDefer !== undefined) {
|
|
44
|
+
throw new Error(`[stitchkit] defineEvents: topic "${name}" declares whenAllDefer, which only a 'decision' topic has. Its mode is 'serial'.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
declared[prefix === undefined ? name : `${prefix}.${name}`] = topic;
|
|
48
|
+
}
|
|
49
|
+
return { prefix, topics: declared };
|
|
50
|
+
}
|
|
51
|
+
function toRealtimeContract(declaration) {
|
|
52
|
+
const serverToClient = {};
|
|
53
|
+
for (const [topic, definition] of Object.entries(declaration.topics)) {
|
|
54
|
+
const schema = definition.schema;
|
|
55
|
+
serverToClient[topic] = { args: z.tuple([schema]) };
|
|
56
|
+
}
|
|
57
|
+
return { serverToClient, clientToServer: {} };
|
|
58
|
+
}
|
|
59
|
+
// src/internal/stable-digest.ts
|
|
60
|
+
function stableValue(value) {
|
|
61
|
+
if (Array.isArray(value))
|
|
62
|
+
return value.map(stableValue);
|
|
63
|
+
if (value === null || typeof value !== "object")
|
|
64
|
+
return value;
|
|
65
|
+
const result = {};
|
|
66
|
+
for (const key of Object.keys(value).sort()) {
|
|
67
|
+
result[key] = stableValue(Reflect.get(value, key));
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
async function argumentsDigest(args) {
|
|
72
|
+
const bytes = new TextEncoder().encode(JSON.stringify(stableValue(args)));
|
|
73
|
+
return bytesToBase64Url(new Uint8Array(await crypto.subtle.digest("SHA-256", bytes)));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/live/watch-contract.ts
|
|
77
|
+
import { z as z2 } from "zod";
|
|
78
|
+
var WatchKeySchema = z2.object({
|
|
79
|
+
service: z2.string().min(1),
|
|
80
|
+
action: z2.string().min(1),
|
|
81
|
+
digest: z2.string().min(1)
|
|
82
|
+
}).strict().readonly();
|
|
83
|
+
var WatchOpenSchema = z2.object({ key: WatchKeySchema, args: z2.unknown() }).readonly();
|
|
84
|
+
var WatchAcceptedSchema = z2.object({
|
|
85
|
+
accepted: z2.boolean(),
|
|
86
|
+
reason: z2.string().optional()
|
|
87
|
+
}).strict().readonly();
|
|
88
|
+
var WatchValueSchema = z2.object({
|
|
89
|
+
key: WatchKeySchema,
|
|
90
|
+
revision: z2.number().int().nonnegative(),
|
|
91
|
+
value: z2.unknown()
|
|
92
|
+
}).readonly();
|
|
93
|
+
var WatchStateSchema = z2.object({
|
|
94
|
+
key: WatchKeySchema,
|
|
95
|
+
phase: LiveStatePhaseSchema,
|
|
96
|
+
reason: LiveStateStopReasonSchema.optional(),
|
|
97
|
+
code: z2.string().optional(),
|
|
98
|
+
message: z2.string().optional()
|
|
99
|
+
}).readonly();
|
|
100
|
+
var WATCH_OPEN = "stitchkit.watch.open";
|
|
101
|
+
var WATCH_CLOSE = "stitchkit.watch.close";
|
|
102
|
+
var WATCH_VALUE = "stitchkit.watch.value";
|
|
103
|
+
var WATCH_STATE = "stitchkit.watch.state";
|
|
104
|
+
var watchContract = {
|
|
105
|
+
serverToClient: {
|
|
106
|
+
[WATCH_VALUE]: { args: z2.tuple([WatchValueSchema]) },
|
|
107
|
+
[WATCH_STATE]: { args: z2.tuple([WatchStateSchema]) }
|
|
108
|
+
},
|
|
109
|
+
clientToServer: {
|
|
110
|
+
[WATCH_OPEN]: { args: z2.tuple([WatchOpenSchema]), ack: WatchAcceptedSchema },
|
|
111
|
+
[WATCH_CLOSE]: { args: z2.tuple([z2.object({ key: WatchKeySchema }).readonly()]) }
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
function watchKeyString(key) {
|
|
115
|
+
return `${key.service}/${key.action}/${key.digest}`;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// src/live/watch-client.ts
|
|
119
|
+
function createWatchClient(contract, config) {
|
|
120
|
+
const entries = new Map;
|
|
121
|
+
const digests = new Map;
|
|
122
|
+
const holdMs = config.holdMs ?? 0;
|
|
123
|
+
const openTimeoutMs = config.openTimeoutMs ?? 1e4;
|
|
124
|
+
const service = contract.meta.prefix;
|
|
125
|
+
config.transport.on(WATCH_VALUE, (frame) => {
|
|
126
|
+
const entry = entries.get(watchKeyString(frame.key));
|
|
127
|
+
if (!entry)
|
|
128
|
+
return;
|
|
129
|
+
if (entry.hasValue && frame.revision <= entry.revision)
|
|
130
|
+
return;
|
|
131
|
+
entry.revision = frame.revision;
|
|
132
|
+
entry.value = frame.value;
|
|
133
|
+
entry.hasValue = true;
|
|
134
|
+
for (const listener of [...entry.listeners])
|
|
135
|
+
listener.value(frame.value);
|
|
136
|
+
});
|
|
137
|
+
config.transport.on(WATCH_STATE, (frame) => {
|
|
138
|
+
const entry = entries.get(watchKeyString(frame.key));
|
|
139
|
+
if (!entry)
|
|
140
|
+
return;
|
|
141
|
+
entry.state = frame;
|
|
142
|
+
for (const listener of [...entry.listeners])
|
|
143
|
+
listener.state?.(frame);
|
|
144
|
+
});
|
|
145
|
+
function cachedDigest(action, args) {
|
|
146
|
+
return digests.get(`${service}/${action}/${JSON.stringify(stableValue(args))}`);
|
|
147
|
+
}
|
|
148
|
+
async function resolveDigest(action, args) {
|
|
149
|
+
const cacheKey = `${service}/${action}/${JSON.stringify(stableValue(args))}`;
|
|
150
|
+
const cached = digests.get(cacheKey);
|
|
151
|
+
if (cached !== undefined)
|
|
152
|
+
return cached;
|
|
153
|
+
const digest = await argumentsDigest(args);
|
|
154
|
+
digests.set(cacheKey, digest);
|
|
155
|
+
return digest;
|
|
156
|
+
}
|
|
157
|
+
function entryFor(key) {
|
|
158
|
+
const id = watchKeyString(key);
|
|
159
|
+
const existing = entries.get(id);
|
|
160
|
+
if (existing) {
|
|
161
|
+
clearTimeout(existing.release);
|
|
162
|
+
existing.release = undefined;
|
|
163
|
+
return existing;
|
|
164
|
+
}
|
|
165
|
+
const entry = {
|
|
166
|
+
key,
|
|
167
|
+
listeners: new Set,
|
|
168
|
+
revision: 0,
|
|
169
|
+
hasValue: false,
|
|
170
|
+
state: { key, phase: "opening" }
|
|
171
|
+
};
|
|
172
|
+
entries.set(id, entry);
|
|
173
|
+
return entry;
|
|
174
|
+
}
|
|
175
|
+
function releaseEntry(entry) {
|
|
176
|
+
if (entry.listeners.size > 0)
|
|
177
|
+
return;
|
|
178
|
+
const drop = () => {
|
|
179
|
+
if (entry.listeners.size > 0)
|
|
180
|
+
return;
|
|
181
|
+
entries.delete(watchKeyString(entry.key));
|
|
182
|
+
config.transport.emit(WATCH_CLOSE, { key: entry.key });
|
|
183
|
+
};
|
|
184
|
+
if (holdMs === 0) {
|
|
185
|
+
drop();
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
entry.release = setTimeout(drop, holdMs);
|
|
189
|
+
entry.release.unref?.();
|
|
190
|
+
}
|
|
191
|
+
function handleFor(action, args) {
|
|
192
|
+
const mine = new Set;
|
|
193
|
+
let entry;
|
|
194
|
+
let opened = false;
|
|
195
|
+
const known = cachedDigest(action, args);
|
|
196
|
+
if (known !== undefined)
|
|
197
|
+
entry = entryFor({ service, action, digest: known });
|
|
198
|
+
const ready = (async () => {
|
|
199
|
+
if (entry)
|
|
200
|
+
return entry;
|
|
201
|
+
const digest = await resolveDigest(action, args);
|
|
202
|
+
entry = entryFor({ service, action, digest });
|
|
203
|
+
return entry;
|
|
204
|
+
})();
|
|
205
|
+
async function open(target) {
|
|
206
|
+
if (opened)
|
|
207
|
+
return;
|
|
208
|
+
opened = true;
|
|
209
|
+
const acknowledgement = await config.transport.request(WATCH_OPEN, { key: target.key, args }, { timeoutMs: openTimeoutMs });
|
|
210
|
+
if (!acknowledgement.accepted) {
|
|
211
|
+
const reason = acknowledgement.reason ?? "the server refused this watch";
|
|
212
|
+
config.onRefused?.(target.key, reason);
|
|
213
|
+
const refusal = {
|
|
214
|
+
key: target.key,
|
|
215
|
+
phase: "unavailable",
|
|
216
|
+
reason: "source-unavailable",
|
|
217
|
+
message: reason
|
|
218
|
+
};
|
|
219
|
+
target.state = refusal;
|
|
220
|
+
for (const listener of [...target.listeners])
|
|
221
|
+
listener.state?.(refusal);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
subscribe(listeners) {
|
|
226
|
+
const registered = listeners;
|
|
227
|
+
mine.add(registered);
|
|
228
|
+
if (entry) {
|
|
229
|
+
entry.listeners.add(registered);
|
|
230
|
+
if (entry.hasValue)
|
|
231
|
+
registered.value(entry.value);
|
|
232
|
+
registered.state?.(entry.state);
|
|
233
|
+
}
|
|
234
|
+
ready.then((target) => {
|
|
235
|
+
if (!mine.has(registered))
|
|
236
|
+
return;
|
|
237
|
+
if (!target.listeners.has(registered)) {
|
|
238
|
+
target.listeners.add(registered);
|
|
239
|
+
if (target.hasValue)
|
|
240
|
+
registered.value(target.value);
|
|
241
|
+
registered.state?.(target.state);
|
|
242
|
+
}
|
|
243
|
+
open(target);
|
|
244
|
+
});
|
|
245
|
+
return () => {
|
|
246
|
+
mine.delete(registered);
|
|
247
|
+
const target = entry;
|
|
248
|
+
if (!target)
|
|
249
|
+
return;
|
|
250
|
+
target.listeners.delete(registered);
|
|
251
|
+
releaseEntry(target);
|
|
252
|
+
};
|
|
253
|
+
},
|
|
254
|
+
close() {
|
|
255
|
+
const target = entry;
|
|
256
|
+
if (!target)
|
|
257
|
+
return;
|
|
258
|
+
for (const listener of mine)
|
|
259
|
+
target.listeners.delete(listener);
|
|
260
|
+
mine.clear();
|
|
261
|
+
releaseEntry(target);
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
const client = {};
|
|
266
|
+
for (const action of Object.keys(contract.endpoints)) {
|
|
267
|
+
client[action] = (args = {}) => handleFor(action, args);
|
|
268
|
+
}
|
|
269
|
+
return client;
|
|
270
|
+
}
|
|
271
|
+
export {
|
|
272
|
+
watchKeyString,
|
|
273
|
+
watchContract,
|
|
274
|
+
toRealtimeContract,
|
|
275
|
+
defineEvents,
|
|
276
|
+
createWatchClient,
|
|
277
|
+
WatchValueSchema,
|
|
278
|
+
WatchStateSchema,
|
|
279
|
+
WatchKeySchema,
|
|
280
|
+
WATCH_VALUE,
|
|
281
|
+
WATCH_STATE,
|
|
282
|
+
WATCH_OPEN,
|
|
283
|
+
WATCH_CLOSE
|
|
284
|
+
};
|
package/dist/node.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
createHandler,
|
|
6
6
|
createSocketIOServer,
|
|
7
7
|
createUnixClientTransport
|
|
8
|
-
} from "./index-
|
|
8
|
+
} from "./index-52400rdd.js";
|
|
9
9
|
import {
|
|
10
10
|
createImplement,
|
|
11
11
|
createImplementRegistry,
|
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
createScopedImplementRegistry,
|
|
15
15
|
implement,
|
|
16
16
|
implementRegistry
|
|
17
|
-
} from "./index-
|
|
18
|
-
import"./index-
|
|
17
|
+
} from "./index-endzd8sj.js";
|
|
18
|
+
import"./index-e0a57ymn.js";
|
|
19
19
|
import"./index-7b188kmz.js";
|
|
20
20
|
import {
|
|
21
21
|
ShutdownOptionsSchema,
|
|
@@ -25,7 +25,8 @@ import {
|
|
|
25
25
|
createServerLifecycle
|
|
26
26
|
} from "./index-3z73fh2c.js";
|
|
27
27
|
import"./index-nt1mp8km.js";
|
|
28
|
-
import"./index-
|
|
28
|
+
import"./index-hsz2mmk0.js";
|
|
29
|
+
import"./index-rxfy4cq7.js";
|
|
29
30
|
import {
|
|
30
31
|
AppError,
|
|
31
32
|
appError,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
redact,
|
|
11
11
|
sanitizePayload,
|
|
12
12
|
truncatePreview
|
|
13
|
-
} from "../index-
|
|
13
|
+
} from "../index-28jsdwt1.js";
|
|
14
14
|
import {
|
|
15
15
|
getRequestContext,
|
|
16
16
|
getTraceId,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
setRequestError,
|
|
22
22
|
setRequestUser,
|
|
23
23
|
wrapInRequestContext
|
|
24
|
-
} from "../index-
|
|
24
|
+
} from "../index-e0a57ymn.js";
|
|
25
25
|
import {
|
|
26
26
|
childSpan,
|
|
27
27
|
createTraceContext,
|
|
@@ -31,7 +31,8 @@ import {
|
|
|
31
31
|
resolvePropagationContext,
|
|
32
32
|
resolveTraceContext
|
|
33
33
|
} from "../index-nt1mp8km.js";
|
|
34
|
-
import"../index-
|
|
34
|
+
import"../index-hsz2mmk0.js";
|
|
35
|
+
import"../index-rxfy4cq7.js";
|
|
35
36
|
import"../index-0w9abg87.js";
|
|
36
37
|
import {
|
|
37
38
|
isRecord
|
package/dist/primitives.js
CHANGED
package/dist/remote.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ApiError,
|
|
3
3
|
createClient
|
|
4
|
-
} from "./index-
|
|
4
|
+
} from "./index-v5dm4bwq.js";
|
|
5
5
|
import"./index-1rxswfbv.js";
|
|
6
6
|
import"./index-nt1mp8km.js";
|
|
7
7
|
import {
|
|
8
8
|
mergeMeta
|
|
9
|
-
} from "./index-
|
|
9
|
+
} from "./index-hsz2mmk0.js";
|
|
10
|
+
import"./index-rxfy4cq7.js";
|
|
10
11
|
import {
|
|
11
12
|
AppError
|
|
12
13
|
} from "./index-0w9abg87.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/server/create.ts"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAId,MAAM,SAAS,CAAC;AAkCjB,wBAAgB,aAAa,CAAC,OAAO,GAAG,OAAO,EAC7C,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAC7B,YAAY,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/server/create.ts"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAId,MAAM,SAAS,CAAC;AAkCjB,wBAAgB,aAAa,CAAC,OAAO,GAAG,OAAO,EAC7C,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAC7B,YAAY,CAAC,OAAO,CAAC,CAujBvB"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import type { EventDecision, EventTopicDeclaration } from '../live/events.js';
|
|
2
|
+
/**
|
|
3
|
+
* A listener's return value.
|
|
4
|
+
*
|
|
5
|
+
* `emit` ignores it, `emitSerial` awaits it, and `decide` reads it as a vote.
|
|
6
|
+
* One registry serves all three, so a listener is registered once no matter how
|
|
7
|
+
* its topic is delivered — a second registration path per mode is a second bus.
|
|
8
|
+
*/
|
|
9
|
+
export type EventHandler<T = unknown> = (data: T) => unknown;
|
|
2
10
|
/** Default event map — untyped string-keyed events (ad-hoc buses). */
|
|
3
11
|
export type DefaultEventMap = Record<string, unknown>;
|
|
4
12
|
/**
|
|
@@ -11,9 +19,38 @@ export type DefaultEventMap = Record<string, unknown>;
|
|
|
11
19
|
* const bus = createEventBus<{ 'user:created': { id: string } }>();
|
|
12
20
|
* bus.emit('user:created', { id: '1' }); // typed
|
|
13
21
|
* ```
|
|
22
|
+
*
|
|
23
|
+
* Pass `topics` from `defineEvents` as well and the bus becomes a **closed**
|
|
24
|
+
* registry that enforces each topic's declared delivery mode: an unknown topic
|
|
25
|
+
* is refused, and so is delivering a topic by a verb its declaration did not
|
|
26
|
+
* choose.
|
|
14
27
|
*/
|
|
15
28
|
export interface EventBus<M extends Record<string, unknown> = DefaultEventMap> {
|
|
29
|
+
/**
|
|
30
|
+
* Announce and continue. Listeners run concurrently, a failing one is
|
|
31
|
+
* isolated, and nothing is awaited. Declared topics: `emit` mode only.
|
|
32
|
+
*/
|
|
16
33
|
emit<K extends keyof M & string>(event: K, data: M[K]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Run listeners one at a time in registration order and wait for all of them.
|
|
36
|
+
* A listener that throws, rejects or outruns its declared
|
|
37
|
+
* `listenerTimeoutMs` is reported to `onListenerError` and the next listener
|
|
38
|
+
* still runs — the caller waits for the sequence, not for every listener to
|
|
39
|
+
* succeed. Requires a declared `serial` topic.
|
|
40
|
+
*/
|
|
41
|
+
emitSerial<K extends keyof M & string>(event: K, data: M[K]): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Collect listeners' votes in registration order and stop at the first
|
|
44
|
+
* `deny`. Requires a declared `decision` topic.
|
|
45
|
+
*
|
|
46
|
+
* Every way a listener can fail to produce a vote resolves to `deny`, and the
|
|
47
|
+
* reason says which: a throw, a rejection, a timeout, or a return value that
|
|
48
|
+
* is not a decision at all. This is the one asymmetry worth stating out loud
|
|
49
|
+
* — for `emit` an isolated failure means "the others carry on", and for a vote
|
|
50
|
+
* the same isolation would mean "counted as consent". A listener that was
|
|
51
|
+
* asked and did not answer has not agreed.
|
|
52
|
+
*/
|
|
53
|
+
decide<K extends keyof M & string>(event: K, data: M[K]): Promise<EventDecision>;
|
|
17
54
|
on<K extends keyof M & string>(event: K, handler: EventHandler<M[K]>): () => void;
|
|
18
55
|
once<K extends keyof M & string>(event: K, handler: EventHandler<M[K]>): () => void;
|
|
19
56
|
off<K extends keyof M & string>(event: K, handler: EventHandler<M[K]>): void;
|
|
@@ -27,6 +64,17 @@ export interface EventBusOptions {
|
|
|
27
64
|
* invisible. Wire it to a logger to surface listener bugs.
|
|
28
65
|
*/
|
|
29
66
|
onListenerError?: (error: unknown, event: string) => void;
|
|
67
|
+
/**
|
|
68
|
+
* The declared topics, from `defineEvents(...).topics`.
|
|
69
|
+
*
|
|
70
|
+
* Supplying them closes the registry: an event not declared is refused rather
|
|
71
|
+
* than delivered to nobody, which is the failure a string-keyed bus cannot
|
|
72
|
+
* report — a publisher with a typo and a subscriber with the right name look
|
|
73
|
+
* exactly like a quiet system. It also supplies `listenerTimeoutMs` and
|
|
74
|
+
* `whenAllDefer`, so those are read from the declaration instead of repeated
|
|
75
|
+
* at every call site where they could disagree.
|
|
76
|
+
*/
|
|
77
|
+
topics?: Readonly<Record<string, EventTopicDeclaration>>;
|
|
30
78
|
}
|
|
31
79
|
export declare function createEventBus<M extends Record<string, unknown> = DefaultEventMap>(options?: EventBusOptions): EventBus<M>;
|
|
32
80
|
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/server/event-bus.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/server/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAkB,MAAM,gBAAgB,CAAC;AAE3F;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;AAE7D,sEAAsE;AACtE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe;IAC3E;;;OAGG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7D;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E;;;;;;;;;;OAUG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACjF,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAClF,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IACpF,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7E,KAAK,IAAI,IAAI,CAAC;CACf;AAYD,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;CAC1D;AAkCD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,EAChF,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CAAC,CAAC,CAAC,CAwKb"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export { type AuthHook, type AuthHookConfig, type AuthRule, type AuthRuleContrib
|
|
|
14
14
|
export { type CookieDef, type CookieOptions, defineCookie, parseCookies, serializeCookie, } from './middleware/cookies.js';
|
|
15
15
|
export { type CorsConfig, corsHeaders, corsPreflightResponse, DEFAULT_CORS_ALLOW_HEADERS, DEFAULT_CORS_EXPOSE_HEADERS, } from './middleware/cors.js';
|
|
16
16
|
export { deriveCodeChallenge, type PkceMethod, verifyPkce } from './middleware/pkce.js';
|
|
17
|
+
export { createTrustFence, isLoopbackAddress, type TrustFence, type TrustFenceConfig, type TrustLane, type TrustRefusal, type TrustRefusalReason, } from './middleware/trust-fence.js';
|
|
17
18
|
export { type MultipartLifecycle, type MultipartResult, parseMultipart } from './multipart.js';
|
|
18
19
|
export { generateOpenApiDocument, type OpenApiConfig, type OpenApiDocument, type OpenApiInfo, type OpenApiServer, openApiRoute, } from './openapi.js';
|
|
19
20
|
export { bindProcessSignals, type ProcessSignalName, type ProcessSignalsBinding, type ProcessSignalsErrorPhase, type ProcessSignalsOptions, type ShutdownTarget, type SignalSource, } from './process-signals.js';
|
|
@@ -26,7 +27,7 @@ export type { SocketIOHandshakeConfig, SocketIOPeerLoaders, SocketIORequestPolic
|
|
|
26
27
|
export { createSocketIOServer, socketIoLane } from './socket-io.js';
|
|
27
28
|
export { type ParseSSEOptions, parseSSE, streamSSE } from './stream.js';
|
|
28
29
|
export { DEFAULT_STREAM_HEARTBEAT_MS, ndjsonRoute, type StreamingFormat, type StreamingRouteOptions, type StreamingSourceContext, sseRoute, streamingRoute, } from './streaming-route.js';
|
|
29
|
-
export type { AuthorizationContext, EffectiveScope, EndpointHandlerContext, Handlers, LifecycleHooks, LoggingConfig, LogOutcome, MethodDef, MultipartFileMetadata, MultipartReceiver, MultipartReceiverResult, OperationIdentity, RouteGroup, ScopeContexts, ScopedHandlers, ServiceDef, StitchLogger, StreamingMultipartImplementation, } from './types.js';
|
|
30
|
+
export type { AuthorizationContext, EffectiveScope, EndpointHandlerContext, Handlers, LifecycleHooks, LoggingConfig, LogOutcome, MethodDef, MultipartFileMetadata, MultipartReceiver, MultipartReceiverResult, OperationIdentity, RouteGroup, RouteGroupHooks, ScopeContexts, ScopedHandlers, ServiceDef, StitchLogger, StreamingMultipartImplementation, } from './types.js';
|
|
30
31
|
export { createUnixClientTransport, type UnixClientDeliveryState, type UnixClientTransport, type UnixClientTransportConfig, UnixClientTransportError, type UnixClientTransportErrorCode, type UnixResponseBodyMode, } from './unix-client.js';
|
|
31
32
|
export { type ComposedLane, composeWebSocketHandlers, type WebSocketComposeConfig, type WebSocketLane, webSocketLane, } from './websocket.js';
|
|
32
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|