@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,161 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ import { ExternalMcpEventError } from './events-external.js';
3
+ /** Private operation owner. A local timeout is never a backend cancellation claim. */
4
+ export function createOwnedEventOperations() {
5
+ const pending = new Set();
6
+ let closed = false, disposalFailed = false;
7
+ function track(promise) {
8
+ pending.add(promise);
9
+ void promise.then(() => pending.delete(promise), () => pending.delete(promise));
10
+ return promise;
11
+ }
12
+ function dispose(client, uncertain) {
13
+ try {
14
+ client.release(uncertain ? new Error('EVENT_OPERATION_UNKNOWN') : undefined);
15
+ }
16
+ catch {
17
+ disposalFailed = true;
18
+ }
19
+ }
20
+ async function operation(pool, invocation, work, readOnly, knownError) {
21
+ if (!invocation?.signal || !Number.isFinite(invocation.deadlineMs))
22
+ throw new ExternalMcpEventError('INVALID_INPUT');
23
+ const end = performance.now() + Math.min(5000, invocation.deadlineMs - Date.now());
24
+ const check = () => {
25
+ if (closed || invocation.signal.aborted)
26
+ throw new ExternalMcpEventError('ABORTED');
27
+ if (performance.now() >= end)
28
+ throw new ExternalMcpEventError('DEADLINE');
29
+ };
30
+ check();
31
+ async function wait(promise, cap, abort = true) {
32
+ let timer;
33
+ let stop;
34
+ try {
35
+ return await Promise.race([track(promise), new Promise((_resolve, reject) => {
36
+ timer = setTimeout(() => reject(new ExternalMcpEventError('DEADLINE')), Math.max(1, Math.min(cap, end - performance.now())));
37
+ if (abort) {
38
+ stop = () => reject(new ExternalMcpEventError('ABORTED'));
39
+ invocation.signal.addEventListener('abort', stop, { once: true });
40
+ if (invocation.signal.aborted)
41
+ stop();
42
+ }
43
+ })]);
44
+ }
45
+ finally {
46
+ if (timer)
47
+ clearTimeout(timer);
48
+ if (stop)
49
+ invocation.signal.removeEventListener('abort', stop);
50
+ }
51
+ }
52
+ const acquisition = Promise.resolve().then(() => pool.connect());
53
+ let client;
54
+ try {
55
+ client = await wait(acquisition, 500);
56
+ check();
57
+ }
58
+ catch (error) {
59
+ track(acquisition.then(value => dispose(value, true), () => { }));
60
+ if (error instanceof ExternalMcpEventError)
61
+ throw error;
62
+ throw new ExternalMcpEventError('UNAVAILABLE');
63
+ }
64
+ let uncertain = false, committing = false, began = false;
65
+ const raw = async (sql, values) => {
66
+ check();
67
+ try {
68
+ const result = await wait(Promise.resolve().then(() => client.query(sql, values)), 1000);
69
+ check();
70
+ return result;
71
+ }
72
+ catch (error) {
73
+ const code = error && typeof error === 'object' && 'code' in error ? error.code : undefined;
74
+ if (error instanceof ExternalMcpEventError || typeof code !== 'string' || !/^[0-9A-Z]{5}$/.test(code) || code.startsWith('08'))
75
+ uncertain = true;
76
+ throw error;
77
+ }
78
+ };
79
+ const run = async (sql, values) => {
80
+ check();
81
+ const ms = Math.max(1, Math.floor(Math.min(750, end - performance.now())));
82
+ await raw("SELECT pg_catalog.set_config('statement_timeout',$1,true),pg_catalog.set_config('lock_timeout',$2,true)", [`${ms}ms`, `${Math.min(ms, 250)}ms`]);
83
+ return raw(sql, values);
84
+ };
85
+ try {
86
+ await raw(readOnly ? 'BEGIN READ ONLY' : 'BEGIN');
87
+ began = true;
88
+ await raw('SET LOCAL search_path=pg_catalog,public,pg_temp');
89
+ const result = await work(run);
90
+ check();
91
+ committing = true;
92
+ await raw('COMMIT');
93
+ committing = false;
94
+ began = false;
95
+ return result;
96
+ }
97
+ catch (error) {
98
+ uncertain ||= committing;
99
+ if (began && !uncertain) {
100
+ // Cleanup has its own finite cap; it never races another query on this client.
101
+ try {
102
+ const rollback = track(Promise.resolve().then(() => client.query('ROLLBACK')));
103
+ let timer;
104
+ try {
105
+ await Promise.race([rollback, new Promise((_resolve, reject) => { timer = setTimeout(() => reject(new Error('ROLLBACK_UNKNOWN')), 500); })]);
106
+ }
107
+ finally {
108
+ if (timer)
109
+ clearTimeout(timer);
110
+ }
111
+ }
112
+ catch {
113
+ uncertain = true;
114
+ }
115
+ }
116
+ if (uncertain)
117
+ throw new ExternalMcpEventError(readOnly ? 'UNAVAILABLE' : 'OUTCOME_UNKNOWN');
118
+ if (error instanceof ExternalMcpEventError || knownError(error))
119
+ throw error;
120
+ throw new ExternalMcpEventError('UNAVAILABLE');
121
+ }
122
+ finally {
123
+ dispose(client, uncertain);
124
+ }
125
+ }
126
+ return {
127
+ track,
128
+ run(pool, invocation, work, readOnly = false, knownError = () => false) {
129
+ return track(operation(pool, invocation, work, readOnly, knownError));
130
+ },
131
+ async settle(invocation) {
132
+ closed = true;
133
+ const end = performance.now() + Math.max(0, invocation.deadlineMs - Date.now());
134
+ while (pending.size) {
135
+ if (invocation.signal.aborted || performance.now() >= end)
136
+ return false;
137
+ let timer;
138
+ let stop;
139
+ try {
140
+ const done = await Promise.race([Promise.allSettled([...pending]).then(() => true), new Promise(resolve => {
141
+ timer = setTimeout(() => resolve(false), Math.max(1, end - performance.now()));
142
+ stop = () => resolve(false);
143
+ invocation.signal.addEventListener('abort', stop, { once: true });
144
+ if (invocation.signal.aborted)
145
+ stop();
146
+ })]);
147
+ if (!done)
148
+ return false;
149
+ }
150
+ finally {
151
+ if (timer)
152
+ clearTimeout(timer);
153
+ if (stop)
154
+ invocation.signal.removeEventListener('abort', stop);
155
+ }
156
+ }
157
+ return !disposalFailed;
158
+ },
159
+ };
160
+ }
161
+ //# sourceMappingURL=events-postgres-owned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres-owned.js","sourceRoot":"","sources":["../src/events-postgres-owned.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { McpEventDefinition } from "./events.js";
2
+ export { postgresEventCaptureMigrations, migratePostgresEventCapture } from "./events-postgres-migrations.js";
3
+ export { createPostgresEventDelivery, createPostgresEventDeliveryMigrator, PostgresEventDeliveryMigrationError, type PostgresEventDelivery, type PostgresEventDeliveryOptions, type PostgresEventDeliveryOutcome, } from "./events-postgres-delivery.js";
4
+ export { createPostgresEventDispatchMigrator, PostgresEventDispatchMigrationError, } from "./events-postgres-dispatch-migrations.js";
5
+ export interface PostgresEventClient {
6
+ query<Row extends Record<string, unknown> = Record<string, unknown>>(text: string, values?: readonly unknown[]): Promise<{
7
+ readonly rows: readonly Row[];
8
+ readonly rowCount: number | null;
9
+ }>;
10
+ }
11
+ export interface PostgresEventInvocation {
12
+ readonly signal: AbortSignal;
13
+ /** Absolute Unix time in milliseconds. The operation also applies its own shorter maximum duration. */
14
+ readonly deadlineMs: number;
15
+ }
16
+ export interface PostgresSourcePublication {
17
+ readonly sourceEventId: string;
18
+ readonly sourceVersion: string;
19
+ readonly eventName: string;
20
+ readonly ownerKey: string;
21
+ readonly occurredAt: string;
22
+ readonly data: Readonly<Record<string, unknown>>;
23
+ }
24
+ declare const transactionBrand: unique symbol;
25
+ export interface PostgresEventTransaction {
26
+ readonly [transactionBrand]: true;
27
+ }
28
+ export interface PostgresCaptureOutcome {
29
+ readonly outcome: "captured" | "replayed";
30
+ readonly eventId: string;
31
+ readonly deliveryCount: number;
32
+ readonly eligibilityAt: string;
33
+ }
34
+ export type PostgresEventCaptureErrorCode = "INVALID_INPUT" | "ABORTED" | "DEADLINE" | "OUTCOME_UNKNOWN" | "TRANSACTION_NOT_BOUND" | "TRANSACTION_CHANGED" | "UNSUPPORTED_TRANSACTION_POLICY" | "CONCURRENT_USE" | "PUBLICATION_CONFLICT" | "WHOLE_TRANSACTION_RETRY_REQUIRED" | "UNAVAILABLE";
35
+ export declare class PostgresEventCaptureError extends Error {
36
+ readonly code: PostgresEventCaptureErrorCode;
37
+ constructor(code: PostgresEventCaptureErrorCode);
38
+ }
39
+ /** Captures publication state only. It does not configure or deliver native Events.
40
+ * Registered schemas and matchers must be side-effect-free and synchronous. A deadline
41
+ * check cannot interrupt a matcher after it starts. The caller exclusively owns the
42
+ * transaction. Ordinary deletion must retain deduplication identities. Administrative
43
+ * ledger erasure is governed separately and is not provided by this capture-only API.
44
+ */
45
+ export declare function createPostgresEventCapture(options: Readonly<{
46
+ namespace: string;
47
+ sourceKind: string;
48
+ definitions: readonly McpEventDefinition[];
49
+ }>): Readonly<{
50
+ bindTransaction(client: PostgresEventClient, invocation: PostgresEventInvocation): Promise<PostgresEventTransaction>;
51
+ captureInTransaction(handle: PostgresEventTransaction, publication: PostgresSourcePublication, invocation: PostgresEventInvocation): Promise<PostgresCaptureOutcome>;
52
+ }>;
53
+ //# sourceMappingURL=events-postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres.d.ts","sourceRoot":"","sources":["../src/events-postgres.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9G,OAAO,EACL,2BAA2B,EAC3B,mCAAmC,EACnC,mCAAmC,EACnC,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,mCAAmC,EACnC,mCAAmC,GACpC,MAAM,0CAA0C,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GACxC,OAAO,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CACjF;AACD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,uGAAuG;IACvG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AACD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AACD,OAAO,CAAC,MAAM,gBAAgB,EAAE,OAAO,MAAM,CAAC;AAC9C,MAAM,WAAW,wBAAwB;IAAG,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAA;CAAE;AAC/E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AACD,MAAM,MAAM,6BAA6B,GAAG,eAAe,GAAG,SAAS,GAAG,UAAU,GAClF,iBAAiB,GAAG,uBAAuB,GAAG,qBAAqB,GACnE,gCAAgC,GAAG,gBAAgB,GAAG,sBAAsB,GAC5E,kCAAkC,GAAG,aAAa,CAAC;AACrD,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,6BAA6B;gBAAnC,IAAI,EAAE,6BAA6B;CACzD;AAuHD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACnF,CAAC;4BAmBgC,mBAAmB,cAAc,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;iCAavF,wBAAwB,eAAe,yBAAyB,cACrF,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;GAyE1E"}
@@ -0,0 +1,289 @@
1
+ import { createHash } from "node:crypto";
2
+ import { performance } from "node:perf_hooks";
3
+ export { postgresEventCaptureMigrations, migratePostgresEventCapture } from "./events-postgres-migrations.js";
4
+ export { createPostgresEventDelivery, createPostgresEventDeliveryMigrator, PostgresEventDeliveryMigrationError, } from "./events-postgres-delivery.js";
5
+ export { createPostgresEventDispatchMigrator, PostgresEventDispatchMigrationError, } from "./events-postgres-dispatch-migrations.js";
6
+ export class PostgresEventCaptureError extends Error {
7
+ code;
8
+ constructor(code) {
9
+ super(code);
10
+ this.code = code;
11
+ this.name = "PostgresEventCaptureError";
12
+ }
13
+ }
14
+ function fail(code) { throw new PostgresEventCaptureError(code); }
15
+ function checkedText(value) {
16
+ if (typeof value !== "string" || /\u0000|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(value))
17
+ fail("INVALID_INPUT");
18
+ return value;
19
+ }
20
+ function identifier(value) {
21
+ const text = checkedText(value);
22
+ if (!text || Buffer.byteLength(text) > 240)
23
+ fail("INVALID_INPUT");
24
+ return text;
25
+ }
26
+ function ownValues(value, array = false) {
27
+ if (!value || typeof value !== "object" || Object.getPrototypeOf(value) !== (array ? Array.prototype : Object.prototype))
28
+ fail("INVALID_INPUT");
29
+ const descriptors = Object.getOwnPropertyDescriptors(value);
30
+ for (const key of Reflect.ownKeys(descriptors)) {
31
+ if (typeof key !== "string")
32
+ fail("INVALID_INPUT");
33
+ const property = descriptors[key];
34
+ if (!property || !("value" in property) || (!property.enumerable && !(array && key === "length")))
35
+ fail("INVALID_INPUT");
36
+ checkedText(key);
37
+ }
38
+ return descriptors;
39
+ }
40
+ function canonical(value, depth = 0) {
41
+ if (depth > 32)
42
+ fail("INVALID_INPUT");
43
+ if (value === null || typeof value === "boolean")
44
+ return value;
45
+ if (typeof value === "string")
46
+ return checkedText(value);
47
+ if (typeof value === "number" && Number.isFinite(value) && !Object.is(value, -0))
48
+ return value;
49
+ if (Array.isArray(value)) {
50
+ const fields = ownValues(value, true);
51
+ if (Reflect.ownKeys(fields).length !== value.length + 1)
52
+ fail("INVALID_INPUT");
53
+ const result = [];
54
+ for (let i = 0; i < value.length; i++) {
55
+ if (!Object.hasOwn(fields, String(i)))
56
+ fail("INVALID_INPUT");
57
+ result.push(canonical(fields[String(i)].value, depth + 1));
58
+ }
59
+ return result;
60
+ }
61
+ const fields = ownValues(value);
62
+ const result = Object.create(null);
63
+ for (const key of Object.keys(fields).sort())
64
+ result[key] = canonical(fields[key].value, depth + 1);
65
+ return result;
66
+ }
67
+ function freezeJson(value) {
68
+ if (value && typeof value === "object") {
69
+ for (const child of Object.values(value))
70
+ freezeJson(child);
71
+ Object.freeze(value);
72
+ }
73
+ }
74
+ const hash = (value) => createHash("sha256").update(JSON.stringify(value)).digest("hex");
75
+ function clock(invocation) {
76
+ if (!invocation?.signal || !Number.isFinite(invocation.deadlineMs))
77
+ fail("INVALID_INPUT");
78
+ if (invocation.signal.aborted)
79
+ fail("ABORTED");
80
+ const remaining = Math.min(4000, invocation.deadlineMs - Date.now());
81
+ if (remaining <= 0)
82
+ fail("DEADLINE");
83
+ return { signal: invocation.signal, end: performance.now() + remaining };
84
+ }
85
+ function check(time, sent = false) {
86
+ if (time.signal.aborted || performance.now() >= time.end)
87
+ fail(sent ? "OUTCOME_UNKNOWN" : time.signal.aborted ? "ABORTED" : "DEADLINE");
88
+ }
89
+ const IDENTITY = `SELECT pg_catalog.pg_backend_pid()::pg_catalog.text AS backend,pg_catalog.pg_current_xact_id()::pg_catalog.text AS xid,
90
+ pg_catalog.current_setting('transaction_isolation') AS isolation,
91
+ (SELECT setting::pg_catalog.int8 FROM pg_catalog.pg_settings WHERE name OPERATOR(pg_catalog.=) 'statement_timeout') AS statement_ms,
92
+ (SELECT setting::pg_catalog.int8 FROM pg_catalog.pg_settings WHERE name OPERATOR(pg_catalog.=) 'lock_timeout') AS lock_ms`;
93
+ const GUARD = `WITH guard AS MATERIALIZED (SELECT
94
+ pg_catalog.pg_backend_pid()::pg_catalog.text OPERATOR(pg_catalog.=) $1 AND pg_catalog.pg_current_xact_id()::pg_catalog.text OPERATOR(pg_catalog.=) $2
95
+ AND pg_catalog.current_setting('transaction_isolation') OPERATOR(pg_catalog.=) $3
96
+ AND (pg_catalog.current_setting('transaction_isolation') OPERATOR(pg_catalog.=) 'repeatable read' OR pg_catalog.current_setting('transaction_isolation') OPERATOR(pg_catalog.=) 'serializable')
97
+ AND (SELECT setting::pg_catalog.int8 FROM pg_catalog.pg_settings WHERE name OPERATOR(pg_catalog.=) 'statement_timeout') OPERATOR(pg_catalog.>=) 1
98
+ AND (SELECT setting::pg_catalog.int8 FROM pg_catalog.pg_settings WHERE name OPERATOR(pg_catalog.=) 'statement_timeout') OPERATOR(pg_catalog.<=) 1500
99
+ AND (SELECT setting::pg_catalog.int8 FROM pg_catalog.pg_settings WHERE name OPERATOR(pg_catalog.=) 'lock_timeout') OPERATOR(pg_catalog.>=) 1
100
+ AND (SELECT setting::pg_catalog.int8 FROM pg_catalog.pg_settings WHERE name OPERATOR(pg_catalog.=) 'lock_timeout') OPERATOR(pg_catalog.<=) 500
101
+ AND $4::pg_catalog.text OPERATOR(pg_catalog.=) $5::pg_catalog.text AS valid)`;
102
+ const READ_SOURCE = `${GUARD} SELECT valid,
103
+ (SELECT pg_catalog.jsonb_build_object('fingerprint',fingerprint,'eventId',event_id,'deliveryCount',recipient_count,
104
+ 'eligibilityAt',pg_catalog.to_char(eligibility_at AT TIME ZONE 'UTC','YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'))
105
+ FROM public.emseepea_event_sources WHERE namespace OPERATOR(pg_catalog.=) $5 AND source_kind OPERATOR(pg_catalog.=) $6 AND source_id OPERATOR(pg_catalog.=) $7) AS saved
106
+ FROM guard`;
107
+ const TICK = `${GUARD} SELECT valid,pg_catalog.clock_timestamp() AS eligibility_at FROM guard`;
108
+ const CANDIDATES = `SELECT subscription_id,generation,arguments FROM public.emseepea_event_capture_subscriptions
109
+ WHERE namespace OPERATOR(pg_catalog.=) $1 AND owner_key OPERATOR(pg_catalog.=) $2 AND event_name OPERATOR(pg_catalog.=) $3 AND active AND expires_at OPERATOR(pg_catalog.>) $4::pg_catalog.timestamptz
110
+ ORDER BY subscription_id,generation`;
111
+ const SOURCE = `${GUARD}, written AS (
112
+ INSERT INTO public.emseepea_event_sources(namespace,source_kind,source_id,source_version,fingerprint,event_id,
113
+ owner_key,event_name,occurred_at,eligibility_at,recipient_count,payload)
114
+ SELECT $5,$6,$7,$8,$9,$10,$11,$12,$13::pg_catalog.timestamptz,$14::pg_catalog.timestamptz,$15::pg_catalog.int4,$16::pg_catalog.jsonb
115
+ FROM guard WHERE valid RETURNING source_id)
116
+ SELECT valid,(SELECT pg_catalog.count(*)::pg_catalog.int4 FROM written) AS n FROM guard`;
117
+ const INTENTS = `${GUARD}, written AS (
118
+ INSERT INTO public.emseepea_event_intents(namespace,source_kind,source_id,subscription_id,generation,delivery_id,event_id)
119
+ SELECT $5,$6,$7,j.subscription_id,j.generation,j.delivery_id,$8 FROM guard,
120
+ pg_catalog.jsonb_to_recordset($9::pg_catalog.jsonb) AS j(subscription_id pg_catalog.text,generation pg_catalog.text,delivery_id pg_catalog.text)
121
+ WHERE valid RETURNING delivery_id)
122
+ SELECT valid,(SELECT pg_catalog.count(*)::pg_catalog.int4 FROM written) AS n FROM guard`;
123
+ function policy(value) {
124
+ return !!value && typeof value.backend === "string" && typeof value.xid === "string"
125
+ && ["repeatable read", "serializable"].includes(value.isolation)
126
+ && Number(value.statement_ms) > 0 && Number(value.statement_ms) <= 1500
127
+ && Number(value.lock_ms) > 0 && Number(value.lock_ms) <= 500;
128
+ }
129
+ function valid(row) {
130
+ if (row?.valid !== true)
131
+ fail("TRANSACTION_CHANGED");
132
+ }
133
+ function sqlError(error) {
134
+ if (error instanceof PostgresEventCaptureError)
135
+ throw error;
136
+ const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
137
+ if (code === "40001" || code === "55P03")
138
+ fail("WHOLE_TRANSACTION_RETRY_REQUIRED");
139
+ if (code === "23505")
140
+ fail("PUBLICATION_CONFLICT");
141
+ fail("UNAVAILABLE");
142
+ }
143
+ /** Captures publication state only. It does not configure or deliver native Events.
144
+ * Registered schemas and matchers must be side-effect-free and synchronous. A deadline
145
+ * check cannot interrupt a matcher after it starts. The caller exclusively owns the
146
+ * transaction. Ordinary deletion must retain deduplication identities. Administrative
147
+ * ledger erasure is governed separately and is not provided by this capture-only API.
148
+ */
149
+ export function createPostgresEventCapture(options) {
150
+ const namespace = identifier(options?.namespace);
151
+ const sourceKind = identifier(options?.sourceKind);
152
+ if (!Array.isArray(options.definitions) || !options.definitions.length)
153
+ fail("INVALID_INPUT");
154
+ const definitions = new Map();
155
+ for (const definition of options.definitions) {
156
+ identifier(definition?.name);
157
+ if (!/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)+$/.test(definition.name) || definitions.has(definition.name) || typeof definition.matches !== "function" ||
158
+ typeof definition.payloadSchema?.safeParse !== "function" || typeof definition.inputSchema?.safeParse !== "function")
159
+ fail("INVALID_INPUT");
160
+ definitions.set(definition.name, Object.freeze({ ...definition }));
161
+ }
162
+ const bindings = new WeakMap();
163
+ async function query(client, time, sql, values) {
164
+ check(time);
165
+ const result = await client.query(sql, values);
166
+ check(time, true); // A late response is not rollback/cancellation evidence.
167
+ return result;
168
+ }
169
+ return Object.freeze({
170
+ async bindTransaction(client, invocation) {
171
+ const time = clock(invocation);
172
+ if (!client || typeof client.query !== "function")
173
+ fail("INVALID_INPUT");
174
+ try {
175
+ const first = (await query(client, time, IDENTITY)).rows[0];
176
+ const second = (await query(client, time, IDENTITY)).rows[0];
177
+ if (!policy(first) || !policy(second))
178
+ fail("UNSUPPORTED_TRANSACTION_POLICY");
179
+ if (first.backend !== second.backend || first.xid !== second.xid || first.isolation !== second.isolation)
180
+ fail("TRANSACTION_NOT_BOUND");
181
+ const handle = Object.freeze({});
182
+ bindings.set(handle, { ...second, client, namespace, active: false, invalid: false });
183
+ return handle;
184
+ }
185
+ catch (error) {
186
+ return sqlError(error);
187
+ }
188
+ },
189
+ async captureInTransaction(handle, publication, invocation) {
190
+ const state = handle && bindings.get(handle);
191
+ if (!state || state.invalid)
192
+ fail("TRANSACTION_NOT_BOUND");
193
+ if (state.active) {
194
+ state.invalid = true;
195
+ fail("CONCURRENT_USE");
196
+ }
197
+ state.active = true;
198
+ try {
199
+ const time = clock(invocation);
200
+ const fields = ownValues(publication);
201
+ const get = (key) => fields[key]?.value;
202
+ const sourceId = identifier(get("sourceEventId"));
203
+ const sourceVersion = identifier(get("sourceVersion"));
204
+ const eventName = identifier(get("eventName"));
205
+ const ownerKey = identifier(get("ownerKey"));
206
+ const occurredAt = checkedText(get("occurredAt"));
207
+ if (!/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}Z$/.test(occurredAt) || !Number.isFinite(Date.parse(occurredAt))
208
+ || new Date(occurredAt).toISOString() !== occurredAt)
209
+ fail("INVALID_INPUT");
210
+ const definition = definitions.get(eventName);
211
+ if (!definition)
212
+ fail("INVALID_INPUT");
213
+ const raw = get("data");
214
+ ownValues(raw);
215
+ const rawCanonical = canonical(raw);
216
+ if (Buffer.byteLength(JSON.stringify(rawCanonical)) > 262144)
217
+ fail("INVALID_INPUT");
218
+ freezeJson(rawCanonical);
219
+ const parsedPayload = definition.payloadSchema.safeParse(rawCanonical);
220
+ if (!parsedPayload.success)
221
+ fail("INVALID_INPUT");
222
+ ownValues(parsedPayload.data);
223
+ const data = canonical(parsedPayload.data);
224
+ freezeJson(data);
225
+ const body = JSON.stringify(data);
226
+ if (Buffer.byteLength(body) > 262144)
227
+ fail("INVALID_INPUT");
228
+ const fingerprint = hash([namespace, sourceKind, sourceId, sourceVersion, eventName, ownerKey, occurredAt, data]);
229
+ const base = [state.backend, state.xid, state.isolation, state.namespace, namespace];
230
+ const existing = (await query(state.client, time, READ_SOURCE, [...base, sourceKind, sourceId])).rows[0];
231
+ valid(existing);
232
+ if (existing.saved !== null) {
233
+ const saved = existing.saved;
234
+ if (saved.fingerprint !== fingerprint)
235
+ fail("PUBLICATION_CONFLICT");
236
+ return Object.freeze({ outcome: "replayed", eventId: saved.eventId, deliveryCount: saved.deliveryCount, eligibilityAt: saved.eligibilityAt });
237
+ }
238
+ const tick = (await query(state.client, time, TICK, base)).rows[0];
239
+ valid(tick);
240
+ const eligibility = tick.eligibility_at;
241
+ if (!(eligibility instanceof Date) || !Number.isFinite(eligibility.getTime()))
242
+ fail("UNAVAILABLE");
243
+ const candidates = (await query(state.client, time, CANDIDATES, [namespace, ownerKey, eventName, eligibility])).rows;
244
+ const eventId = hash(["event", namespace, sourceKind, sourceId]);
245
+ const recipients = [];
246
+ for (const candidate of candidates) {
247
+ check(time);
248
+ ownValues(candidate.arguments);
249
+ const rawArguments = canonical(candidate.arguments);
250
+ freezeJson(rawArguments);
251
+ const parsedArguments = definition.inputSchema.safeParse(rawArguments);
252
+ if (!parsedArguments.success)
253
+ fail("INVALID_INPUT");
254
+ ownValues(parsedArguments.data);
255
+ const arguments_ = canonical(parsedArguments.data);
256
+ freezeJson(arguments_);
257
+ const matches = definition.matches(arguments_, data, ownerKey);
258
+ if (typeof matches !== "boolean")
259
+ fail("INVALID_INPUT");
260
+ if (matches) {
261
+ const subscriptionId = identifier(candidate.subscription_id);
262
+ const generation = identifier(candidate.generation);
263
+ recipients.push({ subscription_id: subscriptionId, generation,
264
+ delivery_id: hash(["delivery", eventId, subscriptionId, generation]) });
265
+ }
266
+ }
267
+ const source = (await query(state.client, time, SOURCE, [...base, sourceKind, sourceId, sourceVersion,
268
+ fingerprint, eventId, ownerKey, eventName, occurredAt, eligibility, recipients.length, body])).rows[0];
269
+ valid(source);
270
+ if (source.n !== 1)
271
+ fail("UNAVAILABLE");
272
+ const intents = (await query(state.client, time, INTENTS, [...base, sourceKind, sourceId, eventId,
273
+ JSON.stringify(recipients)])).rows[0];
274
+ valid(intents);
275
+ if (intents.n !== recipients.length)
276
+ fail("UNAVAILABLE");
277
+ return Object.freeze({ outcome: "captured", eventId, deliveryCount: recipients.length, eligibilityAt: eligibility.toISOString() });
278
+ }
279
+ catch (error) {
280
+ state.invalid = true;
281
+ return sqlError(error);
282
+ }
283
+ finally {
284
+ state.active = false;
285
+ }
286
+ },
287
+ });
288
+ }
289
+ //# sourceMappingURL=events-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-postgres.js","sourceRoot":"","sources":["../src/events-postgres.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2783,20 +2783,69 @@ function requestId(value) {
2783
2783
  }
