@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,176 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { isIP } from 'node:net';
3
+ import { ExternalMcpEventError } from './events-external.js';
4
+ import { mcpEventSubscriptionIdentity } from './events.js';
5
+ import { createOwnedEventOperations } from './events-postgres-owned.js';
6
+ export { createPostgresEventLifecycleMigrator } from './events-postgres-lifecycle-migrations.js';
7
+ const fail = (code) => { throw new ExternalMcpEventError(code); };
8
+ function text(value, max = 240) {
9
+ if (typeof value !== 'string' || !value || Buffer.byteLength(value) > max || /\u0000|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(value))
10
+ fail('INVALID_INPUT');
11
+ return value;
12
+ }
13
+ function json(value, depth = 0) {
14
+ if (depth > 32)
15
+ fail('INVALID_INPUT');
16
+ if (value === null || typeof value === 'boolean' || typeof value === 'number' && Number.isFinite(value) && !Object.is(value, -0))
17
+ return value;
18
+ if (typeof value === 'string') {
19
+ if (value)
20
+ text(value, 65536);
21
+ return value;
22
+ }
23
+ if (!value || typeof value !== 'object' || !(Array.isArray(value) ? Object.getPrototypeOf(value) === Array.prototype : [null, Object.prototype].includes(Object.getPrototypeOf(value))))
24
+ fail('INVALID_INPUT');
25
+ const fields = Object.getOwnPropertyDescriptors(value), array = Array.isArray(value), result = array ? [] : Object.create(null);
26
+ if (array && Reflect.ownKeys(fields).length !== value.length + 1)
27
+ fail('INVALID_INPUT');
28
+ for (const key of Reflect.ownKeys(fields)) {
29
+ if (typeof key !== 'string' || /\u0000|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(key))
30
+ fail('INVALID_INPUT');
31
+ const item = fields[key];
32
+ if (!('value' in item) || !item.enumerable && !(array && key === 'length'))
33
+ fail('INVALID_INPUT');
34
+ if (array && key === 'length')
35
+ continue;
36
+ if (array && !/^(0|[1-9][0-9]*)$/.test(key))
37
+ fail('INVALID_INPUT');
38
+ result[key] = json(item.value, depth + 1);
39
+ }
40
+ return Object.freeze(result);
41
+ }
42
+ function request(value) {
43
+ const copy = json(value);
44
+ if (!copy || Array.isArray(copy) || typeof copy !== 'object' || Buffer.byteLength(JSON.stringify(copy)) > 65536)
45
+ fail('INVALID_INPUT');
46
+ return copy;
47
+ }
48
+ function identity(value) {
49
+ const id = text(value.id), ownerKey = text(value.ownerKey, 256), name = text(value.name), url = text(value.url, 8192), args = value.arguments;
50
+ if (!args || typeof args !== 'object' || Array.isArray(args))
51
+ fail('INVALID_INPUT');
52
+ let parsed;
53
+ try {
54
+ parsed = new URL(url);
55
+ }
56
+ catch {
57
+ return fail('INVALID_INPUT');
58
+ }
59
+ if (parsed.href !== url || parsed.protocol !== 'https:' || parsed.username || parsed.password || parsed.hash || parsed.port && parsed.port !== '443' || isIP(parsed.hostname.replace(/^\[|\]$/g, '')) || parsed.hostname === 'localhost' || parsed.hostname.endsWith('.localhost') || parsed.hostname.endsWith('.local'))
60
+ fail('INVALID_INPUT');
61
+ if (mcpEventSubscriptionIdentity(ownerKey, name, args, url) !== id)
62
+ fail('INVALID_INPUT');
63
+ return Object.freeze({ id, ownerKey, name, url, arguments: args });
64
+ }
65
+ const dbTime = `pg_catalog.floor(EXTRACT(epoch FROM pg_catalog.clock_timestamp())*1000)::pg_catalog.float8`;
66
+ const conflict = () => fail('SUBSCRIPTION_CHANGED');
67
+ const validMs = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
68
+ /** Creates the experimental PostgreSQL lifecycle implementation. Run the explicit migration first and configure finite timeouts on both PostgreSQL pools. */
69
+ export function createPostgresEventLifecycle(options) {
70
+ const namespace = text(options?.namespace);
71
+ if (!options.observationPool || !options.mutationPool || typeof options.observationPool.connect !== 'function' || typeof options.mutationPool.connect !== 'function')
72
+ fail('INVALID_INPUT');
73
+ const owned = createOwnedEventOperations();
74
+ async function locked(run, i) {
75
+ const inserted = (await run(`INSERT INTO public.emseepea_event_heads(namespace,subscription_id,owner_key,url,revision,generation)
76
+ VALUES($1,$2,$3,NULL,$4,NULL) ON CONFLICT(namespace,subscription_id) DO NOTHING RETURNING revision`, [namespace, i.id, i.ownerKey, randomUUID()])).rows.length === 1;
77
+ const row = (await run(`SELECT owner_key,url,revision,generation FROM public.emseepea_event_heads WHERE namespace=$1 AND subscription_id=$2 FOR UPDATE`, [namespace, i.id])).rows[0];
78
+ if (!row || row.owner_key !== i.ownerKey || typeof row.revision !== 'string')
79
+ return conflict();
80
+ return { row, inserted };
81
+ }
82
+ async function current(run, i, generation) {
83
+ if (generation === null)
84
+ return null;
85
+ const row = (await run(`SELECT owner_key,event_name,arguments,active,pg_catalog.floor(EXTRACT(epoch FROM expires_at)*1000)::pg_catalog.float8 AS expires_at
86
+ FROM public.emseepea_event_capture_subscriptions WHERE namespace=$1 AND subscription_id=$2 AND generation=$3`, [namespace, i.id, generation])).rows[0];
87
+ if (!row || row.owner_key !== i.ownerKey || row.event_name !== i.name || mcpEventSubscriptionIdentity(i.ownerKey, i.name, row.arguments, i.url) !== i.id || !validMs(row.expires_at) || typeof row.active !== 'boolean')
88
+ return fail('UNAVAILABLE');
89
+ return row;
90
+ }
91
+ return Object.freeze({
92
+ async observe(input, invocation) {
93
+ const i = identity(request(input));
94
+ return owned.run(options.observationPool, invocation, async (run) => {
95
+ const row = (await run(`WITH clock AS MATERIALIZED(SELECT ${dbTime} AS now)
96
+ SELECT clock.now,h.owner_key,h.url,h.revision,h.generation,s.owner_key AS capture_owner,s.event_name,s.arguments,s.active,
97
+ pg_catalog.floor(EXTRACT(epoch FROM s.expires_at)*1000)::pg_catalog.float8 AS expires_at
98
+ FROM clock LEFT JOIN public.emseepea_event_heads h ON h.namespace=$1 AND h.subscription_id=$2
99
+ LEFT JOIN public.emseepea_event_capture_subscriptions s ON s.namespace=h.namespace AND s.subscription_id=h.subscription_id AND s.generation=h.generation`, [namespace, i.id])).rows[0];
100
+ if (!row || !validMs(row.now))
101
+ return fail('UNAVAILABLE');
102
+ const base = { id: i.id, ownerKey: i.ownerKey, observedAt: row.now };
103
+ if (row.revision === null)
104
+ return { ...base, revision: null, generation: null, active: false, subscription: null };
105
+ if (row.owner_key !== i.ownerKey || typeof row.revision !== 'string' || !(row.generation === null || typeof row.generation === 'string'))
106
+ return fail('UNAVAILABLE');
107
+ if (row.url === null)
108
+ return { ...base, revision: row.revision, generation: row.generation, active: false, subscription: null };
109
+ if (row.url !== i.url || row.capture_owner !== i.ownerKey || row.event_name !== i.name || !validMs(row.expires_at) || typeof row.active !== 'boolean' || mcpEventSubscriptionIdentity(i.ownerKey, i.name, row.arguments, i.url) !== i.id)
110
+ return fail('UNAVAILABLE');
111
+ return { ...base, revision: row.revision, generation: row.generation, active: row.active && row.expires_at > row.now,
112
+ subscription: { id: i.id, ownerKey: i.ownerKey, name: i.name, arguments: row.arguments, url: i.url, expiresAt: row.expires_at } };
113
+ }, true);
114
+ },
115
+ async activate(input, invocation) {
116
+ const value = request(input), i = identity(value);
117
+ const expected = value.expectedRevision;
118
+ if (!(expected === null || typeof expected === 'string' && text(expected)) || !['new', 'renew'].includes(value.intent) || !Number.isSafeInteger(value.ttlMs) || Number(value.ttlMs) < 1 || Number(value.ttlMs) > 86400000)
119
+ fail('INVALID_INPUT');
120
+ const secret = text(value.secret, 100);
121
+ if (!secret.startsWith('whsec_'))
122
+ fail('INVALID_INPUT');
123
+ const decoded = Buffer.from(secret.slice(6), 'base64');
124
+ if (decoded.length < 24 || decoded.length > 64 || decoded.toString('base64') !== secret.slice(6))
125
+ fail('INVALID_INPUT');
126
+ return owned.run(options.mutationPool, invocation, async (run) => {
127
+ const { row, inserted } = await locked(run, i);
128
+ if (expected === null ? !inserted : inserted || row.revision !== expected)
129
+ return conflict();
130
+ if (row.url !== null && row.generation === null)
131
+ return fail('UNAVAILABLE');
132
+ const prior = await current(run, i, row.generation);
133
+ if (row.url !== null && row.url !== i.url)
134
+ return fail('UNAVAILABLE');
135
+ const now = (await run(`SELECT ${dbTime} AS now`)).rows[0]?.now;
136
+ if (!validMs(now))
137
+ return fail('UNAVAILABLE');
138
+ const active = row.url !== null && prior?.active === true && Number(prior.expires_at) > now;
139
+ if (value.intent === 'renew' ? !active : active)
140
+ return conflict();
141
+ const expiresAt = now + Number(value.ttlMs), generation = value.intent === 'renew' ? String(row.generation) : randomUUID(), revision = randomUUID();
142
+ if (value.intent === 'new') {
143
+ await run('UPDATE public.emseepea_event_capture_subscriptions SET active=false WHERE namespace=$1 AND subscription_id=$2 AND active', [namespace, i.id]);
144
+ await run('DELETE FROM public.emseepea_event_keys WHERE namespace=$1 AND subscription_id=$2', [namespace, i.id]);
145
+ await run(`INSERT INTO public.emseepea_event_capture_subscriptions(namespace,subscription_id,generation,owner_key,event_name,arguments,active,expires_at)
146
+ VALUES($1,$2,$3,$4,$5,$6::pg_catalog.jsonb,true,pg_catalog.to_timestamp($7::pg_catalog.float8/1000))`, [namespace, i.id, generation, i.ownerKey, i.name, JSON.stringify(i.arguments), expiresAt]);
147
+ await run(`INSERT INTO public.emseepea_event_keys(namespace,subscription_id,generation,secret,previous_secret,previous_until,verified_until)
148
+ VALUES($1,$2,$3,$4,NULL,NULL,pg_catalog.to_timestamp($5::pg_catalog.float8/1000))`, [namespace, i.id, generation, secret, Math.min(now + 300000, expiresAt)]);
149
+ }
150
+ else {
151
+ const key = (await run('SELECT secret FROM public.emseepea_event_keys WHERE namespace=$1 AND subscription_id=$2 AND generation=$3', [namespace, i.id, generation])).rows[0];
152
+ if (typeof key?.secret !== 'string')
153
+ return fail('UNAVAILABLE');
154
+ await run(`UPDATE public.emseepea_event_keys SET previous_secret=CASE WHEN secret=$4 THEN previous_secret ELSE secret END,
155
+ previous_until=CASE WHEN secret=$4 THEN previous_until ELSE pg_catalog.to_timestamp($5::pg_catalog.float8/1000) END,
156
+ secret=$4,verified_until=pg_catalog.to_timestamp($5::pg_catalog.float8/1000) WHERE namespace=$1 AND subscription_id=$2 AND generation=$3`, [namespace, i.id, generation, secret, Math.min(now + 300000, expiresAt)]);
157
+ await run(`UPDATE public.emseepea_event_capture_subscriptions SET expires_at=pg_catalog.to_timestamp($4::pg_catalog.float8/1000) WHERE namespace=$1 AND subscription_id=$2 AND generation=$3`, [namespace, i.id, generation, expiresAt]);
158
+ }
159
+ await run('UPDATE public.emseepea_event_heads SET url=$3,revision=$4,generation=$5 WHERE namespace=$1 AND subscription_id=$2', [namespace, i.id, i.url, revision, generation]);
160
+ return { id: i.id, revision, generation, observedAt: now, expiresAt };
161
+ });
162
+ },
163
+ async revoke(input, invocation) {
164
+ const i = identity(request(input));
165
+ await owned.run(options.mutationPool, invocation, async (run) => {
166
+ await locked(run, i);
167
+ await run('UPDATE public.emseepea_event_capture_subscriptions SET active=false WHERE namespace=$1 AND subscription_id=$2 AND active', [namespace, i.id]);
168
+ await run("UPDATE public.emseepea_event_intents SET state='revoked' WHERE namespace=$1 AND subscription_id=$2 AND state='pending'", [namespace, i.id]);
169
+ await run('DELETE FROM public.emseepea_event_keys WHERE namespace=$1 AND subscription_id=$2', [namespace, i.id]);
170
+ await run('UPDATE public.emseepea_event_heads SET url=NULL,revision=$3 WHERE namespace=$1 AND subscription_id=$2', [namespace, i.id, randomUUID()]);
171
+ });
172
+ },
173
+ settle: owned.settle,
174
+ });
175
+ }
176
+ //# sourceMappingURL=events-postgres-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-lifecycle.js","sourceRoot":"","sources":["../src/events-postgres-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { PostgresEventClient, PostgresEventInvocation } from "./events-postgres.js";
2
+ export interface PostgresEventMigrationClient extends PostgresEventClient {
3
+ release(error?: Error): void;
4
+ }
5
+ export interface PostgresEventMigrationPool {
6
+ connect(): Promise<PostgresEventMigrationClient>;
7
+ }
8
+ export declare class PostgresEventMigrationError extends Error {
9
+ readonly code: "INVALID_INPUT" | "DEADLINE" | "ABORTED" | "INCOMPATIBLE_SCHEMA" | "UNAVAILABLE" | "OUTCOME_UNKNOWN";
10
+ constructor(code: "INVALID_INPUT" | "DEADLINE" | "ABORTED" | "INCOMPATIBLE_SCHEMA" | "UNAVAILABLE" | "OUTCOME_UNKNOWN");
11
+ }
12
+ /** Deployment migrations. `createPostgresEventCapture` never applies them. */
13
+ export declare const postgresEventCaptureMigrations: readonly Readonly<{
14
+ version: 1;
15
+ revision: "capture-v1";
16
+ statements: readonly string[];
17
+ }>[];
18
+ /** Runs deployment migrations using only the acquired connection, which this function owns.
19
+ * Supported pools must also configure finite acquisition and query timeouts. A local timeout
20
+ * does not prove that PostgreSQL cancelled the operation. Connections with an uncertain outcome
21
+ * are discarded.
22
+ */
23
+ export declare function migratePostgresEventCapture(pool: PostgresEventMigrationPool, invocation: PostgresEventInvocation): Promise<void>;
24
+ /** Creates lifecycle-managed migration operations for composed deployments. The standalone
25
+ * migration function retains its existing contract. This owner stops accepting work when
26
+ * shutdown begins, never closes the supplied pool, and does not treat a caller-facing
27
+ * deadline as proof of SQL cancellation. */
28
+ export declare function createPostgresEventCaptureMigrator(pool: PostgresEventMigrationPool): Readonly<{
29
+ migrate(invocation: PostgresEventInvocation): Promise<void>;
30
+ settle(invocation: PostgresEventInvocation): Promise<boolean>;
31
+ }>;
32
+ //# sourceMappingURL=events-postgres-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-migrations.d.ts","sourceRoot":"","sources":["../src/events-postgres-migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,MAAM,WAAW,4BAA6B,SAAQ,mBAAmB;IAAG,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE;AAC1G,MAAM,WAAW,0BAA0B;IAAG,OAAO,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAAA;CAAE;AAChG,qBAAa,2BAA4B,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,qBAAqB,GAAG,aAAa,GAAG,iBAAiB;gBAA1G,IAAI,EAAE,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,qBAAqB,GAAG,aAAa,GAAG,iBAAiB;CAGhI;AA2BD,8EAA8E;AAC9E,eAAO,MAAM,8BAA8B;;;;IAAuF,CAAC;AAuFnI;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,0BAA0B,EAAE,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EtI;AAED;;;4CAG4C;AAC5C,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,0BAA0B;wBA8BrD,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;uBAsBxC,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;GAKtE"}
@@ -0,0 +1,329 @@
1
+ import { performance } from "node:perf_hooks";
2
+ import { createOwnedEventOperations } from './events-postgres-owned.js';
3
+ export class PostgresEventMigrationError extends Error {
4
+ code;
5
+ constructor(code) {
6
+ super(code);
7
+ this.code = code;
8
+ this.name = "PostgresEventMigrationError";
9
+ }
10
+ }
11
+ const VERSION = 1;
12
+ const REVISION = "capture-v1";
13
+ const TABLES = ["emseepea_event_capture_migrations", "emseepea_event_capture_subscriptions", "emseepea_event_sources", "emseepea_event_intents"];
14
+ const statements = Object.freeze([
15
+ `CREATE TABLE public.emseepea_event_capture_migrations (
16
+ singleton boolean PRIMARY KEY DEFAULT true CHECK(singleton),version integer NOT NULL,revision text NOT NULL)`,
17
+ `CREATE TABLE public.emseepea_event_capture_subscriptions (
18
+ namespace text NOT NULL,subscription_id text NOT NULL,generation text NOT NULL,
19
+ owner_key text NOT NULL,event_name text NOT NULL,arguments jsonb NOT NULL CHECK(jsonb_typeof(arguments)='object'),
20
+ active boolean NOT NULL,expires_at timestamptz NOT NULL,
21
+ PRIMARY KEY(namespace,subscription_id,generation))`,
22
+ `CREATE UNIQUE INDEX emseepea_event_capture_active_generation ON public.emseepea_event_capture_subscriptions(namespace,subscription_id) WHERE active`,
23
+ `CREATE INDEX emseepea_event_capture_candidates ON public.emseepea_event_capture_subscriptions(namespace,owner_key,event_name,subscription_id,generation) WHERE active`,
24
+ `CREATE TABLE public.emseepea_event_sources (
25
+ namespace text NOT NULL,source_kind text NOT NULL,source_id text NOT NULL,source_version text NOT NULL,
26
+ fingerprint text NOT NULL,event_id text NOT NULL UNIQUE,owner_key text NOT NULL,event_name text NOT NULL,
27
+ occurred_at timestamptz NOT NULL,eligibility_at timestamptz NOT NULL,
28
+ recipient_count integer NOT NULL CHECK(recipient_count>=0),payload jsonb NOT NULL CHECK(jsonb_typeof(payload)='object'),
29
+ PRIMARY KEY(namespace,source_kind,source_id))`,
30
+ `CREATE TABLE public.emseepea_event_intents (
31
+ namespace text NOT NULL,source_kind text NOT NULL,source_id text NOT NULL,
32
+ subscription_id text NOT NULL,generation text NOT NULL,delivery_id text NOT NULL UNIQUE,event_id text NOT NULL,
33
+ state text NOT NULL DEFAULT 'pending' CHECK(state IN ('pending','completed','revoked')),
34
+ PRIMARY KEY(namespace,source_kind,source_id,subscription_id,generation),
35
+ FOREIGN KEY(namespace,source_kind,source_id) REFERENCES public.emseepea_event_sources(namespace,source_kind,source_id) ON DELETE CASCADE)`,
36
+ ]);
37
+ /** Deployment migrations. `createPostgresEventCapture` never applies them. */
38
+ export const postgresEventCaptureMigrations = Object.freeze([Object.freeze({ version: VERSION, revision: REVISION, statements })]);
39
+ const EXPECTED = Object.freeze({
40
+ emseepea_event_capture_migrations: ["singleton:boolean", "version:integer", "revision:text"],
41
+ emseepea_event_capture_subscriptions: ["namespace:text", "subscription_id:text", "generation:text", "owner_key:text", "event_name:text", "arguments:jsonb", "active:boolean", "expires_at:timestamp with time zone"],
42
+ emseepea_event_sources: ["namespace:text", "source_kind:text", "source_id:text", "source_version:text", "fingerprint:text", "event_id:text", "owner_key:text", "event_name:text", "occurred_at:timestamp with time zone", "eligibility_at:timestamp with time zone", "recipient_count:integer", "payload:jsonb"],
43
+ emseepea_event_intents: ["namespace:text", "source_kind:text", "source_id:text", "subscription_id:text", "generation:text", "delivery_id:text", "event_id:text", "state:text"],
44
+ });
45
+ const CATALOG = `SELECT c.relname,pg_catalog.pg_get_userbyid(c.relowner) AS owner,current_user AS actor,c.relkind,
46
+ c.relrowsecurity,c.relforcerowsecurity,
47
+ pg_catalog.array_agg(a.attname||':'||pg_catalog.format_type(a.atttypid,a.atttypmod) ORDER BY a.attnum) AS columns,
48
+ pg_catalog.bool_and(a.attnotnull) AS all_not_null,
49
+ pg_catalog.jsonb_object_agg(a.attname,pg_catalog.pg_get_expr(d.adbin,d.adrelid)) AS defaults
50
+ FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace
51
+ JOIN pg_catalog.pg_attribute a ON a.attrelid=c.oid AND a.attnum>0 AND NOT a.attisdropped
52
+ LEFT JOIN pg_catalog.pg_attrdef d ON d.adrelid=c.oid AND d.adnum=a.attnum
53
+ WHERE n.nspname='public' AND c.relname=ANY($1::pg_catalog.text[]) GROUP BY c.oid,c.relname,c.relowner,c.relkind,c.relrowsecurity,c.relforcerowsecurity`;
54
+ const EXPECTED_CONSTRAINTS = [
55
+ [TABLES[0], "p", "PRIMARY KEY (singleton)"], [TABLES[0], "c", "CHECK (singleton)"],
56
+ [TABLES[1], "p", "PRIMARY KEY (namespace, subscription_id, generation)"],
57
+ [TABLES[1], "c", "CHECK ((jsonb_typeof(arguments) = 'object'::text))"],
58
+ [TABLES[2], "p", "PRIMARY KEY (namespace, source_kind, source_id)"], [TABLES[2], "u", "UNIQUE (event_id)"],
59
+ [TABLES[2], "c", "CHECK ((recipient_count >= 0))"], [TABLES[2], "c", "CHECK ((jsonb_typeof(payload) = 'object'::text))"],
60
+ [TABLES[3], "p", "PRIMARY KEY (namespace, source_kind, source_id, subscription_id, generation)"],
61
+ [TABLES[3], "u", "UNIQUE (delivery_id)"],
62
+ [TABLES[3], "f", "FOREIGN KEY (namespace, source_kind, source_id) REFERENCES emseepea_event_sources(namespace, source_kind, source_id) ON DELETE CASCADE"],
63
+ [TABLES[3], "c", "CHECK ((state = ANY (ARRAY['pending'::text, 'completed'::text, 'revoked'::text])))"],
64
+ ];
65
+ async function verify(run) {
66
+ const found = (await run(CATALOG, [TABLES])).rows;
67
+ if (found.length !== TABLES.length)
68
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
69
+ for (const item of found) {
70
+ if (typeof item.relname !== "string" || item.owner !== item.actor || item.relkind !== "r" || item.all_not_null !== true ||
71
+ item.relrowsecurity !== false || item.relforcerowsecurity !== false ||
72
+ JSON.stringify(item.columns) !== JSON.stringify(EXPECTED[item.relname]))
73
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
74
+ const defaults = item.defaults;
75
+ if (!defaults || typeof defaults !== "object")
76
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
77
+ for (const column of EXPECTED[item.relname]) {
78
+ const name = column.split(":")[0];
79
+ const expectedDefault = item.relname === TABLES[0] && name === "singleton" ? "true" :
80
+ item.relname === TABLES[3] && name === "state" ? "'pending'::text" : null;
81
+ if (defaults[name] !== expectedDefault)
82
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
83
+ }
84
+ }
85
+ const version = (await run("SELECT version,revision FROM public.emseepea_event_capture_migrations WHERE singleton")).rows;
86
+ if (version.length !== 1 || version[0]?.version !== VERSION || version[0]?.revision !== REVISION)
87
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
88
+ const constraints = (await run(`SELECT c.relname,t.contype,t.convalidated,t.condeferrable,t.condeferred,
89
+ pg_catalog.pg_get_constraintdef(t.oid) AS definition,
90
+ CASE WHEN t.contype IN ('p','u') THEN i.indisvalid AND i.indisready AND i.indisunique ELSE true END AS key_valid
91
+ FROM pg_catalog.pg_constraint t JOIN pg_catalog.pg_class c ON c.oid=t.conrelid
92
+ JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace LEFT JOIN pg_catalog.pg_index i ON i.indexrelid=t.conindid
93
+ WHERE n.nspname='public' AND c.relname=ANY($1::pg_catalog.text[])`, [TABLES])).rows;
94
+ if (constraints.length !== EXPECTED_CONSTRAINTS.length)
95
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
96
+ const expected = new Set(EXPECTED_CONSTRAINTS.map((item) => JSON.stringify(item)));
97
+ for (const item of constraints) {
98
+ const key = JSON.stringify([item.relname, item.contype, item.definition]);
99
+ if (item.convalidated !== true || item.condeferrable !== false || item.condeferred !== false || item.key_valid !== true ||
100
+ !expected.delete(key))
101
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
102
+ }
103
+ if (expected.size)
104
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
105
+ const indexes = (await run(`SELECT ic.relname AS name,tc.relname AS target,tn.nspname AS target_schema,
106
+ pg_catalog.pg_get_userbyid(ic.relowner) AS owner,current_user AS actor,
107
+ i.indisvalid,i.indisready,i.indisunique,i.indnkeyatts,i.indnatts,
108
+ pg_catalog.pg_get_expr(i.indpred,i.indrelid) AS predicate,
109
+ ARRAY(SELECT a.attname::pg_catalog.text FROM pg_catalog.unnest(i.indkey) WITH ORDINALITY AS k(attnum,ordinal)
110
+ JOIN pg_catalog.pg_attribute a ON a.attrelid=i.indrelid AND a.attnum=k.attnum ORDER BY k.ordinal) AS keys
111
+ FROM pg_catalog.pg_index i JOIN pg_catalog.pg_class ic ON ic.oid=i.indexrelid
112
+ JOIN pg_catalog.pg_namespace n ON n.oid=ic.relnamespace JOIN pg_catalog.pg_class tc ON tc.oid=i.indrelid
113
+ JOIN pg_catalog.pg_namespace tn ON tn.oid=tc.relnamespace
114
+ WHERE n.nspname='public' AND ic.relname=ANY($1::pg_catalog.text[])`, [["emseepea_event_capture_active_generation", "emseepea_event_capture_candidates"]])).rows;
115
+ if (indexes.length !== 2)
116
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
117
+ for (const item of indexes) {
118
+ const unique = item.name === "emseepea_event_capture_active_generation";
119
+ const keys = unique ? ["namespace", "subscription_id"] : ["namespace", "owner_key", "event_name", "subscription_id", "generation"];
120
+ if (item.target !== TABLES[1] || item.target_schema !== "public" || item.owner !== item.actor ||
121
+ item.indisvalid !== true || item.indisready !== true || item.indisunique !== unique || item.predicate !== "active" ||
122
+ Number(item.indnkeyatts) !== keys.length || Number(item.indnatts) !== keys.length || JSON.stringify(item.keys) !== JSON.stringify(keys)) {
123
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
124
+ }
125
+ }
126
+ const triggers = (await run(`SELECT t.oid FROM pg_catalog.pg_trigger t JOIN pg_catalog.pg_class c ON c.oid=t.tgrelid
127
+ JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE n.nspname='public' AND c.relname=ANY($1::pg_catalog.text[])
128
+ AND NOT t.tgisinternal`, [TABLES])).rows;
129
+ if (triggers.length)
130
+ throw new PostgresEventMigrationError("INCOMPATIBLE_SCHEMA");
131
+ }
132
+ /** Runs deployment migrations using only the acquired connection, which this function owns.
133
+ * Supported pools must also configure finite acquisition and query timeouts. A local timeout
134
+ * does not prove that PostgreSQL cancelled the operation. Connections with an uncertain outcome
135
+ * are discarded.
136
+ */
137
+ export async function migratePostgresEventCapture(pool, invocation) {
138
+ const failure = (code) => { throw new PostgresEventMigrationError(code); };
139
+ if (!pool || typeof pool.connect !== "function" || !invocation?.signal || !Number.isFinite(invocation.deadlineMs))
140
+ failure("INVALID_INPUT");
141
+ const remaining = Math.min(10000, invocation.deadlineMs - Date.now());
142
+ if (remaining <= 0)
143
+ failure("DEADLINE");
144
+ const end = performance.now() + remaining;
145
+ const check = () => { if (invocation.signal.aborted)
146
+ failure("ABORTED"); if (performance.now() >= end)
147
+ failure("DEADLINE"); };
148
+ check();
149
+ async function bounded(pending, maximum, observeAbort) {
150
+ let timer;
151
+ let aborted;
152
+ try {
153
+ return await Promise.race([pending, new Promise((_resolve, reject) => {
154
+ timer = setTimeout(() => reject(new PostgresEventMigrationError("DEADLINE")), Math.max(1, Math.min(maximum, end - performance.now())));
155
+ if (observeAbort) {
156
+ aborted = () => reject(new PostgresEventMigrationError("ABORTED"));
157
+ invocation.signal.addEventListener("abort", aborted, { once: true });
158
+ if (invocation.signal.aborted)
159
+ aborted();
160
+ }
161
+ })]);
162
+ }
163
+ finally {
164
+ if (timer)
165
+ clearTimeout(timer);
166
+ if (aborted)
167
+ invocation.signal.removeEventListener("abort", aborted);
168
+ }
169
+ }
170
+ function dispose(client, uncertain) {
171
+ try {
172
+ client.release(uncertain ? new Error("MIGRATION_OUTCOME_UNKNOWN") : undefined);
173
+ return true;
174
+ }
175
+ catch {
176
+ return false;
177
+ }
178
+ }
179
+ let abandoned = false;
180
+ let pending;
181
+ try {
182
+ pending = Promise.resolve(pool.connect());
183
+ }
184
+ catch {
185
+ failure("UNAVAILABLE");
186
+ }
187
+ void pending.then((value) => { if (abandoned)
188
+ dispose(value, true); }).catch(() => { });
189
+ let client;
190
+ try {
191
+ client = await bounded(pending, 1500, true);
192
+ }
193
+ catch {
194
+ abandoned = true;
195
+ throw new PostgresEventMigrationError("UNAVAILABLE");
196
+ }
197
+ let uncertain = false;
198
+ let committing = false;
199
+ const run = async (sql, values) => {
200
+ check();
201
+ try {
202
+ const result = await bounded(Promise.resolve().then(() => client.query(sql, values)), 3000, true);
203
+ check();
204
+ return result;
205
+ }
206
+ catch (error) {
207
+ if (error instanceof PostgresEventMigrationError) {
208
+ uncertain = true;
209
+ failure("OUTCOME_UNKNOWN");
210
+ }
211
+ const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
212
+ if (typeof code !== "string" || !/^[0-9A-Z]{5}$/.test(code) || code.startsWith("08"))
213
+ uncertain = true;
214
+ throw error;
215
+ }
216
+ };
217
+ let resultError;
218
+ try {
219
+ await run("BEGIN");
220
+ await run("SET LOCAL search_path=pg_catalog,public,pg_temp; SET LOCAL statement_timeout='1500ms'; SET LOCAL lock_timeout='500ms'");
221
+ await run("SELECT pg_catalog.pg_advisory_xact_lock(1740125,1)");
222
+ const existing = (await run(CATALOG, [TABLES])).rows;
223
+ if (existing.length === 0) {
224
+ for (const statement of statements)
225
+ await run(statement);
226
+ await run("INSERT INTO public.emseepea_event_capture_migrations(singleton,version,revision) VALUES(true,$1,$2)", [VERSION, REVISION]);
227
+ }
228
+ await verify(run);
229
+ committing = true;
230
+ await run("COMMIT");
231
+ committing = false;
232
+ }
233
+ catch (error) {
234
+ uncertain ||= committing;
235
+ if (!uncertain) {
236
+ try {
237
+ await bounded(Promise.resolve().then(() => client.query("ROLLBACK")), 1000, false);
238
+ }
239
+ catch {
240
+ uncertain = true;
241
+ }
242
+ }
243
+ resultError = uncertain ? new PostgresEventMigrationError("OUTCOME_UNKNOWN") :
244
+ error instanceof PostgresEventMigrationError ? error : new PostgresEventMigrationError("UNAVAILABLE");
245
+ }
246
+ finally {
247
+ if (!dispose(client, uncertain))
248
+ resultError = new PostgresEventMigrationError("OUTCOME_UNKNOWN");
249
+ }
250
+ if (resultError)
251
+ throw resultError;
252
+ }
253
+ /** Creates lifecycle-managed migration operations for composed deployments. The standalone
254
+ * migration function retains its existing contract. This owner stops accepting work when
255
+ * shutdown begins, never closes the supplied pool, and does not treat a caller-facing
256
+ * deadline as proof of SQL cancellation. */
257
+ export function createPostgresEventCaptureMigrator(pool) {
258
+ if (!pool || typeof pool.connect !== 'function')
259
+ throw new PostgresEventMigrationError('INVALID_INPUT');
260
+ const owned = createOwnedEventOperations();
261
+ let closing = false, disposalFailed = false;
262
+ const retainedPool = {
263
+ async connect() {
264
+ const client = await pool.connect();
265
+ const queries = new Set();
266
+ let released = false;
267
+ return {
268
+ query: ((sql, values) => {
269
+ if (released)
270
+ return Promise.reject(new PostgresEventMigrationError('UNAVAILABLE'));
271
+ const pending = owned.track(Promise.resolve().then(() => client.query(sql, values)));
272
+ queries.add(pending);
273
+ void pending.then(() => queries.delete(pending), () => queries.delete(pending));
274
+ return pending;
275
+ }),
276
+ release(error) {
277
+ if (released) {
278
+ disposalFailed = true;
279
+ return;
280
+ }
281
+ released = true;
282
+ // release is synchronous in pg, but disposal must wait for actual raw
283
+ // query completion and remain retained independently of method outcome.
284
+ owned.track(Promise.allSettled([...queries]).then(() => {
285
+ try {
286
+ client.release(error);
287
+ }
288
+ catch {
289
+ disposalFailed = true;
290
+ }
291
+ }));
292
+ },
293
+ };
294
+ },
295
+ };
296
+ return Object.freeze({
297
+ async migrate(invocation) {
298
+ if (closing)
299
+ throw new PostgresEventMigrationError('UNAVAILABLE');
300
+ try {
301
+ await owned.run(retainedPool, invocation, async (run) => {
302
+ await run('SELECT pg_catalog.pg_advisory_xact_lock(1740125,1)');
303
+ // A missing capture catalog is not evidence of an empty Events store:
304
+ // views, partial objects and retained later families forbid recreation.
305
+ const reserved = (await run(`SELECT c.relname,c.relkind FROM pg_catalog.pg_class c
306
+ JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace
307
+ WHERE n.nspname='public' AND pg_catalog.starts_with(c.relname::pg_catalog.text,'emseepea_event_')`)).rows;
308
+ if (reserved.length === 0) {
309
+ for (const statement of statements)
310
+ await run(statement);
311
+ await run('INSERT INTO public.emseepea_event_capture_migrations(singleton,version,revision) VALUES(true,$1,$2)', [VERSION, REVISION]);
312
+ }
313
+ await verify(run);
314
+ }, false, error => error instanceof PostgresEventMigrationError);
315
+ }
316
+ catch (error) {
317
+ if (error instanceof PostgresEventMigrationError)
318
+ throw error;
319
+ const code = error && typeof error === 'object' && 'code' in error ? error.code : undefined;
320
+ throw new PostgresEventMigrationError(code === 'OUTCOME_UNKNOWN' ? code : code === 'ABORTED' || code === 'DEADLINE' || code === 'INVALID_INPUT' ? code : 'UNAVAILABLE');
321
+ }
322
+ },
323
+ async settle(invocation) {
324
+ closing = true;
325
+ return await owned.settle(invocation) && !disposalFailed;
326
+ },
327
+ });
328
+ }
329
+ //# sourceMappingURL=events-postgres-migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-migrations.js","sourceRoot":"","sources":["../src/events-postgres-migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ExternalMcpEventInvocation } from './events-external.js';
2
+ import type { PostgresEventClient } from './events-postgres.js';
3
+ export interface OwnedEventClient extends PostgresEventClient {
4
+ release(error?: Error): void;
5
+ }
6
+ export interface OwnedEventPool {
7
+ connect(): Promise<OwnedEventClient>;
8
+ }
9
+ export type EventSql = (sql: string, values?: readonly unknown[]) => ReturnType<PostgresEventClient['query']>;
10
+ /** Private operation owner. A local timeout is never a backend cancellation claim. */
11
+ export declare function createOwnedEventOperations(): {
12
+ track: <T>(promise: Promise<T>) => Promise<T>;
13
+ run<T>(pool: OwnedEventPool, invocation: ExternalMcpEventInvocation, work: (sql: EventSql) => Promise<T>, readOnly?: boolean, knownError?: (error: unknown) => boolean): Promise<T>;
14
+ settle(invocation: ExternalMcpEventInvocation): Promise<boolean>;
15
+ };
16
+ //# sourceMappingURL=events-postgres-owned.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-owned.d.ts","sourceRoot":"","sources":["../src/events-postgres-owned.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAAG,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE;AAC9F,MAAM,WAAW,cAAc;IAAG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAAE;AACxE,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,KAAK,UAAU,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9G,sFAAsF;AACtF,wBAAgB,0BAA0B;YAGzB,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC;QAwE5C,CAAC,QAAO,cAAc,cAAY,0BAA0B,QAAM,CAAC,GAAG,EAAC,QAAQ,KAAG,OAAO,CAAC,CAAC,CAAC,mCAA2B,CAAC,KAAK,EAAC,OAAO,KAAG,OAAO,GAAY,OAAO,CAAC,CAAC,CAAC;uBAGjJ,0BAA0B,GAAE,OAAO,CAAC,OAAO,CAAC;EAiBvE"}