@emseepea/server 0.24.0 → 0.25.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.
Files changed (63) hide show
  1. package/dist/events-cloud-tasks-transport.d.ts +30 -0
  2. package/dist/events-cloud-tasks-transport.d.ts.map +1 -0
  3. package/dist/events-cloud-tasks-transport.js +213 -0
  4. package/dist/events-cloud-tasks-transport.js.map +1 -0
  5. package/dist/events-google-sdk-guards.d.ts +8 -0
  6. package/dist/events-google-sdk-guards.d.ts.map +1 -0
  7. package/dist/events-google-sdk-guards.js +31 -0
  8. package/dist/events-google-sdk-guards.js.map +1 -0
  9. package/dist/events-google-sdk-lifetime.d.ts +7 -0
  10. package/dist/events-google-sdk-lifetime.d.ts.map +1 -0
  11. package/dist/events-google-sdk-lifetime.js +70 -0
  12. package/dist/events-google-sdk-lifetime.js.map +1 -0
  13. package/dist/events-google-worker-runtime.d.ts +21 -0
  14. package/dist/events-google-worker-runtime.d.ts.map +1 -0
  15. package/dist/events-google-worker-runtime.js +149 -0
  16. package/dist/events-google-worker-runtime.js.map +1 -0
  17. package/dist/events-google-worker.d.ts +4 -0
  18. package/dist/events-google-worker.d.ts.map +1 -0
  19. package/dist/events-google-worker.js +3 -0
  20. package/dist/events-google-worker.js.map +1 -0
  21. package/dist/events-postgres-delivery-migrations.d.ts +18 -0
  22. package/dist/events-postgres-delivery-migrations.d.ts.map +1 -0
  23. package/dist/events-postgres-delivery-migrations.js +146 -0
  24. package/dist/events-postgres-delivery-migrations.js.map +1 -0
  25. package/dist/events-postgres-delivery-owned.d.ts +16 -0
  26. package/dist/events-postgres-delivery-owned.d.ts.map +1 -0
  27. package/dist/events-postgres-delivery-owned.js +178 -0
  28. package/dist/events-postgres-delivery-owned.js.map +1 -0
  29. package/dist/events-postgres-delivery.d.ts +29 -0
  30. package/dist/events-postgres-delivery.d.ts.map +1 -0
  31. package/dist/events-postgres-delivery.js +299 -0
  32. package/dist/events-postgres-delivery.js.map +1 -0
  33. package/dist/events-postgres-dispatch-migrations.d.ts +19 -0
  34. package/dist/events-postgres-dispatch-migrations.d.ts.map +1 -0
  35. package/dist/events-postgres-dispatch-migrations.js +162 -0
  36. package/dist/events-postgres-dispatch-migrations.js.map +1 -0
  37. package/dist/events-postgres-dispatch.d.ts +39 -0
  38. package/dist/events-postgres-dispatch.d.ts.map +1 -0
  39. package/dist/events-postgres-dispatch.js +270 -0
  40. package/dist/events-postgres-dispatch.js.map +1 -0
  41. package/dist/events-postgres-lifecycle-migrations.d.ts +17 -0
  42. package/dist/events-postgres-lifecycle-migrations.d.ts.map +1 -0
  43. package/dist/events-postgres-lifecycle-migrations.js +125 -0
  44. package/dist/events-postgres-lifecycle-migrations.js.map +1 -0
  45. package/dist/events-postgres-lifecycle.d.ts +13 -0
  46. package/dist/events-postgres-lifecycle.d.ts.map +1 -0
  47. package/dist/events-postgres-lifecycle.js +176 -0
  48. package/dist/events-postgres-lifecycle.js.map +1 -0
  49. package/dist/events-postgres-migrations.d.ts +32 -0
  50. package/dist/events-postgres-migrations.d.ts.map +1 -0
  51. package/dist/events-postgres-migrations.js +329 -0
  52. package/dist/events-postgres-migrations.js.map +1 -0
  53. package/dist/events-postgres-owned.d.ts +16 -0
  54. package/dist/events-postgres-owned.d.ts.map +1 -0
  55. package/dist/events-postgres-owned.js +161 -0
  56. package/dist/events-postgres-owned.js.map +1 -0
  57. package/dist/events-postgres.d.ts +53 -0
  58. package/dist/events-postgres.d.ts.map +1 -0
  59. package/dist/events-postgres.js +289 -0
  60. package/dist/events-postgres.js.map +1 -0
  61. package/dist/index.js +58 -9
  62. package/dist/index.js.map +1 -1
  63. package/package.json +33 -5