2784
2784
  async function runWithDeadline(requestSignal, deadlineMs, work) {
2785
2785
  const remainingMs = deadlineMs - Date.now();
2786
- const deadlineSignal = remainingMs > 0 ? AbortSignal.timeout(remainingMs) : AbortSignal.abort();
2787
2786
  const invocationSignal = requestOperations.getStore()?.signal;
2788
- const signal = AbortSignal.any([
2789
- requestSignal,
2790
- deadlineSignal,
2791
- ...(invocationSignal ? [invocationSignal] : []),
2792
- ]);
2793
2787
  return new Promise((resolve, reject) => {
2794
- const onAbort = () => reject(new Error("Tool execution cancelled"));
2788
+ const controller = new AbortController();
2789
+ const signal = controller.signal;
2790
+ let timer;
2791
+ let settled = false;
2792
+ const abortFrom = (source) => {
2793
+ if (!signal.aborted)
2794
+ controller.abort(source.reason);
2795
+ };
2796
+ const onRequestAbort = () => abortFrom(requestSignal);
2797
+ const onInvocationAbort = () => {
2798
+ if (invocationSignal)
2799
+ abortFrom(invocationSignal);
2800
+ };
2801
+ const onAbort = () => finishReject(new Error("Tool execution cancelled"));
2802
+ const cleanup = () => {
2803
+ if (timer !== undefined)
2804
+ clearTimeout(timer);
2805
+ requestSignal.removeEventListener("abort", onRequestAbort);
2806
+ if (invocationSignal && invocationSignal !== requestSignal) {
2807
+ invocationSignal.removeEventListener("abort", onInvocationAbort);
2808
+ }
2809
+ signal.removeEventListener("abort", onAbort);
2810
+ };
2811
+ function finishResolve(value) {
2812
+ if (settled)
2813
+ return;
2814
+ settled = true;
2815
+ cleanup();
2816
+ resolve(value);
2817
+ }
2818
+ function finishReject(error) {
2819
+ if (settled)
2820
+ return;
2821
+ settled = true;
2822
+ cleanup();
2823
+ reject(error);
2824
+ }
2825
+ if (requestSignal.aborted) {
2826
+ abortFrom(requestSignal);
2827
+ }
2828
+ else if (remainingMs <= 0) {
2829
+ controller.abort(new DOMException("The operation was aborted due to timeout", "TimeoutError"));
2830
+ }
2831
+ else if (invocationSignal?.aborted) {
2832
+ abortFrom(invocationSignal);
2833
+ }
2834
+ else {
2835
+ requestSignal.addEventListener("abort", onRequestAbort, { once: true });
2836
+ if (invocationSignal && invocationSignal !== requestSignal) {
2837
+ invocationSignal.addEventListener("abort", onInvocationAbort, { once: true });
2838
+ }
2839
+ timer = setTimeout(() => {
2840
+ if (!signal.aborted) {
2841
+ controller.abort(new DOMException("The operation was aborted due to timeout", "TimeoutError"));
2842
+ }
2843
+ }, remainingMs);
2844
+ }
2795
2845
  if (signal.aborted)
2796
2846
  return onAbort();
2797
2847
  signal.addEventListener("abort", onAbort, { once: true });
2798
- Promise.resolve().then(() => work(signal)).then(resolve, reject)
2799
- .finally(() => signal.removeEventListener("abort", onAbort));
2848
+ Promise.resolve().then(() => work(signal)).then(finishResolve, finishReject);
2800
2849
  });
2801
2850
  }
2802
2851
  function assertUniqueToolNames(tools) {