@@ -0,0 +1,299 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { performance } from 'node:perf_hooks';
3
+ import { normalizeMcpEventDefinitions, mcpEventSubscriptionIdentity, validateMcpEventSubscription } from './events.js';
4
+ import { ExternalMcpEventError } from './events-external.js';
5
+ import { postCheckedWebhook, signWebhook } from './events-webhook.js';
6
+ import { createDeliverySessionOwner } from './events-postgres-delivery-owned.js';
7
+ export { createPostgresEventDeliveryMigrator, PostgresEventDeliveryMigrationError, } from './events-postgres-delivery-migrations.js';
8
+ const columns = 'namespace,source_kind,source_id,subscription_id,generation';
9
+ const predicate = 'namespace=$1 AND source_kind=$2 AND source_id=$3 AND subscription_id=$4 AND generation=$5';
10
+ const values = (k) => [k.namespace, k.source_kind, k.source_id, k.subscription_id, k.generation];
11
+ const dbTime = `pg_catalog.floor(EXTRACT(epoch FROM pg_catalog.clock_timestamp())*1000)::pg_catalog.float8`;
12
+ const terminal = (reason) => ({ outcome: 'terminal', reason });
13
+ const retry = (reason) => ({ outcome: 'retry_pending', reason });
14
+ const unavailable = () => { throw new ExternalMcpEventError('UNAVAILABLE'); };
15
+ function identifier(value) {
16
+ if (typeof value !== 'string' || !value || Buffer.byteLength(value) > 240 || /\u0000|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(value))
17
+ throw new ExternalMcpEventError('INVALID_INPUT');
18
+ return value;
19
+ }
20
+ function canonical(value, depth = 0) {
21
+ if (depth > 32)
22
+ return unavailable();
23
+ if (value === null || typeof value === 'string' || typeof value === 'boolean' || typeof value === 'number' && Number.isFinite(value))
24
+ return value;
25
+ if (Array.isArray(value))
26
+ return Object.freeze(value.map(v => canonical(v, depth + 1)));
27
+ if (!value || typeof value !== 'object' || Object.getPrototypeOf(value) !== Object.prototype)
28
+ return unavailable();
29
+ const result = Object.create(null);
30
+ for (const key of Object.keys(value).sort())
31
+ result[key] = canonical(value[key], depth + 1);
32
+ return Object.freeze(result);
33
+ }
34
+ function acceptedOrTerminal(value) {
35
+ if (value === null)
36
+ return null;
37
+ const reasons = { accepted: 'callback_accepted', suppressed: 'suppressed', gone: 'gone', too_large: 'too_large', exhausted: 'attempts_exhausted' };
38
+ if (typeof value !== 'string' || !Object.hasOwn(reasons, value))
39
+ return unavailable();
40
+ return terminal(reasons[value]);
41
+ }
42
+ /** Call this API only from an authenticated worker service. It creates no HTTP
43
+ * route, timer, provider job, or automatic delivery.
44
+ */
45
+ export function createPostgresEventDelivery(options) {
46
+ return createPostgresEventDeliveryRuntime(options);
47
+ }
48
+ /** Internal test seam: production uses the checked transport above. */
49
+ export function createPostgresEventDeliveryRuntime(options, send = postCheckedWebhook) {
50
+ const namespace = identifier(options?.namespace);
51
+ if (!options.pool || typeof options.pool.connect !== 'function' || typeof options.authorize !== 'function' || !Array.isArray(options.definitions) || !options.definitions.length)
52
+ throw new ExternalMcpEventError('INVALID_INPUT');
53
+ const definitions = normalizeMcpEventDefinitions(options.definitions), owner = createDeliverySessionOwner(options.pool);
54
+ let closing = false, busy = false;
55
+ async function lock(run, k) {
56
+ await run('SELECT revision FROM public.emseepea_event_heads WHERE namespace=$1 AND subscription_id=$2 FOR UPDATE', [namespace, k.subscription_id]);
57
+ const intent = (await run(`SELECT state,event_id FROM public.emseepea_event_intents WHERE ${predicate} FOR UPDATE`, values(k))).rows[0];
58
+ if (!intent)
59
+ return null;
60
+ await run(`INSERT INTO public.emseepea_event_delivery_state(${columns}) VALUES($1,$2,$3,$4,$5) ON CONFLICT(${columns}) DO NOTHING`, values(k));
61
+ const row = (await run(`SELECT reservations,lease_id,terminal,
62
+ pg_catalog.floor(EXTRACT(epoch FROM lease_until)*1000)::pg_catalog.float8 AS lease_until,
63
+ pg_catalog.floor(EXTRACT(epoch FROM due_at)*1000)::pg_catalog.float8 AS due_at
64
+ FROM public.emseepea_event_delivery_state WHERE ${predicate} FOR UPDATE`, values(k))).rows[0];
65
+ if (!row)
66
+ return unavailable();
67
+ row.now = (await run(`SELECT ${dbTime} AS now`)).rows[0]?.now;
68
+ if (!Number.isSafeInteger(row.now) || !Number.isInteger(row.reservations) || Number(row.reservations) < 0 || Number(row.reservations) > 4)
69
+ return unavailable();
70
+ return { intent, row };
71
+ }
72
+ async function snapshot(run, k, includeKeys) {
73
+ const keySelect = includeKeys ? ',key.secret,key.previous_secret,pg_catalog.floor(EXTRACT(epoch FROM key.previous_until)*1000)::pg_catalog.float8 AS previous_until' : '';
74
+ const keyJoin = includeKeys ? 'JOIN public.emseepea_event_keys key ON key.namespace=c.namespace AND key.subscription_id=c.subscription_id AND key.generation=c.generation' : '';
75
+ const rows = (await run(`SELECT s.event_id,s.owner_key,s.event_name,s.payload,
76
+ pg_catalog.floor(EXTRACT(epoch FROM s.occurred_at)*1000)::pg_catalog.float8 AS occurred_at,
77
+ c.arguments,h.url,${dbTime} AS now ${keySelect}
78
+ FROM public.emseepea_event_intents i JOIN public.emseepea_event_sources s ON s.namespace=i.namespace AND s.source_kind=i.source_kind AND s.source_id=i.source_id
79
+ JOIN public.emseepea_event_capture_subscriptions c ON c.namespace=i.namespace AND c.subscription_id=i.subscription_id AND c.generation=i.generation
80
+ JOIN public.emseepea_event_heads h ON h.namespace=c.namespace AND h.subscription_id=c.subscription_id AND h.generation=c.generation ${keyJoin}
81
+ WHERE i.namespace=$1 AND i.source_kind=$2 AND i.source_id=$3 AND i.subscription_id=$4 AND i.generation=$5 AND i.state='pending'
82
+ AND i.event_id=s.event_id AND s.owner_key=c.owner_key AND s.owner_key=h.owner_key AND s.event_name=c.event_name
83
+ AND c.active AND c.expires_at>pg_catalog.clock_timestamp() AND h.url IS NOT NULL`, values(k))).rows;
84
+ return rows.length === 1 ? rows[0] : null;
85
+ }
86
+ function body(row) {
87
+ const definition = definitions.find(v => v.name === row.event_name);
88
+ if (!definition || typeof row.owner_key !== 'string' || typeof row.event_id !== 'string' || !Number.isSafeInteger(row.occurred_at) || !row.payload || typeof row.payload !== 'object' || Array.isArray(row.payload) || !row.arguments || typeof row.arguments !== 'object' || Array.isArray(row.arguments))
89
+ return null;
90
+ const payload = canonical(row.payload), args = canonical(row.arguments);
91
+ if (!definition.payloadSchema.safeParse(payload).success || !definition.inputSchema.safeParse(args).success)
92
+ return null;
93
+ const matched = definition.matches(args, payload, row.owner_key);
94
+ if (typeof matched !== 'boolean') {
95
+ if (matched && typeof matched.then === 'function')
96
+ owner.track(Promise.resolve(matched));
97
+ return unavailable();
98
+ }
99
+ if (!matched)
100
+ return null;
101
+ // Validate but do not substitute a current schema's transformed output.
102
+ return Buffer.from(JSON.stringify({ eventId: row.event_id, name: row.event_name, timestamp: new Date(Number(row.occurred_at)).toISOString(), data: payload, cursor: null }));
103
+ }
104
+ async function finishTerminal(run, k, category) {
105
+ await run(`UPDATE public.emseepea_event_intents SET state=$6 WHERE ${predicate} AND state='pending'`, [...values(k), category === 'suppressed' ? 'revoked' : 'completed']);
106
+ await run(`UPDATE public.emseepea_event_delivery_state SET terminal=$6,lease_id=NULL,lease_until=NULL WHERE ${predicate} AND terminal IS NULL`, [...values(k), category]);
107
+ }
108
+ async function leaseSuppression(run, k, lease) {
109
+ const locked = await lock(run, k);
110
+ if (!locked)
111
+ return terminal('missing');
112
+ const previous = acceptedOrTerminal(locked.row.terminal);
113
+ if (previous)
114
+ return previous;
115
+ if (locked.row.lease_id !== lease || Number(locked.row.lease_until) <= Number(locked.row.now))
116
+ return retry('leased');
117
+ await finishTerminal(run, k, 'suppressed');
118
+ return terminal('suppressed');
119
+ }
120
+ return Object.freeze({
121
+ async deliver(deliveryId, invocation) {
122
+ identifier(deliveryId);
123
+ if (closing)
124
+ return retry('stopping');
125
+ if (busy)
126
+ return retry('unavailable');
127
+ busy = true;
128
+ let sendStarted = false;
129
+ try {
130
+ return await owner.run(invocation, async (session) => {
131
+ const claim = await session.transaction(async (run) => {
132
+ const k = (await run(`SELECT ${columns} FROM public.emseepea_event_intents WHERE namespace=$1 AND delivery_id=$2`, [namespace, deliveryId])).rows[0];
133
+ if (!k)
134
+ return { result: terminal('missing') };
135
+ for (const column of columns.split(','))
136
+ identifier(k[column]);
137
+ const locked = await lock(run, k);
138
+ if (!locked)
139
+ return { result: terminal('missing') };
140
+ const previous = acceptedOrTerminal(locked.row.terminal);
141
+ if (previous)
142
+ return { result: previous };
143
+ if (locked.intent.state !== 'pending') {
144
+ await finishTerminal(run, k, 'suppressed');
145
+ return { result: terminal('suppressed') };
146
+ }
147
+ if (locked.row.lease_id !== null && Number(locked.row.lease_until) > Number(locked.row.now))
148
+ return { result: retry('leased') };
149
+ if (Number(locked.row.reservations) >= 4) {
150
+ await finishTerminal(run, k, 'exhausted');
151
+ return { result: terminal('attempts_exhausted') };
152
+ }
153
+ if (Number(locked.row.due_at) > Number(locked.row.now))
154
+ return { result: retry('not_due') };
155
+ const data = await snapshot(run, k, false);
156
+ if (!data || !body(data)) {
157
+ await finishTerminal(run, k, 'suppressed');
158
+ return { result: terminal('suppressed') };
159
+ }
160
+ const lease = randomUUID();
161
+ await run(`UPDATE public.emseepea_event_delivery_state SET lease_id=$6,lease_until=pg_catalog.to_timestamp(($7::pg_catalog.float8+60000)/1000) WHERE ${predicate}`, [...values(k), lease, locked.row.now]);
162
+ return { lease, data, k };
163
+ });
164
+ if ('result' in claim)
165
+ return claim.result;
166
+ const k = claim.k;
167
+ const allowed = await session.wait(() => options.authorize({ ownerKey: String(claim.data.owner_key), name: String(claim.data.event_name), arguments: canonical(claim.data.arguments), phase: 'delivery' }), 1000);
168
+ if (allowed !== true)
169
+ return session.transaction(run => leaseSuppression(run, k, claim.lease));
170
+ if (session.remaining() < 18000)
171
+ return retry('deadline');
172
+ const reserved = await session.transaction(async (run) => {
173
+ const locked = await lock(run, k);
174
+ if (!locked)
175
+ return { result: terminal('missing') };
176
+ const previous = acceptedOrTerminal(locked.row.terminal);
177
+ if (previous)
178
+ return { result: previous };
179
+ if (locked.row.lease_id !== claim.lease || Number(locked.row.lease_until) <= Number(locked.row.now))
180
+ return { result: retry('leased') };
181
+ if (locked.intent.state !== 'pending') {
182
+ await finishTerminal(run, k, 'suppressed');
183
+ return { result: terminal('suppressed') };
184
+ }
185
+ if (Number(locked.row.reservations) >= 4)
186
+ return { result: retry('leased') };
187
+ const snapshotStart = performance.now(), data = await snapshot(run, k, true);
188
+ if (!data) {
189
+ await finishTerminal(run, k, 'suppressed');
190
+ return { result: terminal('suppressed') };
191
+ }
192
+ const bytes = body(data);
193
+ if (!bytes) {
194
+ await finishTerminal(run, k, 'suppressed');
195
+ return { result: terminal('suppressed') };
196
+ }
197
+ if (bytes.byteLength > 262144) {
198
+ await finishTerminal(run, k, 'too_large');
199
+ return { result: terminal('too_large') };
200
+ }
201
+ if (typeof data.secret !== 'string' || typeof data.url !== 'string' || !Number.isSafeInteger(data.now))
202
+ return unavailable();
203
+ try {
204
+ const valid = validateMcpEventSubscription(definitions, { name: data.event_name, arguments: data.arguments, delivery: { mode: 'webhook', url: data.url, secret: data.secret } });
205
+ if (valid.url !== data.url || mcpEventSubscriptionIdentity(String(data.owner_key), String(data.event_name), data.arguments, data.url) !== k.subscription_id)
206
+ return unavailable();
207
+ if (data.previous_secret !== null)
208
+ validateMcpEventSubscription(definitions, { name: data.event_name, arguments: data.arguments, delivery: { mode: 'webhook', url: data.url, secret: data.previous_secret } });
209
+ }
210
+ catch {
211
+ return unavailable();
212
+ }
213
+ if (session.remaining() < 16000 || Number(locked.row.lease_until) - Number(data.now) - (performance.now() - snapshotStart) < 16000)
214
+ return { result: retry('deadline') };
215
+ const reservation = randomUUID(), attempt = Number(locked.row.reservations) + 1;
216
+ await run(`INSERT INTO public.emseepea_event_delivery_attempts(${columns},attempt,reservation_id,lease_id,reserved_at,outcome)
217
+ VALUES($1,$2,$3,$4,$5,$6,$7,$8,pg_catalog.to_timestamp($9::pg_catalog.float8/1000),'reserved')`, [...values(k), attempt, reservation, claim.lease, data.now]);
218
+ await run(`UPDATE public.emseepea_event_delivery_state SET reservations=$6 WHERE ${predicate}`, [...values(k), attempt]);
219
+ return { reservation, attempt, data, bytes, snapshotStart, leaseUntil: Number(locked.row.lease_until) };
220
+ });
221
+ if ('result' in reserved)
222
+ return reserved.result;
223
+ session.check();
224
+ if (session.remaining() < 15000 || reserved.leaseUntil - Number(reserved.data.now) - (performance.now() - reserved.snapshotStart) < 15000)
225
+ return retry('deadline');
226
+ const timestamp = Math.floor(Number(reserved.data.now) / 1000), eventId = String(reserved.data.event_id);
227
+ const primary = signWebhook(String(reserved.data.secret), eventId, timestamp, reserved.bytes);
228
+ const previous = typeof reserved.data.previous_secret === 'string' && Number(reserved.data.previous_until) > Number(reserved.data.now) ? ` ${signWebhook(reserved.data.previous_secret, eventId, timestamp, reserved.bytes)}` : '';
229
+ let status = 0;
230
+ try {
231
+ const response = await session.wait(() => { sendStarted = true; return send(String(reserved.data.url), reserved.bytes, { 'webhook-id': eventId, 'webhook-timestamp': String(timestamp), 'webhook-signature': primary + previous, 'X-MCP-Subscription-Id': String(k.subscription_id) }); }, 10000);
232
+ if (!Number.isInteger(response.status) || response.status < 100 || response.status > 599)
233
+ return retry('unknown_outcome');
234
+ status = response.status;
235
+ }
236
+ catch {
237
+ return retry('unknown_outcome');
238
+ }
239
+ return session.transaction(async (run) => {
240
+ const locked = await lock(run, k);
241
+ if (!locked)
242
+ return terminal('missing');
243
+ const old = acceptedOrTerminal(locked.row.terminal);
244
+ if (old)
245
+ return old;
246
+ if (locked.row.lease_id !== claim.lease || Number(locked.row.lease_until) <= Number(locked.row.now))
247
+ return retry('leased');
248
+ const attemptRow = (await run(`SELECT reservation_id FROM public.emseepea_event_delivery_attempts WHERE ${predicate} AND attempt=$6 FOR UPDATE`, [...values(k), reserved.attempt])).rows[0];
249
+ if (attemptRow?.reservation_id !== reserved.reservation)
250
+ return retry('leased');
251
+ const accepted = status >= 200 && status < 300;
252
+ await run(`UPDATE public.emseepea_event_delivery_attempts SET outcome=$7,status=$8 WHERE ${predicate} AND attempt=$6`, [...values(k), reserved.attempt, accepted ? 'accepted' : status === 410 || status === 413 ? 'terminal' : 'failed', status >= 100 && status <= 599 ? status : null]);
253
+ if (locked.intent.state !== 'pending') {
254
+ await finishTerminal(run, k, 'suppressed');
255
+ return terminal('suppressed');
256
+ }
257
+ if (accepted) {
258
+ await finishTerminal(run, k, 'accepted');
259
+ return terminal('callback_accepted');
260
+ }
261
+ if (status === 410 || status === 413) {
262
+ await finishTerminal(run, k, status === 410 ? 'gone' : 'too_large');
263
+ return terminal(status === 410 ? 'gone' : 'too_large');
264
+ }
265
+ if (reserved.attempt >= 4) {
266
+ await finishTerminal(run, k, 'exhausted');
267
+ return terminal('attempts_exhausted');
268
+ }
269
+ const delay = [1000, 5000, 25000][reserved.attempt - 1];
270
+ await run(`UPDATE public.emseepea_event_delivery_state SET lease_id=NULL,lease_until=NULL,due_at=pg_catalog.to_timestamp(($6::pg_catalog.float8+$7::pg_catalog.int4)/1000) WHERE ${predicate}`, [...values(k), locked.row.now, delay]);
271
+ return retry('callback_failed');
272
+ });
273
+ });
274
+ }
275
+ catch (error) {
276
+ if (sendStarted)
277
+ return retry('unknown_outcome');
278
+ if (error instanceof ExternalMcpEventError) {
279
+ if (error.code === 'INVALID_INPUT')
280
+ throw error;
281
+ if (error.code === 'OUTCOME_UNKNOWN')
282
+ return retry('unknown_outcome');
283
+ if (error.code === 'DEADLINE')
284
+ return retry('deadline');
285
+ if (error.code === 'ABORTED')
286
+ return retry(closing ? 'stopping' : 'aborted');
287
+ }
288
+ return retry('unavailable');
289
+ }
290
+ finally {
291
+ // Visible UNKNOWN can precede raw policy/SQL/HTTP settlement. Retain private admission.
292
+ void owner.quiesce().then(drained => { if (drained)
293
+ busy = false; }, () => { });
294
+ }
295
+ },
296
+ settle(invocation) { closing = true; return owner.settle(invocation); },
297
+ });
298
+ }
299
+ //# sourceMappingURL=events-postgres-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-delivery.js","sourceRoot":"","sources":["../src/events-postgres-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type OwnedEventPool } from './events-postgres-owned.js';
2
+ import type { ExternalMcpEventInvocation } from './events-external.js';
3
+ export declare class PostgresEventDispatchMigrationError extends Error {
4
+ readonly code: 'INCOMPATIBLE_SCHEMA' | 'UNAVAILABLE' | 'OUTCOME_UNKNOWN';
5
+ readonly phase: 'capture' | 'lifecycle' | 'delivery' | 'dispatch';
6
+ readonly captureCommitted: boolean;
7
+ readonly lifecycleCommitted: boolean;
8
+ readonly deliveryCommitted: boolean;
9
+ constructor(code: 'INCOMPATIBLE_SCHEMA' | 'UNAVAILABLE' | 'OUTCOME_UNKNOWN', phase?: 'capture' | 'lifecycle' | 'delivery' | 'dispatch', captureCommitted?: boolean, lifecycleCommitted?: boolean, deliveryCommitted?: boolean);
10
+ }
11
+ /** Runs the capture, lifecycle, and delivery migrations before the dispatch
12
+ * migration. If a later migration fails, earlier prerequisite schemas can
13
+ * remain installed. Serving constructors never call this function.
14
+ */
15
+ export declare function createPostgresEventDispatchMigrator(pool: OwnedEventPool): Readonly<{
16
+ migrate(invocation: ExternalMcpEventInvocation): Promise<void>;
17
+ settle(invocation: ExternalMcpEventInvocation): Promise<boolean>;
18
+ }>;
19
+ //# sourceMappingURL=events-postgres-dispatch-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-dispatch-migrations.d.ts","sourceRoot":"","sources":["../src/events-postgres-dispatch-migrations.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8B,KAAK,cAAc,EAAiB,MAAM,4BAA4B,CAAC;AAC5G,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,qBAAa,mCAAoC,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAC,qBAAqB,GAAC,aAAa,GAAC,iBAAiB;IAC9E,QAAQ,CAAC,KAAK,EAAC,SAAS,GAAC,WAAW,GAAC,UAAU,GAAC,UAAU;IAC1D,QAAQ,CAAC,gBAAgB;IAAO,QAAQ,CAAC,kBAAkB;IAAO,QAAQ,CAAC,iBAAiB;gBAFxE,IAAI,EAAC,qBAAqB,GAAC,aAAa,GAAC,iBAAiB,EACrE,KAAK,GAAC,SAAS,GAAC,WAAW,GAAC,UAAU,GAAC,UAAqB,EAC5D,gBAAgB,UAAM,EAAU,kBAAkB,UAAM,EAAU,iBAAiB,UAAM;CAGnG;AA4ED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,IAAI,EAAC,cAAc;wBAoClD,0BAA0B;uBACrB,0BAA0B;GAEnD"}
@@ -0,0 +1,162 @@
1
+ import { createPostgresEventDeliveryMigrator, PostgresEventDeliveryMigrationError, } from './events-postgres-delivery-migrations.js';
2
+ import { createOwnedEventOperations } from './events-postgres-owned.js';
3
+ export class PostgresEventDispatchMigrationError extends Error {
4
+ code;
5
+ phase;
6
+ captureCommitted;
7
+ lifecycleCommitted;
8
+ deliveryCommitted;
9
+ constructor(code, phase = 'dispatch', captureCommitted = false, lifecycleCommitted = false, deliveryCommitted = false) {
10
+ super(code);
11
+ this.code = code;
12
+ this.phase = phase;
13
+ this.captureCommitted = captureCommitted;
14
+ this.lifecycleCommitted = lifecycleCommitted;
15
+ this.deliveryCommitted = deliveryCommitted;
16
+ this.name = 'PostgresEventDispatchMigrationError';
17
+ }
18
+ }
19
+ const bad = () => { throw new PostgresEventDispatchMigrationError('INCOMPATIBLE_SCHEMA'); };
20
+ const tables = ['emseepea_event_dispatch_migrations', 'emseepea_event_dispatch_state'];
21
+ const names = ['namespace', 'source_kind', 'source_id', 'subscription_id', 'generation'];
22
+ const k = names.join(', ');
23
+ const ddl = [
24
+ `CREATE TABLE public.emseepea_event_dispatch_migrations(singleton pg_catalog.bool PRIMARY KEY DEFAULT true CHECK(singleton),version pg_catalog.int4 NOT NULL,revision pg_catalog.text NOT NULL)`,
25
+ `CREATE TABLE public.emseepea_event_dispatch_state(${names.map(n => `${n} pg_catalog.text NOT NULL`).join(',')},
26
+ config_hash pg_catalog.text NOT NULL CHECK(config_hash ~ '^[0-9a-f]{64}$'),
27
+ transport_generation pg_catalog.int4 NOT NULL DEFAULT 0 CHECK(transport_generation>=0 AND transport_generation<=2147483646),
28
+ task_id pg_catalog.text CHECK(task_id ~ '^emseepea-[0-9a-f]{64}$'),
29
+ lease_id pg_catalog.text,lease_until pg_catalog.timestamptz,due_at pg_catalog.timestamptz NOT NULL DEFAULT pg_catalog.clock_timestamp(),
30
+ recovery_count pg_catalog.int4 NOT NULL DEFAULT 0 CHECK(recovery_count>=0),
31
+ category pg_catalog.text NOT NULL DEFAULT 'fresh' CHECK(category IN('fresh','present','unknown','unavailable','conflict','ineligible')),
32
+ terminal pg_catalog.bool NOT NULL DEFAULT false,
33
+ PRIMARY KEY(${k}),FOREIGN KEY(${k}) REFERENCES public.emseepea_event_intents(${k}) ON DELETE RESTRICT,
34
+ CHECK((lease_id IS NULL)=(lease_until IS NULL)),CHECK((transport_generation=0)=(task_id IS NULL)))`,
35
+ `CREATE INDEX emseepea_event_dispatch_due ON public.emseepea_event_dispatch_state(namespace,due_at,source_kind,source_id,subscription_id,generation) WHERE NOT terminal`,
36
+ ];
37
+ const expected = {
38
+ emseepea_event_dispatch_migrations: ['singleton:16:-1:true', 'version:23:-1:true', 'revision:25:-1:true'],
39
+ emseepea_event_dispatch_state: [...names.map(n => `${n}:25:-1:true`), 'config_hash:25:-1:true', 'transport_generation:23:-1:true', 'task_id:25:-1:false', 'lease_id:25:-1:false', 'lease_until:1184:-1:false', 'due_at:1184:-1:true', 'recovery_count:23:-1:true', 'category:25:-1:true', 'terminal:16:-1:true'],
40
+ };
41
+ const constraints = [
42
+ [tables[0], 'p', 'PRIMARY KEY (singleton)'], [tables[0], 'c', 'CHECK (singleton)'],
43
+ [tables[1], 'p', `PRIMARY KEY (${k})`], [tables[1], 'f', `FOREIGN KEY (${k}) REFERENCES emseepea_event_intents(${k}) ON DELETE RESTRICT`],
44
+ [tables[1], 'c', "CHECK ((config_hash ~ '^[0-9a-f]{64}$'::text))"],
45
+ [tables[1], 'c', 'CHECK (((transport_generation >= 0) AND (transport_generation <= 2147483646)))'],
46
+ [tables[1], 'c', "CHECK ((task_id ~ '^emseepea-[0-9a-f]{64}$'::text))"],
47
+ [tables[1], 'c', 'CHECK ((recovery_count >= 0))'],
48
+ [tables[1], 'c', "CHECK ((category = ANY (ARRAY['fresh'::text, 'present'::text, 'unknown'::text, 'unavailable'::text, 'conflict'::text, 'ineligible'::text])))"],
49
+ [tables[1], 'c', 'CHECK (((lease_id IS NULL) = (lease_until IS NULL)))'],
50
+ [tables[1], 'c', 'CHECK (((transport_generation = 0) = (task_id IS NULL)))'],
51
+ ];
52
+ const catalog = `SELECT c.relname,c.relkind,c.relrowsecurity,c.relforcerowsecurity,pg_catalog.pg_get_userbyid(c.relowner)=current_user AS owned,
53
+ pg_catalog.array_agg(a.attname::pg_catalog.text||':'||a.atttypid::pg_catalog.text||':'||a.atttypmod::pg_catalog.text||':'||a.attnotnull::pg_catalog.text ORDER BY a.attnum) AS columns,
54
+ pg_catalog.jsonb_object_agg(a.attname,pg_catalog.pg_get_expr(d.adbin,d.adrelid)) AS defaults
55
+ FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace
56
+ JOIN pg_catalog.pg_attribute a ON a.attrelid=c.oid AND a.attnum>0 AND NOT a.attisdropped
57
+ LEFT JOIN pg_catalog.pg_attrdef d ON d.adrelid=c.oid AND d.adnum=a.attnum
58
+ WHERE n.nspname='public' AND c.relname=ANY($1::pg_catalog.text[])
59
+ GROUP BY c.oid,c.relname,c.relkind,c.relrowsecurity,c.relforcerowsecurity,c.relowner`;
60
+ async function verify(run) {
61
+ const rows = (await run(catalog, [tables])).rows;
62
+ if (rows.length !== 2)
63
+ bad();
64
+ for (const row of rows) {
65
+ if (typeof row.relname !== 'string' || row.relkind !== 'r' || row.owned !== true || row.relrowsecurity !== false || row.relforcerowsecurity !== false || JSON.stringify(row.columns) !== JSON.stringify(expected[row.relname]))
66
+ bad();
67
+ const defaults = row.defaults;
68
+ if (!defaults || typeof defaults !== 'object')
69
+ bad();
70
+ for (const column of expected[String(row.relname)] ?? []) {
71
+ const name = column.split(':')[0];
72
+ const value = row.relname === tables[0] && name === 'singleton' ? 'true' : row.relname === tables[1] && ['transport_generation', 'recovery_count'].includes(name) ? '0' :
73
+ row.relname === tables[1] && name === 'due_at' ? 'clock_timestamp()' : row.relname === tables[1] && name === 'category' ? "'fresh'::text" : row.relname === tables[1] && name === 'terminal' ? 'false' : null;
74
+ if (defaults[name] !== value)
75
+ bad();
76
+ }
77
+ }
78
+ const wanted = new Set(constraints.map(row => JSON.stringify(row)));
79
+ const found = (await run(`SELECT c.relname,t.contype,pg_catalog.pg_get_constraintdef(t.oid) AS definition,t.convalidated,t.condeferrable,t.condeferred,
80
+ CASE WHEN t.contype IN('p','u') THEN i.indisvalid AND i.indisready AND i.indisunique ELSE true END AS key_valid
81
+ FROM pg_catalog.pg_constraint t JOIN pg_catalog.pg_class c ON c.oid=t.conrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace
82
+ LEFT JOIN pg_catalog.pg_index i ON i.indexrelid=t.conindid WHERE n.nspname='public' AND c.relname=ANY($1::pg_catalog.text[])`, [tables])).rows;
83
+ for (const row of found)
84
+ if (row.convalidated !== true || row.condeferrable !== false || row.condeferred !== false || row.key_valid !== true || !wanted.delete(JSON.stringify([row.relname, row.contype, row.definition])))
85
+ bad();
86
+ if (wanted.size)
87
+ bad();
88
+ const indexes = (await run(`SELECT c.relname,x.relname AS index_name,i.indisvalid,i.indisready,i.indisunique,
89
+ pg_catalog.pg_get_expr(i.indpred,i.indrelid) AS predicate,
90
+ ARRAY(SELECT a.attname::pg_catalog.text FROM pg_catalog.unnest(i.indkey) WITH ORDINALITY z(num,ord)
91
+ JOIN pg_catalog.pg_attribute a ON a.attrelid=i.indrelid AND a.attnum=z.num ORDER BY z.ord) AS keys
92
+ FROM pg_catalog.pg_index i JOIN pg_catalog.pg_class c ON c.oid=i.indrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace
93
+ JOIN pg_catalog.pg_class x ON x.oid=i.indexrelid WHERE n.nspname='public' AND c.relname=ANY($1::pg_catalog.text[])`, [tables])).rows;
94
+ if (indexes.length !== 3)
95
+ bad();
96
+ for (const row of indexes) {
97
+ const due = row.index_name === 'emseepea_event_dispatch_due';
98
+ const keys = due ? ['namespace', 'due_at', 'source_kind', 'source_id', 'subscription_id', 'generation'] : row.relname === tables[0] ? ['singleton'] : names;
99
+ if (row.indisvalid !== true || row.indisready !== true || row.indisunique !== !due || row.predicate !== (due ? '(NOT terminal)' : null) || JSON.stringify(row.keys) !== JSON.stringify(keys) || due && row.relname !== tables[1])
100
+ bad();
101
+ }
102
+ const triggers = (await run(`SELECT t.oid FROM pg_catalog.pg_trigger t JOIN pg_catalog.pg_class c ON c.oid=t.tgrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE n.nspname='public' AND c.relname=ANY($1::pg_catalog.text[]) AND NOT t.tgisinternal`, [tables])).rows;
103
+ if (triggers.length)
104
+ bad();
105
+ const marker = (await run('SELECT singleton,version,revision FROM public.emseepea_event_dispatch_migrations')).rows;
106
+ if (marker.length !== 1 || marker[0]?.singleton !== true || marker[0].version !== 1 || marker[0].revision !== 'dispatch-v1')
107
+ bad();
108
+ }
109
+ /** Runs the capture, lifecycle, and delivery migrations before the dispatch
110
+ * migration. If a later migration fails, earlier prerequisite schemas can
111
+ * remain installed. Serving constructors never call this function.
112
+ */
113
+ export function createPostgresEventDispatchMigrator(pool) {
114
+ let prerequisite;
115
+ try {
116
+ prerequisite = createPostgresEventDeliveryMigrator(pool);
117
+ }
118
+ catch (error) {
119
+ if (error instanceof PostgresEventDeliveryMigrationError) {
120
+ throw new PostgresEventDispatchMigrationError(error.code, error.phase, error.captureCommitted, error.lifecycleCommitted, false);
121
+ }
122
+ throw new PostgresEventDispatchMigrationError('UNAVAILABLE');
123
+ }
124
+ const owned = createOwnedEventOperations();
125
+ let closing = false;
126
+ async function migrate(invocation) {
127
+ if (closing)
128
+ throw new PostgresEventDispatchMigrationError('UNAVAILABLE');
129
+ let captureCommitted = false, lifecycleCommitted = false, deliveryCommitted = false;
130
+ try {
131
+ await prerequisite.migrate(invocation);
132
+ captureCommitted = true;
133
+ lifecycleCommitted = true;
134
+ deliveryCommitted = true;
135
+ await owned.run(pool, invocation, async (run) => {
136
+ await run('SELECT pg_catalog.pg_advisory_xact_lock(1740126,3)');
137
+ const found = (await run(catalog, [tables])).rows;
138
+ if (found.length === 0) {
139
+ for (const statement of ddl)
140
+ await run(statement);
141
+ await run("INSERT INTO public.emseepea_event_dispatch_migrations VALUES(true,1,'dispatch-v1')");
142
+ }
143
+ await verify(run);
144
+ }, false, error => error instanceof PostgresEventDispatchMigrationError);
145
+ }
146
+ catch (error) {
147
+ if (error instanceof PostgresEventDispatchMigrationError) {
148
+ throw new PostgresEventDispatchMigrationError(error.code, 'dispatch', captureCommitted, lifecycleCommitted, deliveryCommitted);
149
+ }
150
+ if (error instanceof PostgresEventDeliveryMigrationError) {
151
+ throw new PostgresEventDispatchMigrationError(error.code, error.phase, error.captureCommitted, error.lifecycleCommitted, false);
152
+ }
153
+ const code = error && typeof error === 'object' && 'code' in error ? error.code : undefined;
154
+ throw new PostgresEventDispatchMigrationError(code === 'INCOMPATIBLE_SCHEMA' ? 'INCOMPATIBLE_SCHEMA' : code === 'OUTCOME_UNKNOWN' ? 'OUTCOME_UNKNOWN' : 'UNAVAILABLE', 'dispatch', captureCommitted, lifecycleCommitted, deliveryCommitted);
155
+ }
156
+ }
157
+ return Object.freeze({
158
+ migrate(invocation) { return owned.track(migrate(invocation)); },
159
+ async settle(invocation) { closing = true; const results = await Promise.allSettled([prerequisite.settle(invocation), owned.settle(invocation)]); return results.every(result => result.status === 'fulfilled' && result.value === true); },
160
+ });
161
+ }
162
+ //# sourceMappingURL=events-postgres-dispatch-migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-dispatch-migrations.js","sourceRoot":"","sources":["../src/events-postgres-dispatch-migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type ExternalMcpEventInvocation } from './events-external.js';
2
+ import type { OwnedEventPool } from './events-postgres-owned.js';
3
+ type Invocation = ExternalMcpEventInvocation;
4
+ /** Private provider boundary. The packaged provider must verify exact task equivalence. */
5
+ export interface EventDispatchTransport {
6
+ readonly fingerprint: string;
7
+ queue(invocation: Invocation): Promise<'present' | 'unavailable'>;
8
+ inspect(task: Readonly<{
9
+ deliveryId: string;
10
+ taskId: string;
11
+ }>, invocation: Invocation): Promise<'matching' | 'conflict' | 'missing' | 'unavailable'>;
12
+ create(task: Readonly<{
13
+ deliveryId: string;
14
+ taskId: string;
15
+ }>, invocation: Invocation): Promise<'created' | 'exists' | 'unavailable'>;
16
+ }
17
+ export interface EventDispatchOptions {
18
+ readonly namespace: string;
19
+ readonly pool: OwnedEventPool;
20
+ readonly transport: EventDispatchTransport;
21
+ readonly isPaused: () => boolean;
22
+ }
23
+ export interface EventDispatchResult {
24
+ readonly selected: number;
25
+ readonly created: number;
26
+ readonly observed: number;
27
+ readonly conflicts: number;
28
+ readonly unknown: number;
29
+ readonly deferred: number;
30
+ readonly status: 'complete' | 'retry_pending' | 'paused' | 'stopping';
31
+ }
32
+ /** Internal implementation seam; no route, provider credentials, timer or adopter callback API. */
33
+ export declare function createPostgresEventDispatchRuntime(options: EventDispatchOptions): Readonly<{
34
+ reconcile: (invocation: Invocation) => Promise<EventDispatchResult>;
35
+ dispatch: (deliveryId: string, invocation: Invocation) => Promise<EventDispatchResult>;
36
+ settle(invocation: Invocation): Promise<boolean>;
37
+ }>;
38
+ export {};
39
+ //# sourceMappingURL=events-postgres-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-dispatch.d.ts","sourceRoot":"","sources":["../src/events-postgres-dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,4BAA4B,CAAC;AAG3E,KAAK,UAAU,GAAC,0BAA0B,CAAC;AAE3C,2FAA2F;AAC3F,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,WAAW,EAAC,MAAM,CAAC;IAC5B,KAAK,CAAC,UAAU,EAAC,UAAU,GAAE,OAAO,CAAC,SAAS,GAAC,aAAa,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,EAAC,QAAQ,CAAC;QAAC,UAAU,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,MAAM,CAAA;KAAC,CAAC,EAAC,UAAU,EAAC,UAAU,GAAE,OAAO,CAAC,UAAU,GAAC,UAAU,GAAC,SAAS,GAAC,aAAa,CAAC,CAAC;IACvI,MAAM,CAAC,IAAI,EAAC,QAAQ,CAAC;QAAC,UAAU,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,MAAM,CAAA;KAAC,CAAC,EAAC,UAAU,EAAC,UAAU,GAAE,OAAO,CAAC,SAAS,GAAC,QAAQ,GAAC,aAAa,CAAC,CAAC;CACzH;AACD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,SAAS,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,IAAI,EAAC,cAAc,CAAC;IAAA,QAAQ,CAAC,SAAS,EAAC,sBAAsB,CAAC;IACjG,QAAQ,CAAC,QAAQ,EAAC,MAAI,OAAO,CAAC;CAC9B;AACD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,QAAQ,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,OAAO,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,QAAQ,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,SAAS,EAAC,MAAM,CAAC;IACpG,QAAQ,CAAC,OAAO,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,QAAQ,EAAC,MAAM,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAC,UAAU,GAAC,eAAe,GAAC,QAAQ,GAAC,UAAU,CAAC;CAC/D;AAiBD,mGAAmG;AACnG,wBAAgB,kCAAkC,CAAC,OAAO,EAAC,oBAAoB;4BAgJvD,UAAU;2BACX,MAAM,cAAY,UAAU;uBACzB,UAAU,GAAE,OAAO,CAAC,OAAO,CAAC;GAWrD"}