@event-driven-io/emmett-postgresql 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-5Z7GAHAZ.mjs → chunk-COTRMVOL.mjs} +8 -8
- package/dist/chunk-COTRMVOL.mjs.map +1 -0
- package/dist/chunk-D5T7G7UL.mjs +4 -0
- package/dist/chunk-D5T7G7UL.mjs.map +1 -0
- package/dist/chunk-E56AUXA3.mjs +2 -0
- package/dist/chunk-E56AUXA3.mjs.map +1 -0
- package/dist/{chunk-Z67RDRQW.js → chunk-EEYVFO3G.js} +12 -12
- package/dist/chunk-EEYVFO3G.js.map +1 -0
- package/dist/chunk-EMFXYVCK.js +2 -0
- package/dist/chunk-EMFXYVCK.js.map +1 -0
- package/dist/chunk-KA3LTDXJ.mjs +2 -0
- package/dist/chunk-KA3LTDXJ.mjs.map +1 -0
- package/dist/{chunk-N46ZM26V.js → chunk-KADY7IHM.js} +4 -4
- package/dist/chunk-KADY7IHM.js.map +1 -0
- package/dist/chunk-MI5QKIUY.js +2 -0
- package/dist/chunk-MI5QKIUY.js.map +1 -0
- package/dist/{chunk-TMR7LHTX.js → chunk-P36ZOB2E.js} +3 -3
- package/dist/chunk-P36ZOB2E.js.map +1 -0
- package/dist/chunk-QHCLGPQG.mjs +2 -0
- package/dist/chunk-QHCLGPQG.mjs.map +1 -0
- package/dist/chunk-UMUX2OL5.mjs +2 -0
- package/dist/chunk-UMUX2OL5.mjs.map +1 -0
- package/dist/{chunk-DRZRZGSJ.mjs → chunk-UWD6GOZC.mjs} +2 -2
- package/dist/chunk-UWD6GOZC.mjs.map +1 -0
- package/dist/chunk-WHT7LTAU.js +2 -0
- package/dist/chunk-WHT7LTAU.js.map +1 -0
- package/dist/chunk-XQZVOI6W.js +2 -0
- package/dist/chunk-XQZVOI6W.js.map +1 -0
- package/dist/eventStore/index.d.mts +2 -2
- package/dist/eventStore/index.d.ts +2 -2
- package/dist/eventStore/index.js +1 -1
- package/dist/eventStore/index.mjs +1 -1
- package/dist/eventStore/postgreSQLEventStore.d.mts +3 -6
- package/dist/eventStore/postgreSQLEventStore.d.ts +3 -6
- package/dist/eventStore/postgreSQLEventStore.js +1 -1
- package/dist/eventStore/postgreSQLEventStore.mjs +1 -1
- package/dist/eventStore/projections/index.d.mts +3 -0
- package/dist/eventStore/projections/index.d.ts +3 -0
- package/dist/eventStore/projections/index.js +2 -0
- package/dist/eventStore/projections/index.mjs +2 -0
- package/dist/eventStore/projections/pongo.d.mts +17 -0
- package/dist/eventStore/projections/pongo.d.ts +17 -0
- package/dist/eventStore/projections/pongo.js +2 -0
- package/dist/eventStore/projections/pongo.js.map +1 -0
- package/dist/eventStore/projections/pongo.mjs +2 -0
- package/dist/eventStore/projections/pongo.mjs.map +1 -0
- package/dist/eventStore/schema/appendToStream.d.mts +7 -6
- package/dist/eventStore/schema/appendToStream.d.ts +7 -6
- package/dist/eventStore/schema/appendToStream.js +1 -1
- package/dist/eventStore/schema/appendToStream.mjs +1 -1
- package/dist/eventStore/schema/index.d.mts +1 -1
- package/dist/eventStore/schema/index.d.ts +1 -1
- package/dist/eventStore/schema/index.js +1 -1
- package/dist/eventStore/schema/index.mjs +1 -1
- package/dist/eventStore/schema/readStream.js +1 -1
- package/dist/eventStore/schema/readStream.mjs +1 -1
- package/dist/eventStore/schema/tables.d.mts +12 -13
- package/dist/eventStore/schema/tables.d.ts +12 -13
- package/dist/eventStore/schema/tables.js +1 -1
- package/dist/eventStore/schema/tables.mjs +1 -1
- package/dist/index.d.mts +3 -6
- package/dist/index.d.ts +3 -6
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/postgreSQLEventStore-Dz2eALUF.d.mts +22 -0
- package/dist/postgreSQLEventStore-Dz2eALUF.d.ts +22 -0
- package/package.json +5 -3
- package/dist/chunk-3P346ME6.mjs +0 -2
- package/dist/chunk-3P346ME6.mjs.map +0 -1
- package/dist/chunk-4ZQCCOS3.js +0 -12
- package/dist/chunk-4ZQCCOS3.js.map +0 -1
- package/dist/chunk-5Z7GAHAZ.mjs.map +0 -1
- package/dist/chunk-7K6TUMXZ.mjs +0 -4
- package/dist/chunk-7K6TUMXZ.mjs.map +0 -1
- package/dist/chunk-C6E7NEXU.js +0 -2
- package/dist/chunk-C6E7NEXU.js.map +0 -1
- package/dist/chunk-DRZRZGSJ.mjs.map +0 -1
- package/dist/chunk-FYXDBZNT.mjs +0 -12
- package/dist/chunk-FYXDBZNT.mjs.map +0 -1
- package/dist/chunk-GR4YFDV5.mjs +0 -1
- package/dist/chunk-GR4YFDV5.mjs.map +0 -1
- package/dist/chunk-HUB7W7J3.js +0 -1
- package/dist/chunk-HUB7W7J3.js.map +0 -1
- package/dist/chunk-IX2XL3S5.mjs +0 -2
- package/dist/chunk-IX2XL3S5.mjs.map +0 -1
- package/dist/chunk-IZW7N6BP.js +0 -2
- package/dist/chunk-IZW7N6BP.js.map +0 -1
- package/dist/chunk-K5K3ETWI.mjs +0 -2
- package/dist/chunk-K5K3ETWI.mjs.map +0 -1
- package/dist/chunk-MLVVMWHF.mjs +0 -2
- package/dist/chunk-MLVVMWHF.mjs.map +0 -1
- package/dist/chunk-N46ZM26V.js.map +0 -1
- package/dist/chunk-QQC5YC26.mjs +0 -2
- package/dist/chunk-QQC5YC26.mjs.map +0 -1
- package/dist/chunk-T5F5ZRBR.js +0 -2
- package/dist/chunk-T5F5ZRBR.js.map +0 -1
- package/dist/chunk-TMR7LHTX.js.map +0 -1
- package/dist/chunk-VP4QNFWT.js +0 -2
- package/dist/chunk-VP4QNFWT.js.map +0 -1
- package/dist/chunk-XRWQWEAF.js +0 -2
- package/dist/chunk-XRWQWEAF.js.map +0 -1
- package/dist/chunk-Z67RDRQW.js.map +0 -1
- package/dist/connections/client.d.mts +0 -9
- package/dist/connections/client.d.ts +0 -9
- package/dist/connections/client.js +0 -2
- package/dist/connections/client.js.map +0 -1
- package/dist/connections/client.mjs +0 -2
- package/dist/connections/client.mjs.map +0 -1
- package/dist/connections/index.d.mts +0 -3
- package/dist/connections/index.d.ts +0 -3
- package/dist/connections/index.js +0 -2
- package/dist/connections/index.mjs +0 -2
- package/dist/connections/pool.d.mts +0 -7
- package/dist/connections/pool.d.ts +0 -7
- package/dist/connections/pool.js +0 -2
- package/dist/connections/pool.js.map +0 -1
- package/dist/connections/pool.mjs +0 -2
- package/dist/connections/pool.mjs.map +0 -1
- package/dist/execute/index.d.mts +0 -22
- package/dist/execute/index.d.ts +0 -22
- package/dist/execute/index.js +0 -2
- package/dist/execute/index.js.map +0 -1
- package/dist/execute/index.mjs +0 -2
- package/dist/execute/index.mjs.map +0 -1
- package/dist/sql/index.d.mts +0 -14
- package/dist/sql/index.d.ts +0 -14
- package/dist/sql/index.js +0 -2
- package/dist/sql/index.js.map +0 -1
- package/dist/sql/index.mjs +0 -2
- package/dist/sql/index.mjs.map +0 -1
- package/dist/sql/schema.d.mts +0 -2
- package/dist/sql/schema.d.ts +0 -2
- package/dist/sql/schema.js +0 -2
- package/dist/sql/schema.js.map +0 -1
- package/dist/sql/schema.mjs +0 -2
- package/dist/sql/schema.mjs.map +0 -1
- /package/dist/{connections → eventStore/projections}/index.js.map +0 -0
- /package/dist/{connections → eventStore/projections}/index.mjs.map +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as A,e as
|
|
1
|
+
import{c as A,e as _,f as T}from"./chunk-ABNBEUC6.mjs";import{a as v,c as R,d as S,e as g}from"./chunk-E56AUXA3.mjs";import{executeInTransaction as L,executeSQL as N,rawSql as b,single as I,sql as s}from"@event-driven-io/dumbo";import"pg";import{v4 as f}from"uuid";var H=b(`CREATE OR REPLACE FUNCTION emt_append_event(
|
|
2
2
|
v_event_ids text[],
|
|
3
3
|
v_events_data jsonb[],
|
|
4
4
|
v_events_metadata jsonb[],
|
|
@@ -24,7 +24,7 @@ import{c as A,e as a,f as L}from"./chunk-ABNBEUC6.mjs";import{e as i,f as g}from
|
|
|
24
24
|
BEGIN
|
|
25
25
|
IF v_expected_stream_position IS NULL THEN
|
|
26
26
|
SELECT COALESCE(max(stream_position), 0) INTO v_expected_stream_position
|
|
27
|
-
FROM ${
|
|
27
|
+
FROM ${_.name}
|
|
28
28
|
WHERE stream_id = v_stream_id AND partition = v_partition;
|
|
29
29
|
END IF;
|
|
30
30
|
|
|
@@ -46,7 +46,7 @@ import{c as A,e as a,f as L}from"./chunk-ABNBEUC6.mjs";import{e as i,f as g}from
|
|
|
46
46
|
) AS event
|
|
47
47
|
),
|
|
48
48
|
all_events_insert AS (
|
|
49
|
-
INSERT INTO ${
|
|
49
|
+
INSERT INTO ${T.name}
|
|
50
50
|
(stream_id, stream_position, partition, event_data, event_metadata, event_schema_version, event_type, event_id, transaction_id)
|
|
51
51
|
SELECT
|
|
52
52
|
v_stream_id, ev.stream_position, v_partition, ev.event_data, ev.event_metadata, ev.schema_version, ev.event_type, ev.event_id, v_transaction_id
|
|
@@ -60,12 +60,12 @@ import{c as A,e as a,f as L}from"./chunk-ABNBEUC6.mjs";import{e as i,f as g}from
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
IF v_expected_stream_position = 0 THEN
|
|
63
|
-
INSERT INTO ${
|
|
63
|
+
INSERT INTO ${_.name}
|
|
64
64
|
(stream_id, stream_position, partition, stream_type, stream_metadata, is_archived)
|
|
65
65
|
VALUES
|
|
66
66
|
(v_stream_id, v_next_stream_position, v_partition, v_stream_type, '{}', FALSE);
|
|
67
67
|
ELSE
|
|
68
|
-
UPDATE ${
|
|
68
|
+
UPDATE ${_.name} as s
|
|
69
69
|
SET stream_position = v_next_stream_position
|
|
70
70
|
WHERE stream_id = v_stream_id AND stream_position = v_expected_stream_position AND partition = v_partition AND is_archived = FALSE;
|
|
71
71
|
|
|
@@ -80,7 +80,7 @@ import{c as A,e as a,f as L}from"./chunk-ABNBEUC6.mjs";import{e as i,f as g}from
|
|
|
80
80
|
RETURN QUERY SELECT TRUE, v_next_stream_position, v_last_global_position, v_transaction_id;
|
|
81
81
|
END;
|
|
82
82
|
$$;
|
|
83
|
-
`),
|
|
83
|
+
`),j=(t,a,r,n,i)=>L(t,async e=>{if(n.length===0)return{success:!1,result:{success:!1}};let p;try{let o=C(i?.expectedStreamVersion),c=n.map((u,x)=>({...u,metadata:{streamName:a,eventId:f(),streamPosition:BigInt(x),...u.metadata}}));p=await O(e,a,r,c,{expectedStreamVersion:o}),i?.preCommitHook&&await i.preCommitHook(e,c)}catch(o){if(!y(o))throw o;p={success:!1,last_global_position:null,next_stream_position:null,transaction_id:null}}let{success:d,next_stream_position:m,last_global_position:l,transaction_id:E}=p;return{success:d,result:d&&m&&l&&E?{success:!0,nextStreamPosition:BigInt(m),lastGlobalPosition:BigInt(l),transactionId:E}:{success:!1}}}),C=t=>t===void 0||t===g||t==S||t==R?null:t,y=t=>t instanceof Error&&"code"in t&&t.code==="23505",O=(t,a,r,n,i)=>I(N(t,s(`SELECT * FROM emt_append_event(
|
|
84
84
|
ARRAY[%s]::text[],
|
|
85
85
|
ARRAY[%s]::jsonb[],
|
|
86
86
|
ARRAY[%s]::jsonb[],
|
|
@@ -90,5 +90,5 @@ import{c as A,e as a,f as L}from"./chunk-ABNBEUC6.mjs";import{e as i,f as g}from
|
|
|
90
90
|
%L::text,
|
|
91
91
|
%s::bigint,
|
|
92
92
|
%L::text
|
|
93
|
-
)`,
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
93
|
+
)`,n.map(e=>s("%L",e.metadata.eventId)).join(","),n.map(e=>s("%L",v.stringify(e.data))).join(","),n.map(e=>s("%L",v.stringify(e.metadata??{}))).join(","),n.map(()=>"'1'").join(","),n.map(e=>s("%L",e.type)).join(","),a,r,i?.expectedStreamVersion??"NULL",i?.partition??A)));export{H as a,j as b};
|
|
94
|
+
//# sourceMappingURL=chunk-COTRMVOL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/appendToStream.ts"],"sourcesContent":["import {\n executeInTransaction,\n executeSQL,\n rawSql,\n single,\n sql,\n} from '@event-driven-io/dumbo';\nimport {\n JSONParser,\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n type AppendToStreamOptions,\n type Event,\n type ExpectedStreamVersion,\n type ReadEvent,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { defaultTag, eventsTable, streamsTable } from './typing';\n\nexport const appendEventsSQL = rawSql(\n `CREATE OR REPLACE FUNCTION emt_append_event(\n v_event_ids text[],\n v_events_data jsonb[],\n v_events_metadata jsonb[],\n v_event_schema_versions text[],\n v_event_types text[],\n v_stream_id text,\n v_stream_type text,\n v_expected_stream_position bigint DEFAULT NULL,\n v_partition text DEFAULT emt_sanitize_name('default_partition')\n ) RETURNS TABLE (\n success boolean,\n next_stream_position bigint,\n last_global_position bigint,\n transaction_id xid8\n ) LANGUAGE plpgsql\n AS $$\n DECLARE\n v_next_stream_position bigint;\n v_position bigint;\n v_updated_rows int;\n v_transaction_id xid8;\n v_last_global_position bigint;\n BEGIN\n IF v_expected_stream_position IS NULL THEN\n SELECT COALESCE(max(stream_position), 0) INTO v_expected_stream_position\n FROM ${streamsTable.name}\n WHERE stream_id = v_stream_id AND partition = v_partition;\n END IF;\n\n v_next_stream_position := v_expected_stream_position + array_upper(v_events_data, 1);\n v_transaction_id := pg_current_xact_id();\n\n WITH ev AS (\n SELECT row_number() OVER () + v_expected_stream_position AS stream_position, \n event_data, \n event_metadata, \n schema_version, \n event_id, \n event_type\n FROM (\n SELECT *\n FROM \n unnest(v_event_ids, v_events_data, v_events_metadata, v_event_schema_versions, v_event_types) \n AS event(event_id, event_data, event_metadata, schema_version, event_type)\n ) AS event\n ),\n all_events_insert AS (\n INSERT INTO ${eventsTable.name}\n (stream_id, stream_position, partition, event_data, event_metadata, event_schema_version, event_type, event_id, transaction_id)\n SELECT \n v_stream_id, ev.stream_position, v_partition, ev.event_data, ev.event_metadata, ev.schema_version, ev.event_type, ev.event_id, v_transaction_id\n FROM ev\n RETURNING global_position\n )\n SELECT \n max(global_position) INTO v_last_global_position \n FROM \n all_events_insert;\n\n\n IF v_expected_stream_position = 0 THEN\n INSERT INTO ${streamsTable.name}\n (stream_id, stream_position, partition, stream_type, stream_metadata, is_archived)\n VALUES\n (v_stream_id, v_next_stream_position, v_partition, v_stream_type, '{}', FALSE);\n ELSE\n UPDATE ${streamsTable.name} as s \n SET stream_position = v_next_stream_position\n WHERE stream_id = v_stream_id AND stream_position = v_expected_stream_position AND partition = v_partition AND is_archived = FALSE;\n\n get diagnostics v_updated_rows = row_count;\n\n IF v_updated_rows = 0 THEN\n RETURN QUERY SELECT FALSE, NULL::bigint, NULL::bigint, NULL::xid8;\n RETURN;\n END IF;\n END IF;\n\n RETURN QUERY SELECT TRUE, v_next_stream_position, v_last_global_position, v_transaction_id;\n END;\n $$;\n `,\n);\n\ntype AppendEventResult =\n | {\n success: true;\n nextStreamPosition: bigint;\n lastGlobalPosition: bigint;\n transactionId: string;\n }\n | { success: false };\n\nexport const appendToStream = (\n pool: pg.Pool,\n streamName: string,\n streamType: string,\n events: Event[],\n options?: AppendToStreamOptions & {\n partition?: string;\n preCommitHook?: (\n client: pg.PoolClient,\n events: ReadEvent[],\n ) => Promise<void>;\n },\n): Promise<AppendEventResult> =>\n executeInTransaction<AppendEventResult>(pool, async (client) => {\n if (events.length === 0)\n return { success: false, result: { success: false } };\n\n let appendResult: AppendEventSqlResult;\n\n try {\n const expectedStreamVersion = toExpectedVersion(\n options?.expectedStreamVersion,\n );\n\n const eventsToAppend: ReadEvent[] = events.map((e, i) => ({\n ...e,\n metadata: {\n streamName,\n eventId: uuid(),\n streamPosition: BigInt(i),\n ...e.metadata,\n },\n }));\n\n // TODO: return global positions from append raw and other generated data\n appendResult = await appendEventsRaw(\n client,\n streamName,\n streamType,\n eventsToAppend,\n {\n expectedStreamVersion,\n },\n );\n\n if (options?.preCommitHook)\n await options.preCommitHook(client, eventsToAppend);\n } catch (error) {\n if (!isOptimisticConcurrencyError(error)) throw error;\n\n appendResult = {\n success: false,\n last_global_position: null,\n next_stream_position: null,\n transaction_id: null,\n };\n }\n\n const {\n success,\n next_stream_position,\n last_global_position,\n transaction_id,\n } = appendResult;\n\n return {\n success,\n result:\n success &&\n next_stream_position &&\n last_global_position &&\n transaction_id\n ? {\n success: true,\n nextStreamPosition: BigInt(next_stream_position),\n lastGlobalPosition: BigInt(last_global_position),\n transactionId: transaction_id,\n }\n : { success: false },\n };\n });\n\nconst toExpectedVersion = (\n expected: ExpectedStreamVersion | undefined,\n): bigint | null => {\n if (expected === undefined) return null;\n\n if (expected === NO_CONCURRENCY_CHECK) return null;\n\n // TODO: this needs to be fixed\n if (expected == STREAM_DOES_NOT_EXIST) return null;\n\n // TODO: this needs to be fixed\n if (expected == STREAM_EXISTS) return null;\n\n return expected as bigint;\n};\n\nconst isOptimisticConcurrencyError = (error: unknown): boolean =>\n error instanceof Error && 'code' in error && error.code === '23505';\n\ntype AppendEventSqlResult = {\n success: boolean;\n next_stream_position: string | null;\n last_global_position: string | null;\n transaction_id: string | null | undefined;\n};\n\nconst appendEventsRaw = (\n client: pg.PoolClient,\n streamId: string,\n streamType: string,\n events: ReadEvent[],\n options?: {\n expectedStreamVersion: bigint | null;\n partition?: string;\n },\n): Promise<AppendEventSqlResult> =>\n single(\n executeSQL<AppendEventSqlResult>(\n client,\n sql(\n `SELECT * FROM emt_append_event(\n ARRAY[%s]::text[],\n ARRAY[%s]::jsonb[],\n ARRAY[%s]::jsonb[],\n ARRAY[%s]::text[],\n ARRAY[%s]::text[],\n %L::text,\n %L::text,\n %s::bigint,\n %L::text\n )`,\n events.map((e) => sql('%L', e.metadata.eventId)).join(','),\n events.map((e) => sql('%L', JSONParser.stringify(e.data))).join(','),\n events\n .map((e) => sql('%L', JSONParser.stringify(e.metadata ?? {})))\n .join(','),\n events.map(() => `'1'`).join(','),\n events.map((e) => sql('%L', e.type)).join(','),\n streamId,\n streamType,\n options?.expectedStreamVersion ?? 'NULL',\n options?.partition ?? defaultTag,\n ),\n ),\n );\n"],"mappings":"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","names":["executeInTransaction","executeSQL","rawSql","single","sql","uuid","appendEventsSQL","rawSql","streamsTable","eventsTable","appendToStream","pool","streamName","streamType","events","options","executeInTransaction","client","appendResult","expectedStreamVersion","toExpectedVersion","eventsToAppend","e","i","uuid","appendEventsRaw","error","isOptimisticConcurrencyError","success","next_stream_position","last_global_position","transaction_id","expected","n","a","s","streamId","single","executeSQL","sql","p","defaultTag"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{c as s,f as m}from"./chunk-ABNBEUC6.mjs";import{b as o}from"./chunk-E56AUXA3.mjs";import{executeSQL as l,mapRows as E,sql as y}from"@event-driven-io/dumbo";import"pg";var u=async(v,n,t)=>{let d=t&&"from"in t?`AND stream_position >= ${t.from}`:"",i=Number(t&&"to"in t?t.to:t&&"maxCount"in t&&t.maxCount?t.from+t.maxCount:NaN),p=isNaN(i)?"":`AND stream_position <= ${i}`,a=await E(l(v,y(`SELECT stream_id, stream_position, global_position, event_data, event_metadata, event_schema_version, event_type, event_id
|
|
2
|
+
FROM ${m.name}
|
|
3
|
+
WHERE stream_id = %L AND partition = %L AND is_archived = FALSE ${d} ${p}`,n,t?.partition??s)),e=>{let r=o(e.event_type,e.event_data,e.event_metadata);return{...r,metadata:{...r.metadata,eventId:e.event_id,streamName:n,streamPosition:BigInt(e.stream_position),globalPosition:BigInt(e.global_position)}}});return a.length>0?{currentStreamVersion:a[a.length-1].metadata.streamPosition,events:a}:null};export{u as a};
|
|
4
|
+
//# sourceMappingURL=chunk-D5T7G7UL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/readStream.ts"],"sourcesContent":["import { executeSQL, mapRows, sql } from '@event-driven-io/dumbo';\nimport {\n event,\n type DefaultStreamVersionType,\n type Event,\n type EventDataOf,\n type EventMetaDataOf,\n type EventTypeOf,\n type ReadEvent,\n type ReadEventMetadataWithGlobalPosition,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { defaultTag, eventsTable } from './typing';\n\ntype ReadStreamSqlResult<EventType extends Event> = {\n stream_position: string;\n event_data: EventDataOf<EventType>;\n event_metadata: EventMetaDataOf<EventType>;\n event_schema_version: string;\n event_type: EventTypeOf<EventType>;\n event_id: string;\n global_position: string;\n transaction_id: string;\n created: string;\n};\n\nexport const readStream = async <EventType extends Event>(\n pool: pg.Pool,\n streamId: string,\n options?: ReadStreamOptions & { partition?: string },\n): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n> => {\n const fromCondition: string =\n options && 'from' in options\n ? `AND stream_position >= ${options.from}`\n : '';\n\n const to = Number(\n options && 'to' in options\n ? options.to\n : options && 'maxCount' in options && options.maxCount\n ? options.from + options.maxCount\n : NaN,\n );\n\n const toCondition = !isNaN(to) ? `AND stream_position <= ${to}` : '';\n\n const events: ReadEvent<EventType, ReadEventMetadataWithGlobalPosition>[] =\n await mapRows(\n executeSQL<ReadStreamSqlResult<EventType>>(\n pool,\n sql(\n `SELECT stream_id, stream_position, global_position, event_data, event_metadata, event_schema_version, event_type, event_id\n FROM ${eventsTable.name}\n WHERE stream_id = %L AND partition = %L AND is_archived = FALSE ${fromCondition} ${toCondition}`,\n streamId,\n options?.partition ?? defaultTag,\n ),\n ),\n (row) => {\n const rawEvent = event<EventType>(\n row.event_type,\n row.event_data,\n row.event_metadata,\n ) as EventType;\n\n return {\n ...rawEvent,\n metadata: {\n ...rawEvent.metadata,\n eventId: row.event_id,\n streamName: streamId,\n streamPosition: BigInt(row.stream_position),\n globalPosition: BigInt(row.global_position),\n },\n };\n },\n );\n\n return events.length > 0\n ? {\n currentStreamVersion:\n events[events.length - 1]!.metadata.streamPosition,\n events,\n }\n : null;\n};\n"],"mappings":"yFAAA,OAAS,cAAAA,EAAY,WAAAC,EAAS,OAAAC,MAAW,yBAazC,MAAe,KAeR,IAAMC,EAAa,MACxBC,EACAC,EACAC,IAOG,CACH,IAAMC,EACJD,GAAW,SAAUA,EACjB,0BAA0BA,EAAQ,IAAI,GACtC,GAEAE,EAAK,OACTF,GAAW,OAAQA,EACfA,EAAQ,GACRA,GAAW,aAAcA,GAAWA,EAAQ,SAC1CA,EAAQ,KAAOA,EAAQ,SACvB,GACR,EAEMG,EAAe,MAAMD,CAAE,EAAqC,GAAjC,0BAA0BA,CAAE,GAEvDE,EACJ,MAAMC,EACJC,EACER,EACAS,EACE;AAAA,kBACQC,EAAY,IAAI;AAAA,6EAC2CP,CAAa,IAAIE,CAAW,GAC/FJ,EACAC,GAAS,WAAaS,CACxB,CACF,EACCC,GAAQ,CACP,IAAMC,EAAWC,EACfF,EAAI,WACJA,EAAI,WACJA,EAAI,cACN,EAEA,MAAO,CACL,GAAGC,EACH,SAAU,CACR,GAAGA,EAAS,SACZ,QAASD,EAAI,SACb,WAAYX,EACZ,eAAgB,OAAOW,EAAI,eAAe,EAC1C,eAAgB,OAAOA,EAAI,eAAe,CAC5C,CACF,CACF,CACF,EAEF,OAAON,EAAO,OAAS,EACnB,CACE,qBACEA,EAAOA,EAAO,OAAS,CAAC,EAAG,SAAS,eACtC,OAAAA,CACF,EACA,IACN","names":["executeSQL","mapRows","sql","readStream","pool","streamId","options","fromCondition","to","toCondition","events","mapRows","executeSQL","sql","eventsTable","defaultTag","row","rawEvent","n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var n=class extends Error{constructor(t){super(`Cannot parse! ${t}`)}},i={stringify:(t,e)=>JSON.stringify(e?.map?e.map(t):t,(r,a)=>typeof a=="bigint"?a.toString():a),parse:(t,e)=>{let r=JSON.parse(t,e?.reviver);if(e?.typeCheck&&!e?.typeCheck(r))throw new n(t);return e?.map?e.map(r):r}};var g=(t,e,r)=>({type:t,data:e,metadata:r});var l=(t=>(t.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",t.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",t.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",t))(l||{}),c=t=>typeof t=="number"&&t===t,m=t=>typeof t=="string";var s=class d extends Error{errorCode;constructor(e){let r=e&&typeof e=="object"&&"errorCode"in e?e.errorCode:c(e)?e:500,a=e&&typeof e=="object"&&"message"in e?e.message:m(e)?e:`Error with status code '${r}' ocurred during Emmett processing`;super(a),this.errorCode=r,Object.setPrototypeOf(this,d.prototype)}},o=class f extends s{constructor(e,r,a){super({errorCode:412,message:a??`Expected version ${r.toString()} does not match current ${e?.toString()}`}),this.current=e,this.expected=r,Object.setPrototypeOf(this,f.prototype)}};var y="STREAM_EXISTS",u="STREAM_DOES_NOT_EXIST",p="NO_CONCURRENCY_CHECK";var w=class h extends o{constructor(e,r){super(e?.toString(),r?.toString()),Object.setPrototypeOf(this,h.prototype)}};import Z from"async-retry";import{TransformStream as Q}from"web-streams-polyfill";import{v4 as xe}from"uuid";export{i as a,g as b,y as c,u as d,p as e,w as f};
|
|
2
|
+
//# sourceMappingURL=chunk-E56AUXA3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../emmett/src/serialization/json/JSONParser.ts","../../emmett/src/typing/event.ts","../../emmett/src/validation/index.ts","../../emmett/src/errors/index.ts","../../emmett/src/validation/dates.ts","../../emmett/src/eventStore/expectedVersion.ts","../../emmett/src/streaming/restream.ts","../../emmett/src/eventStore/inMemoryEventStore.ts"],"sourcesContent":["export class ParseError extends Error {\n constructor(text: string) {\n super(`Cannot parse! ${text}`);\n }\n}\n\nexport type Mapper<From, To = From> =\n | ((value: unknown) => To)\n | ((value: Partial<From>) => To)\n | ((value: From) => To)\n | ((value: Partial<To>) => To)\n | ((value: To) => To)\n | ((value: Partial<To | From>) => To)\n | ((value: To | From) => To);\n\nexport type MapperArgs<From, To = From> = Partial<From> &\n From &\n Partial<To> &\n To;\n\nexport type ParseOptions<From, To = From> = {\n reviver?: (key: string, value: unknown) => unknown;\n map?: Mapper<From, To>;\n typeCheck?: <To>(value: unknown) => value is To;\n};\n\nexport type StringifyOptions<From, To = From> = {\n map?: Mapper<From, To>;\n};\n\nexport const JSONParser = {\n stringify: <From, To = From>(\n value: From,\n options?: StringifyOptions<From, To>,\n ) => {\n return JSON.stringify(\n options?.map ? options.map(value as MapperArgs<From, To>) : value,\n //TODO: Consider adding support to DateTime and adding specific format to mark that's a bigint\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (_, v) => (typeof v === 'bigint' ? v.toString() : v),\n );\n },\n parse: <From, To = From>(\n text: string,\n options?: ParseOptions<From, To>,\n ): To | undefined => {\n const parsed: unknown = JSON.parse(text, options?.reviver);\n\n if (options?.typeCheck && !options?.typeCheck<To>(parsed))\n throw new ParseError(text);\n\n return options?.map\n ? options.map(parsed as MapperArgs<From, To>)\n : (parsed as To | undefined);\n },\n};\n","import type { DefaultRecord, Flavour } from './';\n\nexport type Event<\n EventType extends string = string,\n EventData extends DefaultRecord = DefaultRecord,\n EventMetaData extends DefaultRecord = DefaultRecord,\n> = Flavour<\n Readonly<{\n type: EventType;\n data: EventData;\n metadata?: EventMetaData;\n }>,\n 'Event'\n>;\n\nexport type EventTypeOf<T extends Event> = T['type'];\nexport type EventDataOf<T extends Event> = T['data'];\nexport type EventMetaDataOf<T extends Event> = T['metadata'];\n\nexport type CreateEventType<\n EventType extends string,\n EventData extends DefaultRecord,\n EventMetaData extends DefaultRecord | undefined,\n> = Readonly<{\n type: EventType;\n data: EventData;\n metadata?: EventMetaData;\n}>;\n\nexport const event = <EventType extends Event>(\n type: EventTypeOf<EventType>,\n data: EventDataOf<EventType>,\n metadata?: EventMetaDataOf<EventType>,\n): CreateEventType<\n EventTypeOf<EventType>,\n EventDataOf<EventType>,\n EventMetaDataOf<EventType>\n> => {\n return {\n type,\n data,\n metadata,\n };\n};\n\nexport type ReadEvent<\n EventType extends Event = Event,\n EventMetaDataType extends EventMetaDataOf<EventType> &\n ReadEventMetadata = EventMetaDataOf<EventType> & ReadEventMetadata,\n> = CreateEventType<\n EventTypeOf<EventType>,\n EventDataOf<EventType>,\n EventMetaDataType\n> &\n EventType & { metadata: EventMetaDataType };\n\nexport type ReadEventMetadata = Readonly<{\n eventId: string;\n streamPosition: bigint;\n streamName: string;\n}>;\n\nexport type ReadEventMetadataWithGlobalPosition = ReadEventMetadata & {\n globalPosition: bigint;\n};\n","import { ValidationError } from '../errors';\n\nexport const enum ValidationErrors {\n NOT_A_NONEMPTY_STRING = 'NOT_A_NONEMPTY_STRING',\n NOT_A_POSITIVE_NUMBER = 'NOT_A_POSITIVE_NUMBER',\n NOT_AN_UNSIGNED_BIGINT = 'NOT_AN_UNSIGNED_BIGINT',\n}\n\nexport const isNumber = (val: unknown): val is number =>\n typeof val === 'number' && val === val;\n\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\n\nexport const assertNotEmptyString = (value: unknown): string => {\n if (!isString(value) || value.length === 0) {\n throw new ValidationError(ValidationErrors.NOT_A_NONEMPTY_STRING);\n }\n return value;\n};\n\nexport const assertPositiveNumber = (value: unknown): number => {\n if (!isNumber(value) || value <= 0) {\n throw new ValidationError(ValidationErrors.NOT_A_POSITIVE_NUMBER);\n }\n return value;\n};\n\nexport const assertUnsignedBigInt = (value: string): bigint => {\n const number = BigInt(value);\n if (number < 0) {\n throw new ValidationError(ValidationErrors.NOT_AN_UNSIGNED_BIGINT);\n }\n return number;\n};\n\nexport * from './dates';\n","import { isNumber, isString } from '../validation';\n\nexport type ErrorConstructor<ErrorType extends Error> = new (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: any[]\n) => ErrorType;\n\nexport const isErrorConstructor = <ErrorType extends Error>(\n // eslint-disable-next-line @typescript-eslint/ban-types\n expect: Function,\n): expect is ErrorConstructor<ErrorType> => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (\n typeof expect === 'function' &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype.constructor === expect\n );\n};\n\nexport class EmmettError extends Error {\n public errorCode: number;\n\n constructor(\n options?: { errorCode: number; message?: string } | string | number,\n ) {\n const errorCode =\n options && typeof options === 'object' && 'errorCode' in options\n ? options.errorCode\n : isNumber(options)\n ? options\n : 500;\n const message =\n options && typeof options === 'object' && 'message' in options\n ? options.message\n : isString(options)\n ? options\n : `Error with status code '${errorCode}' ocurred during Emmett processing`;\n\n super(message);\n this.errorCode = errorCode;\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, EmmettError.prototype);\n }\n}\n\nexport class ConcurrencyError extends EmmettError {\n constructor(\n public current: string | undefined,\n public expected: string,\n message?: string,\n ) {\n super({\n errorCode: 412,\n message:\n message ??\n `Expected version ${expected.toString()} does not match current ${current?.toString()}`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ConcurrencyError.prototype);\n }\n}\n\nexport class ValidationError extends EmmettError {\n constructor(message?: string) {\n super({\n errorCode: 400,\n message: message ?? `Validation Error ocurred during Emmett processing`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class IllegalStateError extends EmmettError {\n constructor(message?: string) {\n super({\n errorCode: 403,\n message: message ?? `Illegal State ocurred during Emmett processing`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, IllegalStateError.prototype);\n }\n}\n\nexport class NotFoundError extends EmmettError {\n constructor(options?: { id: string; type: string; message?: string }) {\n super({\n errorCode: 404,\n message:\n options?.message ??\n (options?.id\n ? options.type\n ? `${options.type} with ${options.id} was not found during Emmett processing`\n : `State with ${options.id} was not found during Emmett processing`\n : options?.type\n ? `${options.type} was not found during Emmett processing`\n : 'State was not found during Emmett processing'),\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n}\n","import { ValidationError } from '../errors';\n\nexport const formatDateToUtcYYYYMMDD = (date: Date) => {\n // Use the 'en-CA' locale which formats as 'yyyy-mm-dd'\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone: 'UTC',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n\n // Format the date\n return formatter.format(date);\n};\n\n// Function to validate 'yyyy-mm-dd' format\nexport const isValidYYYYMMDD = (dateString: string) => {\n const regex = /^\\d{4}-\\d{2}-\\d{2}$/;\n return regex.test(dateString);\n};\n\nexport const parseDateFromUtcYYYYMMDD = (dateString: string) => {\n const date = new Date(dateString + 'T00:00:00Z');\n\n if (!isValidYYYYMMDD(dateString)) {\n throw new ValidationError('Invalid date format, must be yyyy-mm-dd');\n }\n\n if (isNaN(date.getTime())) {\n throw new ValidationError('Invalid date format');\n }\n\n return date;\n};\n","import { ConcurrencyError } from '../errors';\nimport type { Flavour } from '../typing';\nimport type { DefaultStreamVersionType } from './eventStore';\n\nexport type ExpectedStreamVersion<VersionType = DefaultStreamVersionType> =\n | ExpectedStreamVersionWithValue<VersionType>\n | ExpectedStreamVersionGeneral;\n\nexport type ExpectedStreamVersionWithValue<\n VersionType = DefaultStreamVersionType,\n> = Flavour<VersionType, 'StreamVersion'>;\n\nexport type ExpectedStreamVersionGeneral = Flavour<\n 'STREAM_EXISTS' | 'STREAM_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK',\n 'StreamVersion'\n>;\n\nexport const STREAM_EXISTS = 'STREAM_EXISTS' as ExpectedStreamVersionGeneral;\nexport const STREAM_DOES_NOT_EXIST =\n 'STREAM_DOES_NOT_EXIST' as ExpectedStreamVersionGeneral;\nexport const NO_CONCURRENCY_CHECK =\n 'NO_CONCURRENCY_CHECK' as ExpectedStreamVersionGeneral;\n\nexport const matchesExpectedVersion = <\n StreamVersion = DefaultStreamVersionType,\n>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion>,\n): boolean => {\n if (expected === NO_CONCURRENCY_CHECK) return true;\n\n if (expected == STREAM_DOES_NOT_EXIST) return current === undefined;\n\n if (expected == STREAM_EXISTS) return current !== undefined;\n\n return current === expected;\n};\n\nexport const assertExpectedVersionMatchesCurrent = <\n StreamVersion = DefaultStreamVersionType,\n>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion> | undefined,\n): void => {\n expected ??= NO_CONCURRENCY_CHECK;\n\n if (!matchesExpectedVersion(current, expected))\n throw new ExpectedVersionConflictError(current, expected);\n};\n\nexport class ExpectedVersionConflictError<\n VersionType = DefaultStreamVersionType,\n> extends ConcurrencyError {\n constructor(\n current: VersionType | undefined,\n expected: ExpectedStreamVersion<VersionType>,\n ) {\n super(current?.toString(), expected?.toString());\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ExpectedVersionConflictError.prototype);\n }\n}\n","import retry from 'async-retry';\nimport {\n ReadableStream,\n ReadableStreamDefaultReader,\n TransformStream,\n TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport type { Decoder } from './decoders';\nimport { DefaultDecoder } from './decoders/composite';\n\nexport const restream = <\n Source = unknown,\n Transformed = Source,\n StreamType = object,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n retryOptions: retry.Options = { forever: true, minTimeout: 25 },\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n): ReadableStream<Transformed> =>\n new TransformStream<Source, Transformed>({\n start(controller) {\n retry(\n () => onRestream(createSourceStream, controller, transform, decoder),\n retryOptions,\n ).catch((error) => {\n controller.error(error);\n });\n },\n }).readable;\n\nconst onRestream = async <StreamType, Source, Transformed = Source>(\n createSourceStream: () => ReadableStream<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<void> => {\n const sourceStream = createSourceStream();\n const reader = sourceStream.getReader();\n try {\n let done: boolean;\n\n do {\n done = await restreamChunk(reader, controller, transform, decoder);\n } while (!done);\n } finally {\n reader.releaseLock();\n }\n};\n\nconst restreamChunk = async <StreamType, Source, Transformed = Source>(\n reader: ReadableStreamDefaultReader<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<boolean> => {\n const { done: isDone, value } = await reader.read();\n\n if (value) decoder.addToBuffer(value);\n\n if (!isDone && !decoder.hasCompleteMessage()) return false;\n\n decodeAndTransform(decoder, transform, controller);\n\n if (isDone) {\n controller.terminate();\n }\n\n return isDone;\n};\n\nconst decodeAndTransform = <StreamType, Source, Transformed = Source>(\n decoder: Decoder<StreamType, Source>,\n transform: (input: Source) => Transformed,\n controller: TransformStreamDefaultController<Transformed>,\n) => {\n try {\n const decoded = decoder.decode();\n if (!decoded) return;\n\n const transformed = transform(decoded);\n controller.enqueue(transformed);\n } catch (error) {\n controller.error(new Error(`Decoding error: ${error?.toString()}`));\n }\n};\n","import { v4 as randomUUID } from 'uuid';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: ReadEvent<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore<\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n> => {\n const streams = new Map<string, ReadEvent[]>();\n\n const getAllEventsCount = () => {\n return Array.from<ReadEvent[]>(streams.values())\n .map((s) => s.length)\n .reduce((p, c) => p + c, 0);\n };\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<AggregateStreamResult<State> | null> {\n const { evolve, initialState, read } = options;\n\n const result = await this.readStream<EventType>(streamName, read);\n\n if (!result) return null;\n\n const events = result?.events ?? [];\n\n return {\n currentStreamVersion: BigInt(events.length),\n state: events.reduce(evolve, initialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n > => {\n const events = streams.get(streamName);\n const currentStreamVersion = events ? BigInt(events.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const from = Number(options && 'from' in options ? options.from : 0);\n const to = Number(\n options && 'to' in options\n ? options.to\n : options && 'maxCount' in options && options.maxCount\n ? options.from + options.maxCount\n : events?.length ?? 1,\n );\n\n const resultEvents =\n events && events.length > 0\n ? events\n .map(\n (e) =>\n e as ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n )\n .slice(from, to)\n : [];\n\n const result: ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n > =\n events && events.length > 0\n ? {\n currentStreamVersion: currentStreamVersion!,\n events: resultEvents,\n }\n : null;\n\n return Promise.resolve(result);\n },\n\n appendToStream: <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n const currentEvents = streams.get(streamName) ?? [];\n const currentStreamVersion =\n currentEvents.length > 0 ? BigInt(currentEvents.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const eventEnvelopes: ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >[] = events.map((event, index) => {\n return {\n ...event,\n metadata: {\n ...(event.metadata ?? {}),\n streamName,\n eventId: randomUUID(),\n streamPosition: BigInt(currentEvents.length + index + 1),\n globalPosition: BigInt(getAllEventsCount() + index + 1),\n },\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n eventEnvelopes.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...eventEnvelopes]);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n };\n\n return Promise.resolve(result);\n },\n };\n};\n"],"mappings":"AAAO,IAAMA,EAAN,cAAyB,KAAM,CACpC,YAAYC,EAAc,CACxB,MAAM,iBAAiBA,CAAI,EAAE,CAC/B,CACF,EA0BaC,EAAa,CACxB,UAAW,CACTC,EACAC,IAEO,KAAK,UACVA,GAAS,IAAMA,EAAQ,IAAID,CAA6B,EAAIA,EAG5D,CAACE,EAAGC,IAAO,OAAOA,GAAM,SAAWA,EAAE,SAAS,EAAIA,CACpD,EAEF,MAAO,CACLL,EACAG,IACmB,CACnB,IAAMG,EAAkB,KAAK,MAAMN,EAAMG,GAAS,OAAO,EAEzD,GAAIA,GAAS,WAAa,CAACA,GAAS,UAAcG,CAAM,EACtD,MAAM,IAAIP,EAAWC,CAAI,EAE3B,OAAOG,GAAS,IACZA,EAAQ,IAAIG,CAA8B,EACzCA,CACP,CACF,EC1BO,IAAMC,EAAQ,CACnBC,EACAC,EACAC,KAMO,CACL,KAAAF,EACA,KAAAC,EACA,SAAAC,CACF,GCxCK,IAAWC,GAAAA,IAChBA,EAAA,sBAAwB,wBACxBA,EAAA,sBAAwB,wBACxBA,EAAA,uBAAyB,yBAHTA,IAAAA,GAAA,CAAA,CAAA,EAMLC,EAAYC,GACvB,OAAOA,GAAQ,UAAYA,IAAQA,EAExBC,EAAYD,GACvB,OAAOA,GAAQ,SCLV,IAcME,EAAN,MAAMC,UAAoB,KAAM,CAC9B,UAEP,YACEC,EACA,CACA,IAAMC,EACJD,GAAW,OAAOA,GAAY,UAAY,cAAeA,EACrDA,EAAQ,UACRE,EAASF,CAAO,EACdA,EACA,IACFG,EACJH,GAAW,OAAOA,GAAY,UAAY,YAAaA,EACnDA,EAAQ,QACRI,EAASJ,CAAO,EACdA,EACA,2BAA2BC,CAAS,qCAE5C,MAAME,CAAO,EACb,KAAK,UAAYF,EAGjB,OAAO,eAAe,KAAMF,EAAY,SAAS,CACnD,CACF,EAEaM,EAAN,MAAMC,UAAyBR,CAAY,CAChD,YACSS,EACAC,EACPL,EACA,CACA,MAAM,CACJ,UAAW,IACX,QACEA,GACA,oBAAoBK,EAAS,SAAS,CAAC,2BAA2BD,GAAS,SAAS,CAAC,EACzF,CAAC,EATM,KAAA,QAAAA,EACA,KAAA,SAAAC,EAWP,OAAO,eAAe,KAAMF,EAAiB,SAAS,CACxD,CACF,EE/CO,IAAMG,EAAgB,gBAChBC,EACX,wBACWC,EACX,uBAJK,IAiCMC,EAAN,MAAMC,UAEHC,CAAiB,CACzB,YACEC,EACAC,EACA,CACA,MAAMD,GAAS,SAAS,EAAGC,GAAU,SAAS,CAAC,EAG/C,OAAO,eAAe,KAAMH,EAA6B,SAAS,CACpE,CACF,EC9DA,OAAOI,MAAW,cAClB,OAGE,mBAAAC,MAEK,uBCNP,OAAS,MAAMC,OAAkB","names":["ParseError","text","JSONParser","value","options","_","v","parsed","event","type","data","metadata","ValidationErrors","isNumber","val","isString","EmmettError","_EmmettError","options","errorCode","isNumber","message","isString","ConcurrencyError","_ConcurrencyError","current","expected","STREAM_EXISTS","STREAM_DOES_NOT_EXIST","NO_CONCURRENCY_CHECK","ExpectedVersionConflictError","_ExpectedVersionConflictError","ConcurrencyError","current","expected","retry","TransformStream","randomUUID"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkSS2LQM3Bjs = require('./chunk-SS2LQM3B.js');var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkSS2LQM3Bjs = require('./chunk-SS2LQM3B.js');var _dumbo = require('@event-driven-io/dumbo');var m=_dumbo.rawSql.call(void 0, `CREATE TABLE IF NOT EXISTS ${_chunkSS2LQM3Bjs.e.name}(
|
|
2
2
|
stream_id TEXT NOT NULL,
|
|
3
3
|
stream_position BIGINT NOT NULL,
|
|
4
4
|
partition TEXT NOT NULL DEFAULT '${_chunkSS2LQM3Bjs.b}__${_chunkSS2LQM3Bjs.b}',
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
is_archived BOOLEAN NOT NULL DEFAULT FALSE,
|
|
8
8
|
PRIMARY KEY (stream_id, stream_position, partition, is_archived),
|
|
9
9
|
UNIQUE (stream_id, partition, is_archived)
|
|
10
|
-
) PARTITION BY LIST (partition);`),i= exports.b =
|
|
10
|
+
) PARTITION BY LIST (partition);`),i= exports.b =_dumbo.rawSql.call(void 0, `
|
|
11
11
|
CREATE SEQUENCE IF NOT EXISTS emt_global_event_position;
|
|
12
12
|
|
|
13
13
|
CREATE TABLE IF NOT EXISTS ${_chunkSS2LQM3Bjs.f.name}(
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
transaction_id XID8 NOT NULL,
|
|
25
25
|
created TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
26
26
|
PRIMARY KEY (stream_id, stream_position, partition, is_archived)
|
|
27
|
-
) PARTITION BY LIST (partition);`),I= exports.c =
|
|
27
|
+
) PARTITION BY LIST (partition);`),I= exports.c =_dumbo.rawSql.call(void 0, `
|
|
28
28
|
CREATE TABLE IF NOT EXISTS emt_subscriptions(
|
|
29
29
|
subscription_id TEXT NOT NULL PRIMARY KEY,
|
|
30
30
|
version INT NOT NULL DEFAULT 1,
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
last_processed_position BIGINT NOT NULL,
|
|
34
34
|
last_processed_transaction_id BIGINT NOT NULL
|
|
35
35
|
);
|
|
36
|
-
`),o= exports.d =
|
|
36
|
+
`),o= exports.d =_dumbo.rawSql.call(void 0, `CREATE OR REPLACE FUNCTION emt_sanitize_name(input_name TEXT) RETURNS TEXT AS $$
|
|
37
37
|
BEGIN
|
|
38
38
|
RETURN REGEXP_REPLACE(input_name, '[^a-zA-Z0-9_]', '_', 'g');
|
|
39
39
|
END;
|
|
40
|
-
$$ LANGUAGE plpgsql;`),r= exports.e =
|
|
40
|
+
$$ LANGUAGE plpgsql;`),r= exports.e =_dumbo.rawSql.call(void 0, `
|
|
41
41
|
CREATE OR REPLACE FUNCTION emt_add_table_partition(tableName TEXT, partition_name TEXT) RETURNS void AS $$
|
|
42
42
|
DECLARE
|
|
43
43
|
v_main_partiton_name TEXT;
|
|
@@ -74,13 +74,13 @@
|
|
|
74
74
|
v_archived_partiton_name, v_main_partiton_name
|
|
75
75
|
);
|
|
76
76
|
END;
|
|
77
|
-
$$ LANGUAGE plpgsql;`),N= exports.f =
|
|
77
|
+
$$ LANGUAGE plpgsql;`),N= exports.f =_dumbo.rawSql.call(void 0, `
|
|
78
78
|
CREATE OR REPLACE FUNCTION emt_add_partition(partition_name TEXT) RETURNS void AS $$
|
|
79
79
|
BEGIN
|
|
80
80
|
PERFORM emt_add_table_partition('${_chunkSS2LQM3Bjs.f.name}', partition_name);
|
|
81
81
|
PERFORM emt_add_table_partition('${_chunkSS2LQM3Bjs.e.name}', partition_name);
|
|
82
82
|
END;
|
|
83
|
-
$$ LANGUAGE plpgsql;`),A= exports.g =
|
|
83
|
+
$$ LANGUAGE plpgsql;`),A= exports.g =_dumbo.rawSql.call(void 0, `
|
|
84
84
|
CREATE OR REPLACE FUNCTION add_module(new_module TEXT) RETURNS void AS $$
|
|
85
85
|
BEGIN
|
|
86
86
|
-- For ${_chunkSS2LQM3Bjs.f.name} table
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
);
|
|
123
123
|
END;
|
|
124
124
|
$$ LANGUAGE plpgsql;
|
|
125
|
-
`),O= exports.h =
|
|
125
|
+
`),O= exports.h =_dumbo.rawSql.call(void 0, `
|
|
126
126
|
CREATE OR REPLACE FUNCTION add_tenant(new_module TEXT, new_tenant TEXT) RETURNS void AS $$
|
|
127
127
|
BEGIN
|
|
128
128
|
-- For ${_chunkSS2LQM3Bjs.f.name} table
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
);
|
|
165
165
|
END;
|
|
166
166
|
$$ LANGUAGE plpgsql;
|
|
167
|
-
`),d= exports.i =
|
|
167
|
+
`),d= exports.i =_dumbo.rawSql.call(void 0, `
|
|
168
168
|
CREATE OR REPLACE FUNCTION add_module_for_all_tenants(new_module TEXT) RETURNS void AS $$
|
|
169
169
|
DECLARE
|
|
170
170
|
tenant_record RECORD;
|
|
@@ -213,7 +213,7 @@
|
|
|
213
213
|
END LOOP;
|
|
214
214
|
END;
|
|
215
215
|
$$ LANGUAGE plpgsql;
|
|
216
|
-
`),L= exports.j =
|
|
216
|
+
`),L= exports.j =_dumbo.rawSql.call(void 0, `
|
|
217
217
|
CREATE OR REPLACE FUNCTION add_tenant_for_all_modules(new_tenant TEXT) RETURNS void AS $$
|
|
218
218
|
DECLARE
|
|
219
219
|
module_record RECORD;
|
|
@@ -260,5 +260,5 @@
|
|
|
260
260
|
END LOOP;
|
|
261
261
|
END;
|
|
262
262
|
$$ LANGUAGE plpgsql;
|
|
263
|
-
`),R= exports.k =
|
|
264
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
`),R= exports.k =_dumbo.rawSql.call(void 0, `SELECT emt_add_partition('${_chunkSS2LQM3Bjs.c}');`);exports.a = m; exports.b = i; exports.c = I; exports.d = o; exports.e = r; exports.f = N; exports.g = A; exports.h = O; exports.i = d; exports.j = L; exports.k = R;
|
|
264
|
+
//# sourceMappingURL=chunk-EEYVFO3G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/tables.ts"],"names":["rawSql","streamsTableSQL","streamsTable","globalTag","eventsTableSQL","eventsTable","subscriptionsTableSQL","sanitizeNameSQL","addTablePartitions","addEventsPartitions","addModuleSQL","addTenantSQL","addModuleForAllTenantsSQL","addTenantForAllModulesSQL","addDefaultPartition","defaultTag"],"mappings":"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","sourcesContent":["import { rawSql } from '@event-driven-io/dumbo';\nimport { defaultTag, eventsTable, globalTag, streamsTable } from './typing';\n\nexport const streamsTableSQL = rawSql(\n `CREATE TABLE IF NOT EXISTS ${streamsTable.name}(\n stream_id TEXT NOT NULL,\n stream_position BIGINT NOT NULL,\n partition TEXT NOT NULL DEFAULT '${globalTag}__${globalTag}',\n stream_type TEXT NOT NULL,\n stream_metadata JSONB NOT NULL,\n is_archived BOOLEAN NOT NULL DEFAULT FALSE,\n PRIMARY KEY (stream_id, stream_position, partition, is_archived),\n UNIQUE (stream_id, partition, is_archived)\n ) PARTITION BY LIST (partition);`,\n);\n\nexport const eventsTableSQL = rawSql(\n `\n CREATE SEQUENCE IF NOT EXISTS emt_global_event_position;\n\n CREATE TABLE IF NOT EXISTS ${eventsTable.name}(\n stream_id TEXT NOT NULL,\n stream_position BIGINT NOT NULL,\n partition TEXT NOT NULL DEFAULT '${globalTag}',\n event_data JSONB NOT NULL,\n event_metadata JSONB NOT NULL,\n event_schema_version TEXT NOT NULL,\n event_type TEXT NOT NULL,\n event_id TEXT NOT NULL,\n is_archived BOOLEAN NOT NULL DEFAULT FALSE,\n global_position BIGINT DEFAULT nextval('emt_global_event_position'),\n transaction_id XID8 NOT NULL,\n created TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (stream_id, stream_position, partition, is_archived)\n ) PARTITION BY LIST (partition);`,\n);\n\nexport const subscriptionsTableSQL = rawSql(\n `\n CREATE TABLE IF NOT EXISTS emt_subscriptions(\n subscription_id TEXT NOT NULL PRIMARY KEY,\n version INT NOT NULL DEFAULT 1,\n module TEXT NULL,\n tenant TEXT NULL,\n last_processed_position BIGINT NOT NULL,\n last_processed_transaction_id BIGINT NOT NULL\n );\n`,\n);\n\nexport const sanitizeNameSQL = rawSql(\n `CREATE OR REPLACE FUNCTION emt_sanitize_name(input_name TEXT) RETURNS TEXT AS $$\n BEGIN\n RETURN REGEXP_REPLACE(input_name, '[^a-zA-Z0-9_]', '_', 'g');\n END;\n $$ LANGUAGE plpgsql;`,\n);\n\nexport const addTablePartitions = rawSql(\n `\n CREATE OR REPLACE FUNCTION emt_add_table_partition(tableName TEXT, partition_name TEXT) RETURNS void AS $$\n DECLARE\n v_main_partiton_name TEXT;\n v_active_partiton_name TEXT;\n v_archived_partiton_name TEXT;\n BEGIN \n v_main_partiton_name := emt_sanitize_name(tableName || '_' || partition_name);\n v_active_partiton_name := emt_sanitize_name(v_main_partiton_name || '_active');\n v_archived_partiton_name := emt_sanitize_name(v_main_partiton_name || '_archived');\n\n -- create default events partition\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (%L) PARTITION BY LIST (is_archived);',\n v_main_partiton_name, tableName, partition_name\n );\n\n -- create default streams partition\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (%L) PARTITION BY LIST (is_archived);',\n v_main_partiton_name, tableName, partition_name\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (FALSE);',\n v_active_partiton_name, v_main_partiton_name\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (TRUE);',\n v_archived_partiton_name, v_main_partiton_name\n );\n END;\n $$ LANGUAGE plpgsql;`,\n);\n\nexport const addEventsPartitions = rawSql(\n `\n CREATE OR REPLACE FUNCTION emt_add_partition(partition_name TEXT) RETURNS void AS $$\n BEGIN \n PERFORM emt_add_table_partition('${eventsTable.name}', partition_name);\n PERFORM emt_add_table_partition('${streamsTable.name}', partition_name);\n END;\n $$ LANGUAGE plpgsql;`,\n);\n\nexport const addModuleSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_module(new_module TEXT) RETURNS void AS $$\n BEGIN\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(%L || ''__'' || %L)) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}'), '${eventsTable.name}', new_module, '${globalTag}'\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}' || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}' || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(%L || ''__'' || %L)) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}'), '${streamsTable.name}', new_module, '${globalTag}'\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}' || '_active'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}' || '_archived'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addTenantSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_tenant(new_module TEXT, new_tenant TEXT) RETURNS void AS $$\n BEGIN\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant), '${eventsTable.name}', new_module, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant)\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant), '${streamsTable.name}', new_module, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant || '_active'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant || '_archived'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant)\n );\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addModuleForAllTenantsSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_module_for_all_tenants(new_module TEXT) RETURNS void AS $$\n DECLARE\n tenant_record RECORD;\n BEGIN\n PERFORM add_module(new_module);\n \n FOR tenant_record IN SELECT DISTINCT tenant FROM ${eventsTable.name}\n LOOP\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant), '${eventsTable.name}', new_module, tenant_record.tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant), '${streamsTable.name}', new_module, tenant_record.tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant || '_active'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant || '_archived'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n END LOOP;\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addTenantForAllModulesSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_tenant_for_all_modules(new_tenant TEXT) RETURNS void AS $$\n DECLARE\n module_record RECORD;\n BEGIN\n FOR module_record IN SELECT DISTINCT partitionname FROM pg_partman.part_config WHERE parent_table = '${eventsTable.name}'\n LOOP\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant), '${eventsTable.name}', module_record.partitionname, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant), '${streamsTable.name}', module_record.partitionname, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_active'), emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_archived'), emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n END LOOP;\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addDefaultPartition = rawSql(\n `SELECT emt_add_partition('${defaultTag}');`,\n);\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkEEYVFO3Gjs = require('./chunk-EEYVFO3G.js');var _chunkKADY7IHMjs = require('./chunk-KADY7IHM.js');var _dumbo = require('@event-driven-io/dumbo');require('pg');var Q=[_chunkEEYVFO3Gjs.a,_chunkEEYVFO3Gjs.b,_chunkEEYVFO3Gjs.c,_chunkEEYVFO3Gjs.d,_chunkEEYVFO3Gjs.e,_chunkEEYVFO3Gjs.f,_chunkEEYVFO3Gjs.g,_chunkEEYVFO3Gjs.h,_chunkEEYVFO3Gjs.i,_chunkEEYVFO3Gjs.j,_chunkKADY7IHMjs.a,_chunkEEYVFO3Gjs.k],b= exports.b =l=>_dumbo.executeSQLBatchInTransaction.call(void 0, l,...Q);exports.a = Q; exports.b = b;
|
|
2
|
+
//# sourceMappingURL=chunk-EMFXYVCK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/index.ts"],"names":["executeSQLBatchInTransaction","schemaSQL","streamsTableSQL","eventsTableSQL","subscriptionsTableSQL","sanitizeNameSQL","addTablePartitions","addEventsPartitions","addModuleSQL","addTenantSQL","addModuleForAllTenantsSQL","addTenantForAllModulesSQL","appendEventsSQL","addDefaultPartition","createEventStoreSchema","pool"],"mappings":"sJAAA,OAAS,gCAAAA,MAA8C,yBACvD,MAAe,KAqBR,IAAMC,EAAmB,CAC9BC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CACF,EAEaC,EAA0BC,GACrCf,EAA6Be,EAAM,GAAGd,CAAS","sourcesContent":["import { executeSQLBatchInTransaction, type SQL } from '@event-driven-io/dumbo';\nimport pg from 'pg';\nimport { appendEventsSQL } from './appendToStream';\nimport {\n addDefaultPartition,\n addEventsPartitions,\n addModuleForAllTenantsSQL,\n addModuleSQL,\n addTablePartitions,\n addTenantForAllModulesSQL,\n addTenantSQL,\n eventsTableSQL,\n sanitizeNameSQL,\n streamsTableSQL,\n subscriptionsTableSQL,\n} from './tables';\n\nexport * from './appendToStream';\nexport * from './readStream';\nexport * from './tables';\nexport * from './typing';\n\nexport const schemaSQL: SQL[] = [\n streamsTableSQL,\n eventsTableSQL,\n subscriptionsTableSQL,\n sanitizeNameSQL,\n addTablePartitions,\n addEventsPartitions,\n addModuleSQL,\n addTenantSQL,\n addModuleForAllTenantsSQL,\n addTenantForAllModulesSQL,\n appendEventsSQL,\n addDefaultPartition,\n];\n\nexport const createEventStoreSchema = (pool: pg.Pool) =>\n executeSQLBatchInTransaction(pool, ...schemaSQL);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/projections/index.ts"],"sourcesContent":["import {\n type Event,\n type EventTypeOf,\n type ReadEvent,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport type { PostgresEventStoreOptions } from '../postgreSQLEventStore';\n\nexport type PostgresProjectionHandler<EventType extends Event = Event> = (\n connectionString: string,\n client: pg.PoolClient,\n events: ReadEvent<EventType>[],\n) => Promise<void> | void;\n\nexport type ProjectionDefintion<EventType extends Event = Event> = {\n type: 'inline';\n name?: string;\n canHandle: EventTypeOf<EventType>[];\n handle: PostgresProjectionHandler<EventType>;\n};\n\nexport const defaultProjectionOptions: PostgresEventStoreOptions = {\n projections: [],\n};\n\nexport const handleProjections = async <EventType extends Event = Event>(\n allProjections: ProjectionDefintion<EventType>[],\n connectionString: string,\n client: pg.PoolClient,\n events: ReadEvent<EventType>[],\n): Promise<void> => {\n const eventTypes = events.map((e) => e.type);\n\n const projections = allProjections.filter((p) =>\n p.canHandle.some((type) => eventTypes.includes(type)),\n );\n\n for (const projection of projections) {\n await projection.handle(connectionString, client, events);\n }\n};\n"],"mappings":"AAKA,MAAe,KAgBR,IAAMA,EAAsD,CACjE,YAAa,CAAC,CAChB,EAEaC,EAAoB,MAC/BC,EACAC,EACAC,EACAC,IACkB,CAClB,IAAMC,EAAaD,EAAO,IAAK,GAAM,EAAE,IAAI,EAErCE,EAAcL,EAAe,OAAQM,GACzCA,EAAE,UAAU,KAAMC,GAASH,EAAW,SAASG,CAAI,CAAC,CACtD,EAEA,QAAWC,KAAcH,EACvB,MAAMG,EAAW,OAAOP,EAAkBC,EAAQC,CAAM,CAE5D","names":["defaultProjectionOptions","handleProjections","allProjections","connectionString","client","events","eventTypes","projections","p","type","projection"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkSS2LQM3Bjs = require('./chunk-SS2LQM3B.js');var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkSS2LQM3Bjs = require('./chunk-SS2LQM3B.js');var _chunkXQZVOI6Wjs = require('./chunk-XQZVOI6W.js');var _dumbo = require('@event-driven-io/dumbo');require('pg');var _uuid = require('uuid');var H=_dumbo.rawSql.call(void 0, `CREATE OR REPLACE FUNCTION emt_append_event(
|
|
2
2
|
v_event_ids text[],
|
|
3
3
|
v_events_data jsonb[],
|
|
4
4
|
v_events_metadata jsonb[],
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
RETURN QUERY SELECT TRUE, v_next_stream_position, v_last_global_position, v_transaction_id;
|
|
81
81
|
END;
|
|
82
82
|
$$;
|
|
83
|
-
`),
|
|
83
|
+
`),j= exports.b =(t,a,r,n,i)=>_dumbo.executeInTransaction.call(void 0, t,async e=>{if(n.length===0)return{success:!1,result:{success:!1}};let p;try{let o=C(_optionalChain([i, 'optionalAccess', _2 => _2.expectedStreamVersion])),c=n.map((u,x)=>({...u,metadata:{streamName:a,eventId:_uuid.v4.call(void 0, ),streamPosition:BigInt(x),...u.metadata}}));p=await O(e,a,r,c,{expectedStreamVersion:o}),_optionalChain([i, 'optionalAccess', _3 => _3.preCommitHook])&&await i.preCommitHook(e,c)}catch(o){if(!y(o))throw o;p={success:!1,last_global_position:null,next_stream_position:null,transaction_id:null}}let{success:d,next_stream_position:m,last_global_position:l,transaction_id:E}=p;return{success:d,result:d&&m&&l&&E?{success:!0,nextStreamPosition:BigInt(m),lastGlobalPosition:BigInt(l),transactionId:E}:{success:!1}}}),C=t=>t===void 0||t===_chunkXQZVOI6Wjs.e||t==_chunkXQZVOI6Wjs.d||t==_chunkXQZVOI6Wjs.c?null:t,y=t=>t instanceof Error&&"code"in t&&t.code==="23505",O=(t,a,r,n,i)=>_dumbo.single.call(void 0, _dumbo.executeSQL.call(void 0, t,_dumbo.sql.call(void 0, `SELECT * FROM emt_append_event(
|
|
84
84
|
ARRAY[%s]::text[],
|
|
85
85
|
ARRAY[%s]::jsonb[],
|
|
86
86
|
ARRAY[%s]::jsonb[],
|
|
@@ -90,5 +90,5 @@
|
|
|
90
90
|
%L::text,
|
|
91
91
|
%s::bigint,
|
|
92
92
|
%L::text
|
|
93
|
-
)`,
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
93
|
+
)`,n.map(e=>_dumbo.sql.call(void 0, "%L",e.metadata.eventId)).join(","),n.map(e=>_dumbo.sql.call(void 0, "%L",_chunkXQZVOI6Wjs.a.stringify(e.data))).join(","),n.map(e=>_dumbo.sql.call(void 0, "%L",_chunkXQZVOI6Wjs.a.stringify(_nullishCoalesce(e.metadata, () => ({}))))).join(","),n.map(()=>"'1'").join(","),n.map(e=>_dumbo.sql.call(void 0, "%L",e.type)).join(","),a,r,_nullishCoalesce(_optionalChain([i, 'optionalAccess', _4 => _4.expectedStreamVersion]), () => ("NULL")),_nullishCoalesce(_optionalChain([i, 'optionalAccess', _5 => _5.partition]), () => (_chunkSS2LQM3Bjs.c)))));exports.a = H; exports.b = j;
|
|
94
|
+
//# sourceMappingURL=chunk-KADY7IHM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/appendToStream.ts"],"names":["executeInTransaction","executeSQL","rawSql","single","sql","uuid","appendEventsSQL","streamsTable","eventsTable","appendToStream","pool","streamName","streamType","events","options","client","appendResult","expectedStreamVersion","toExpectedVersion","eventsToAppend","e","i","appendEventsRaw","error","isOptimisticConcurrencyError","success","next_stream_position","last_global_position","transaction_id","expected","n","a","s","streamId","p","defaultTag"],"mappings":"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","sourcesContent":["import {\n executeInTransaction,\n executeSQL,\n rawSql,\n single,\n sql,\n} from '@event-driven-io/dumbo';\nimport {\n JSONParser,\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n type AppendToStreamOptions,\n type Event,\n type ExpectedStreamVersion,\n type ReadEvent,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { defaultTag, eventsTable, streamsTable } from './typing';\n\nexport const appendEventsSQL = rawSql(\n `CREATE OR REPLACE FUNCTION emt_append_event(\n v_event_ids text[],\n v_events_data jsonb[],\n v_events_metadata jsonb[],\n v_event_schema_versions text[],\n v_event_types text[],\n v_stream_id text,\n v_stream_type text,\n v_expected_stream_position bigint DEFAULT NULL,\n v_partition text DEFAULT emt_sanitize_name('default_partition')\n ) RETURNS TABLE (\n success boolean,\n next_stream_position bigint,\n last_global_position bigint,\n transaction_id xid8\n ) LANGUAGE plpgsql\n AS $$\n DECLARE\n v_next_stream_position bigint;\n v_position bigint;\n v_updated_rows int;\n v_transaction_id xid8;\n v_last_global_position bigint;\n BEGIN\n IF v_expected_stream_position IS NULL THEN\n SELECT COALESCE(max(stream_position), 0) INTO v_expected_stream_position\n FROM ${streamsTable.name}\n WHERE stream_id = v_stream_id AND partition = v_partition;\n END IF;\n\n v_next_stream_position := v_expected_stream_position + array_upper(v_events_data, 1);\n v_transaction_id := pg_current_xact_id();\n\n WITH ev AS (\n SELECT row_number() OVER () + v_expected_stream_position AS stream_position, \n event_data, \n event_metadata, \n schema_version, \n event_id, \n event_type\n FROM (\n SELECT *\n FROM \n unnest(v_event_ids, v_events_data, v_events_metadata, v_event_schema_versions, v_event_types) \n AS event(event_id, event_data, event_metadata, schema_version, event_type)\n ) AS event\n ),\n all_events_insert AS (\n INSERT INTO ${eventsTable.name}\n (stream_id, stream_position, partition, event_data, event_metadata, event_schema_version, event_type, event_id, transaction_id)\n SELECT \n v_stream_id, ev.stream_position, v_partition, ev.event_data, ev.event_metadata, ev.schema_version, ev.event_type, ev.event_id, v_transaction_id\n FROM ev\n RETURNING global_position\n )\n SELECT \n max(global_position) INTO v_last_global_position \n FROM \n all_events_insert;\n\n\n IF v_expected_stream_position = 0 THEN\n INSERT INTO ${streamsTable.name}\n (stream_id, stream_position, partition, stream_type, stream_metadata, is_archived)\n VALUES\n (v_stream_id, v_next_stream_position, v_partition, v_stream_type, '{}', FALSE);\n ELSE\n UPDATE ${streamsTable.name} as s \n SET stream_position = v_next_stream_position\n WHERE stream_id = v_stream_id AND stream_position = v_expected_stream_position AND partition = v_partition AND is_archived = FALSE;\n\n get diagnostics v_updated_rows = row_count;\n\n IF v_updated_rows = 0 THEN\n RETURN QUERY SELECT FALSE, NULL::bigint, NULL::bigint, NULL::xid8;\n RETURN;\n END IF;\n END IF;\n\n RETURN QUERY SELECT TRUE, v_next_stream_position, v_last_global_position, v_transaction_id;\n END;\n $$;\n `,\n);\n\ntype AppendEventResult =\n | {\n success: true;\n nextStreamPosition: bigint;\n lastGlobalPosition: bigint;\n transactionId: string;\n }\n | { success: false };\n\nexport const appendToStream = (\n pool: pg.Pool,\n streamName: string,\n streamType: string,\n events: Event[],\n options?: AppendToStreamOptions & {\n partition?: string;\n preCommitHook?: (\n client: pg.PoolClient,\n events: ReadEvent[],\n ) => Promise<void>;\n },\n): Promise<AppendEventResult> =>\n executeInTransaction<AppendEventResult>(pool, async (client) => {\n if (events.length === 0)\n return { success: false, result: { success: false } };\n\n let appendResult: AppendEventSqlResult;\n\n try {\n const expectedStreamVersion = toExpectedVersion(\n options?.expectedStreamVersion,\n );\n\n const eventsToAppend: ReadEvent[] = events.map((e, i) => ({\n ...e,\n metadata: {\n streamName,\n eventId: uuid(),\n streamPosition: BigInt(i),\n ...e.metadata,\n },\n }));\n\n // TODO: return global positions from append raw and other generated data\n appendResult = await appendEventsRaw(\n client,\n streamName,\n streamType,\n eventsToAppend,\n {\n expectedStreamVersion,\n },\n );\n\n if (options?.preCommitHook)\n await options.preCommitHook(client, eventsToAppend);\n } catch (error) {\n if (!isOptimisticConcurrencyError(error)) throw error;\n\n appendResult = {\n success: false,\n last_global_position: null,\n next_stream_position: null,\n transaction_id: null,\n };\n }\n\n const {\n success,\n next_stream_position,\n last_global_position,\n transaction_id,\n } = appendResult;\n\n return {\n success,\n result:\n success &&\n next_stream_position &&\n last_global_position &&\n transaction_id\n ? {\n success: true,\n nextStreamPosition: BigInt(next_stream_position),\n lastGlobalPosition: BigInt(last_global_position),\n transactionId: transaction_id,\n }\n : { success: false },\n };\n });\n\nconst toExpectedVersion = (\n expected: ExpectedStreamVersion | undefined,\n): bigint | null => {\n if (expected === undefined) return null;\n\n if (expected === NO_CONCURRENCY_CHECK) return null;\n\n // TODO: this needs to be fixed\n if (expected == STREAM_DOES_NOT_EXIST) return null;\n\n // TODO: this needs to be fixed\n if (expected == STREAM_EXISTS) return null;\n\n return expected as bigint;\n};\n\nconst isOptimisticConcurrencyError = (error: unknown): boolean =>\n error instanceof Error && 'code' in error && error.code === '23505';\n\ntype AppendEventSqlResult = {\n success: boolean;\n next_stream_position: string | null;\n last_global_position: string | null;\n transaction_id: string | null | undefined;\n};\n\nconst appendEventsRaw = (\n client: pg.PoolClient,\n streamId: string,\n streamType: string,\n events: ReadEvent[],\n options?: {\n expectedStreamVersion: bigint | null;\n partition?: string;\n },\n): Promise<AppendEventSqlResult> =>\n single(\n executeSQL<AppendEventSqlResult>(\n client,\n sql(\n `SELECT * FROM emt_append_event(\n ARRAY[%s]::text[],\n ARRAY[%s]::jsonb[],\n ARRAY[%s]::jsonb[],\n ARRAY[%s]::text[],\n ARRAY[%s]::text[],\n %L::text,\n %L::text,\n %s::bigint,\n %L::text\n )`,\n events.map((e) => sql('%L', e.metadata.eventId)).join(','),\n events.map((e) => sql('%L', JSONParser.stringify(e.data))).join(','),\n events\n .map((e) => sql('%L', JSONParser.stringify(e.metadata ?? {})))\n .join(','),\n events.map(() => `'1'`).join(','),\n events.map((e) => sql('%L', e.type)).join(','),\n streamId,\n streamType,\n options?.expectedStreamVersion ?? 'NULL',\n options?.partition ?? defaultTag,\n ),\n ),\n );\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('pg');var y={projections:[]},a= exports.b =async(n,o,i,t)=>{let p=t.map(e=>e.type),r=n.filter(e=>e.canHandle.some(s=>p.includes(s)));for(let e of r)await e.handle(o,i,t)};exports.a = y; exports.b = a;
|
|
2
|
+
//# sourceMappingURL=chunk-MI5QKIUY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/projections/index.ts"],"names":["defaultProjectionOptions","handleProjections","allProjections","connectionString","client","events","eventTypes","projections","p","type","projection"],"mappings":"AAKA,MAAe,KAgBR,IAAMA,EAAsD,CACjE,YAAa,CAAC,CAChB,EAEaC,EAAoB,MAC/BC,EACAC,EACAC,EACAC,IACkB,CAClB,IAAMC,EAAaD,EAAO,IAAK,GAAM,EAAE,IAAI,EAErCE,EAAcL,EAAe,OAAQM,GACzCA,EAAE,UAAU,KAAMC,GAASH,EAAW,SAASG,CAAI,CAAC,CACtD,EAEA,QAAWC,KAAcH,EACvB,MAAMG,EAAW,OAAOP,EAAkBC,EAAQC,CAAM,CAE5D","sourcesContent":["import {\n type Event,\n type EventTypeOf,\n type ReadEvent,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport type { PostgresEventStoreOptions } from '../postgreSQLEventStore';\n\nexport type PostgresProjectionHandler<EventType extends Event = Event> = (\n connectionString: string,\n client: pg.PoolClient,\n events: ReadEvent<EventType>[],\n) => Promise<void> | void;\n\nexport type ProjectionDefintion<EventType extends Event = Event> = {\n type: 'inline';\n name?: string;\n canHandle: EventTypeOf<EventType>[];\n handle: PostgresProjectionHandler<EventType>;\n};\n\nexport const defaultProjectionOptions: PostgresEventStoreOptions = {\n projections: [],\n};\n\nexport const handleProjections = async <EventType extends Event = Event>(\n allProjections: ProjectionDefintion<EventType>[],\n connectionString: string,\n client: pg.PoolClient,\n events: ReadEvent<EventType>[],\n): Promise<void> => {\n const eventTypes = events.map((e) => e.type);\n\n const projections = allProjections.filter((p) =>\n p.canHandle.some((type) => eventTypes.includes(type)),\n );\n\n for (const projection of projections) {\n await projection.handle(connectionString, client, events);\n }\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkSS2LQM3Bjs = require('./chunk-SS2LQM3B.js');var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkSS2LQM3Bjs = require('./chunk-SS2LQM3B.js');var _chunkXQZVOI6Wjs = require('./chunk-XQZVOI6W.js');var _dumbo = require('@event-driven-io/dumbo');require('pg');var u=async(v,n,t)=>{let d=t&&"from"in t?`AND stream_position >= ${t.from}`:"",i=Number(t&&"to"in t?t.to:t&&"maxCount"in t&&t.maxCount?t.from+t.maxCount:NaN),p=isNaN(i)?"":`AND stream_position <= ${i}`,a=await _dumbo.mapRows.call(void 0, _dumbo.executeSQL.call(void 0, v,_dumbo.sql.call(void 0, `SELECT stream_id, stream_position, global_position, event_data, event_metadata, event_schema_version, event_type, event_id
|
|
2
2
|
FROM ${_chunkSS2LQM3Bjs.f.name}
|
|
3
|
-
WHERE stream_id = %L AND partition = %L AND is_archived = FALSE ${
|
|
4
|
-
//# sourceMappingURL=chunk-
|
|
3
|
+
WHERE stream_id = %L AND partition = %L AND is_archived = FALSE ${d} ${p}`,n,_nullishCoalesce(_optionalChain([t, 'optionalAccess', _ => _.partition]), () => (_chunkSS2LQM3Bjs.c)))),e=>{let r=_chunkXQZVOI6Wjs.b.call(void 0, e.event_type,e.event_data,e.event_metadata);return{...r,metadata:{...r.metadata,eventId:e.event_id,streamName:n,streamPosition:BigInt(e.stream_position),globalPosition:BigInt(e.global_position)}}});return a.length>0?{currentStreamVersion:a[a.length-1].metadata.streamPosition,events:a}:null};exports.a = u;
|
|
4
|
+
//# sourceMappingURL=chunk-P36ZOB2E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/readStream.ts"],"names":["executeSQL","mapRows","sql","readStream","pool","streamId","options","fromCondition","to","toCondition","events","eventsTable","defaultTag","row","rawEvent","n"],"mappings":"uFAAA,OAAS,cAAAA,EAAY,WAAAC,EAAS,OAAAC,MAAW,yBAazC,MAAe,KAeR,IAAMC,EAAa,MACxBC,EACAC,EACAC,IAOG,CACH,IAAMC,EACJD,GAAW,SAAUA,EACjB,0BAA0BA,EAAQ,IAAI,GACtC,GAEAE,EAAK,OACTF,GAAW,OAAQA,EACfA,EAAQ,GACRA,GAAW,aAAcA,GAAWA,EAAQ,SAC1CA,EAAQ,KAAOA,EAAQ,SACvB,GACR,EAEMG,EAAe,MAAMD,CAAE,EAAqC,GAAjC,0BAA0BA,CAAE,GAEvDE,EACJ,MAAMT,EACJD,EACEI,EACAF,EACE;AAAA,kBACQS,EAAY,IAAI;AAAA,6EAC2CJ,CAAa,IAAIE,CAAW,GAC/FJ,EACAC,GAAS,WAAaM,CACxB,CACF,EACCC,GAAQ,CACP,IAAMC,EAAWC,EACfF,EAAI,WACJA,EAAI,WACJA,EAAI,cACN,EAEA,MAAO,CACL,GAAGC,EACH,SAAU,CACR,GAAGA,EAAS,SACZ,QAASD,EAAI,SACb,WAAYR,EACZ,eAAgB,OAAOQ,EAAI,eAAe,EAC1C,eAAgB,OAAOA,EAAI,eAAe,CAC5C,CACF,CACF,CACF,EAEF,OAAOH,EAAO,OAAS,EACnB,CACE,qBACEA,EAAOA,EAAO,OAAS,CAAC,EAAG,SAAS,eACtC,OAAAA,CACF,EACA,IACN","sourcesContent":["import { executeSQL, mapRows, sql } from '@event-driven-io/dumbo';\nimport {\n event,\n type DefaultStreamVersionType,\n type Event,\n type EventDataOf,\n type EventMetaDataOf,\n type EventTypeOf,\n type ReadEvent,\n type ReadEventMetadataWithGlobalPosition,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { defaultTag, eventsTable } from './typing';\n\ntype ReadStreamSqlResult<EventType extends Event> = {\n stream_position: string;\n event_data: EventDataOf<EventType>;\n event_metadata: EventMetaDataOf<EventType>;\n event_schema_version: string;\n event_type: EventTypeOf<EventType>;\n event_id: string;\n global_position: string;\n transaction_id: string;\n created: string;\n};\n\nexport const readStream = async <EventType extends Event>(\n pool: pg.Pool,\n streamId: string,\n options?: ReadStreamOptions & { partition?: string },\n): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n> => {\n const fromCondition: string =\n options && 'from' in options\n ? `AND stream_position >= ${options.from}`\n : '';\n\n const to = Number(\n options && 'to' in options\n ? options.to\n : options && 'maxCount' in options && options.maxCount\n ? options.from + options.maxCount\n : NaN,\n );\n\n const toCondition = !isNaN(to) ? `AND stream_position <= ${to}` : '';\n\n const events: ReadEvent<EventType, ReadEventMetadataWithGlobalPosition>[] =\n await mapRows(\n executeSQL<ReadStreamSqlResult<EventType>>(\n pool,\n sql(\n `SELECT stream_id, stream_position, global_position, event_data, event_metadata, event_schema_version, event_type, event_id\n FROM ${eventsTable.name}\n WHERE stream_id = %L AND partition = %L AND is_archived = FALSE ${fromCondition} ${toCondition}`,\n streamId,\n options?.partition ?? defaultTag,\n ),\n ),\n (row) => {\n const rawEvent = event<EventType>(\n row.event_type,\n row.event_data,\n row.event_metadata,\n ) as EventType;\n\n return {\n ...rawEvent,\n metadata: {\n ...rawEvent.metadata,\n eventId: row.event_id,\n streamName: streamId,\n streamPosition: BigInt(row.stream_position),\n globalPosition: BigInt(row.global_position),\n },\n };\n },\n );\n\n return events.length > 0\n ? {\n currentStreamVersion:\n events[events.length - 1]!.metadata.streamPosition,\n events,\n }\n : null;\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as t,b as o,c as a,d as r,e as n,f as d,g as s,h as m,i as p,j as i,k as S}from"./chunk-UWD6GOZC.mjs";import{a as e}from"./chunk-COTRMVOL.mjs";import{executeSQLBatchInTransaction as L}from"@event-driven-io/dumbo";import"pg";var Q=[t,o,a,r,n,d,s,m,p,i,e,S],b=l=>L(l,...Q);export{Q as a,b};
|
|
2
|
+
//# sourceMappingURL=chunk-QHCLGPQG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/index.ts"],"sourcesContent":["import { executeSQLBatchInTransaction, type SQL } from '@event-driven-io/dumbo';\nimport pg from 'pg';\nimport { appendEventsSQL } from './appendToStream';\nimport {\n addDefaultPartition,\n addEventsPartitions,\n addModuleForAllTenantsSQL,\n addModuleSQL,\n addTablePartitions,\n addTenantForAllModulesSQL,\n addTenantSQL,\n eventsTableSQL,\n sanitizeNameSQL,\n streamsTableSQL,\n subscriptionsTableSQL,\n} from './tables';\n\nexport * from './appendToStream';\nexport * from './readStream';\nexport * from './tables';\nexport * from './typing';\n\nexport const schemaSQL: SQL[] = [\n streamsTableSQL,\n eventsTableSQL,\n subscriptionsTableSQL,\n sanitizeNameSQL,\n addTablePartitions,\n addEventsPartitions,\n addModuleSQL,\n addTenantSQL,\n addModuleForAllTenantsSQL,\n addTenantForAllModulesSQL,\n appendEventsSQL,\n addDefaultPartition,\n];\n\nexport const createEventStoreSchema = (pool: pg.Pool) =>\n executeSQLBatchInTransaction(pool, ...schemaSQL);\n"],"mappings":"wJAAA,OAAS,gCAAAA,MAA8C,yBACvD,MAAe,KAqBR,IAAMC,EAAmB,CAC9BC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CACF,EAEaC,EAA0BC,GACrCC,EAA6BD,EAAM,GAAGd,CAAS","names":["executeSQLBatchInTransaction","schemaSQL","streamsTableSQL","eventsTableSQL","subscriptionsTableSQL","sanitizeNameSQL","addTablePartitions","addEventsPartitions","addModuleSQL","addTenantSQL","addModuleForAllTenantsSQL","addTenantForAllModulesSQL","appendEventsSQL","addDefaultPartition","createEventStoreSchema","pool","executeSQLBatchInTransaction"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as y,b as f}from"./chunk-KA3LTDXJ.mjs";import{b as R}from"./chunk-QHCLGPQG.mjs";import{b as T}from"./chunk-COTRMVOL.mjs";import{a as P}from"./chunk-D5T7G7UL.mjs";import{c as v,d as g,e as S,f as c}from"./chunk-E56AUXA3.mjs";import{endPool as x,getPool as O}from"@event-driven-io/dumbo";var D=(e,t=y)=>{let m=O(e),d=R(m),{projections:V}=t;return{async aggregateStream(n,r){await d;let{evolve:s,initialState:i,read:E}=r,l=E?.expectedStreamVersion,o=i(),a=await this.readStream(n,r.read);if(a===null)return null;let p=a.currentStreamVersion;w(p,l);for(let u of a.events)u&&(o=s(o,u));return{currentStreamVersion:p,state:o}},readStream:async(n,r)=>(await d,P(m,n,r)),appendToStream:async(n,r,s)=>{await d;let[i,...E]=n.split("-"),l=i&&E.length>0?i:"emt:unknown",o=await T(m,n,l,r,{...s,preCommitHook:(a,p)=>f(V,e,a,p)});if(!o.success)throw new c(-1n,s?.expectedStreamVersion??S);return{nextExpectedStreamVersion:o.nextStreamPosition}},close:()=>x({connectionString:e})}},h=(e,t)=>t===S?!0:t==g?e===void 0:t==v?e!==void 0:e===t,w=(e,t)=>{if(t??=S,!h(e,t))throw new c(e,t)};export{D as a};
|
|
2
|
+
//# sourceMappingURL=chunk-UMUX2OL5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/postgreSQLEventStore.ts"],"sourcesContent":["import { endPool, getPool } from '@event-driven-io/dumbo';\nimport {\n ExpectedVersionConflictError,\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type Event,\n type EventStore,\n type ExpectedStreamVersion,\n type ReadEventMetadataWithGlobalPosition,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from '@event-driven-io/emmett';\nimport {\n defaultProjectionOptions,\n handleProjections,\n type ProjectionDefintion,\n} from './projections';\nimport { appendToStream, createEventStoreSchema, readStream } from './schema';\n\nexport interface PostgresEventStore\n extends EventStore<\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n > {\n close(): Promise<void>;\n}\n\nexport type PostgresEventStoreOptions = {\n projections: ProjectionDefintion[];\n};\nexport const getPostgreSQLEventStore = (\n connectionString: string,\n options: PostgresEventStoreOptions = defaultProjectionOptions,\n): PostgresEventStore => {\n const pool = getPool(connectionString);\n const ensureSchemaExists = createEventStoreSchema(pool);\n\n const { projections } = options;\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<AggregateStreamResult<State> | null> {\n await ensureSchemaExists;\n const { evolve, initialState, read } = options;\n\n const expectedStreamVersion = read?.expectedStreamVersion;\n\n let state = initialState();\n\n const result = await this.readStream<EventType>(streamName, options.read);\n\n if (result === null) return null;\n\n const currentStreamVersion = result.currentStreamVersion;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n expectedStreamVersion,\n );\n\n for (const event of result.events) {\n if (!event) continue;\n\n state = evolve(state, event);\n }\n\n return {\n currentStreamVersion: currentStreamVersion,\n state,\n };\n },\n\n readStream: async <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n > => {\n await ensureSchemaExists;\n return readStream<EventType>(pool, streamName, options);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n await ensureSchemaExists;\n // TODO: This has to be smarter when we introduce urn-based resolution\n const [firstPart, ...rest] = streamName.split('-');\n\n const streamType =\n firstPart && rest.length > 0 ? firstPart : 'emt:unknown';\n\n const appendResult = await appendToStream(\n pool,\n streamName,\n streamType,\n events,\n {\n ...options,\n preCommitHook: (client, events) =>\n handleProjections(projections, connectionString, client, events),\n },\n );\n\n if (!appendResult.success)\n throw new ExpectedVersionConflictError<bigint>(\n -1n, //TODO: Return actual version in case of error\n options?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n );\n\n return { nextExpectedStreamVersion: appendResult.nextStreamPosition };\n },\n close: () => endPool({ connectionString }),\n };\n};\n\nconst matchesExpectedVersion = (\n current: bigint | undefined,\n expected: ExpectedStreamVersion,\n): boolean => {\n if (expected === NO_CONCURRENCY_CHECK) return true;\n\n if (expected == STREAM_DOES_NOT_EXIST) return current === undefined;\n\n if (expected == STREAM_EXISTS) return current !== undefined;\n\n return current === expected;\n};\n\nconst assertExpectedVersionMatchesCurrent = (\n current: bigint | undefined,\n expected: ExpectedStreamVersion | undefined,\n): void => {\n expected ??= NO_CONCURRENCY_CHECK;\n\n if (!matchesExpectedVersion(current, expected))\n throw new ExpectedVersionConflictError(current, expected);\n};\n"],"mappings":"yOAAA,OAAS,WAAAA,EAAS,WAAAC,MAAe,yBAoC1B,IAAMC,EAA0B,CACrCC,EACAC,EAAqCC,IACd,CACvB,IAAMC,EAAOC,EAAQJ,CAAgB,EAC/BK,EAAqBC,EAAuBH,CAAI,EAEhD,CAAE,YAAAI,CAAY,EAAIN,EAExB,MAAO,CACL,MAAM,gBACJO,EACAP,EAC8C,CAC9C,MAAMI,EACN,GAAM,CAAE,OAAAI,EAAQ,aAAAC,EAAc,KAAAC,CAAK,EAAIV,EAEjCW,EAAwBD,GAAM,sBAEhCE,EAAQH,EAAa,EAEnBI,EAAS,MAAM,KAAK,WAAsBN,EAAYP,EAAQ,IAAI,EAExE,GAAIa,IAAW,KAAM,OAAO,KAE5B,IAAMC,EAAuBD,EAAO,qBAEpCE,EACED,EACAH,CACF,EAEA,QAAWK,KAASH,EAAO,OACpBG,IAELJ,EAAQJ,EAAOI,EAAOI,CAAK,GAG7B,MAAO,CACL,qBAAsBF,EACtB,MAAAF,CACF,CACF,EAEA,WAAY,MACVL,EACAP,KAQA,MAAMI,EACCa,EAAsBf,EAAMK,EAAYP,CAAO,GAGxD,eAAgB,MACdO,EACAW,EACAlB,IACkC,CAClC,MAAMI,EAEN,GAAM,CAACe,EAAW,GAAGC,CAAI,EAAIb,EAAW,MAAM,GAAG,EAE3Cc,EACJF,GAAaC,EAAK,OAAS,EAAID,EAAY,cAEvCG,EAAe,MAAMC,EACzBrB,EACAK,EACAc,EACAH,EACA,CACE,GAAGlB,EACH,cAAe,CAACwB,EAAQN,IACtBO,EAAkBnB,EAAaP,EAAkByB,EAAQN,CAAM,CACnE,CACF,EAEA,GAAI,CAACI,EAAa,QAChB,MAAM,IAAII,EACR,CAAC,GACD1B,GAAS,uBAAyB2B,CACpC,EAEF,MAAO,CAAE,0BAA2BL,EAAa,kBAAmB,CACtE,EACA,MAAO,IAAMM,EAAQ,CAAE,iBAAA7B,CAAiB,CAAC,CAC3C,CACF,EAEM8B,EAAyB,CAC7BC,EACAC,IAEIA,IAAaJ,EAA6B,GAE1CI,GAAYC,EAA8BF,IAAY,OAEtDC,GAAYE,EAAsBH,IAAY,OAE3CA,IAAYC,EAGfhB,EAAsC,CAC1Ce,EACAC,IACS,CAGT,GAFAA,IAAaJ,EAET,CAACE,EAAuBC,EAASC,CAAQ,EAC3C,MAAM,IAAIL,EAA6BI,EAASC,CAAQ,CAC5D","names":["endPool","getPool","getPostgreSQLEventStore","connectionString","options","defaultProjectionOptions","pool","getPool","ensureSchemaExists","createEventStoreSchema","projections","streamName","evolve","initialState","read","expectedStreamVersion","state","result","currentStreamVersion","assertExpectedVersionMatchesCurrent","event","readStream","events","firstPart","rest","streamType","appendResult","appendToStream","client","handleProjections","t","n","endPool","matchesExpectedVersion","current","expected","a","s"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as _,c as t,e as a,f as e}from"./chunk-ABNBEUC6.mjs";import{
|
|
1
|
+
import{b as _,c as t,e as a,f as e}from"./chunk-ABNBEUC6.mjs";import{rawSql as n}from"@event-driven-io/dumbo";var m=n(`CREATE TABLE IF NOT EXISTS ${a.name}(
|
|
2
2
|
stream_id TEXT NOT NULL,
|
|
3
3
|
stream_position BIGINT NOT NULL,
|
|
4
4
|
partition TEXT NOT NULL DEFAULT '${_}__${_}',
|
|
@@ -261,4 +261,4 @@ import{b as _,c as t,e as a,f as e}from"./chunk-ABNBEUC6.mjs";import{f as n}from
|
|
|
261
261
|
END;
|
|
262
262
|
$$ LANGUAGE plpgsql;
|
|
263
263
|
`),R=n(`SELECT emt_add_partition('${t}');`);export{m as a,i as b,I as c,o as d,r as e,N as f,A as g,O as h,d as i,L as j,R as k};
|
|
264
|
-
//# sourceMappingURL=chunk-
|
|
264
|
+
//# sourceMappingURL=chunk-UWD6GOZC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/tables.ts"],"sourcesContent":["import { rawSql } from '@event-driven-io/dumbo';\nimport { defaultTag, eventsTable, globalTag, streamsTable } from './typing';\n\nexport const streamsTableSQL = rawSql(\n `CREATE TABLE IF NOT EXISTS ${streamsTable.name}(\n stream_id TEXT NOT NULL,\n stream_position BIGINT NOT NULL,\n partition TEXT NOT NULL DEFAULT '${globalTag}__${globalTag}',\n stream_type TEXT NOT NULL,\n stream_metadata JSONB NOT NULL,\n is_archived BOOLEAN NOT NULL DEFAULT FALSE,\n PRIMARY KEY (stream_id, stream_position, partition, is_archived),\n UNIQUE (stream_id, partition, is_archived)\n ) PARTITION BY LIST (partition);`,\n);\n\nexport const eventsTableSQL = rawSql(\n `\n CREATE SEQUENCE IF NOT EXISTS emt_global_event_position;\n\n CREATE TABLE IF NOT EXISTS ${eventsTable.name}(\n stream_id TEXT NOT NULL,\n stream_position BIGINT NOT NULL,\n partition TEXT NOT NULL DEFAULT '${globalTag}',\n event_data JSONB NOT NULL,\n event_metadata JSONB NOT NULL,\n event_schema_version TEXT NOT NULL,\n event_type TEXT NOT NULL,\n event_id TEXT NOT NULL,\n is_archived BOOLEAN NOT NULL DEFAULT FALSE,\n global_position BIGINT DEFAULT nextval('emt_global_event_position'),\n transaction_id XID8 NOT NULL,\n created TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (stream_id, stream_position, partition, is_archived)\n ) PARTITION BY LIST (partition);`,\n);\n\nexport const subscriptionsTableSQL = rawSql(\n `\n CREATE TABLE IF NOT EXISTS emt_subscriptions(\n subscription_id TEXT NOT NULL PRIMARY KEY,\n version INT NOT NULL DEFAULT 1,\n module TEXT NULL,\n tenant TEXT NULL,\n last_processed_position BIGINT NOT NULL,\n last_processed_transaction_id BIGINT NOT NULL\n );\n`,\n);\n\nexport const sanitizeNameSQL = rawSql(\n `CREATE OR REPLACE FUNCTION emt_sanitize_name(input_name TEXT) RETURNS TEXT AS $$\n BEGIN\n RETURN REGEXP_REPLACE(input_name, '[^a-zA-Z0-9_]', '_', 'g');\n END;\n $$ LANGUAGE plpgsql;`,\n);\n\nexport const addTablePartitions = rawSql(\n `\n CREATE OR REPLACE FUNCTION emt_add_table_partition(tableName TEXT, partition_name TEXT) RETURNS void AS $$\n DECLARE\n v_main_partiton_name TEXT;\n v_active_partiton_name TEXT;\n v_archived_partiton_name TEXT;\n BEGIN \n v_main_partiton_name := emt_sanitize_name(tableName || '_' || partition_name);\n v_active_partiton_name := emt_sanitize_name(v_main_partiton_name || '_active');\n v_archived_partiton_name := emt_sanitize_name(v_main_partiton_name || '_archived');\n\n -- create default events partition\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (%L) PARTITION BY LIST (is_archived);',\n v_main_partiton_name, tableName, partition_name\n );\n\n -- create default streams partition\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (%L) PARTITION BY LIST (is_archived);',\n v_main_partiton_name, tableName, partition_name\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (FALSE);',\n v_active_partiton_name, v_main_partiton_name\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (TRUE);',\n v_archived_partiton_name, v_main_partiton_name\n );\n END;\n $$ LANGUAGE plpgsql;`,\n);\n\nexport const addEventsPartitions = rawSql(\n `\n CREATE OR REPLACE FUNCTION emt_add_partition(partition_name TEXT) RETURNS void AS $$\n BEGIN \n PERFORM emt_add_table_partition('${eventsTable.name}', partition_name);\n PERFORM emt_add_table_partition('${streamsTable.name}', partition_name);\n END;\n $$ LANGUAGE plpgsql;`,\n);\n\nexport const addModuleSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_module(new_module TEXT) RETURNS void AS $$\n BEGIN\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(%L || ''__'' || %L)) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}'), '${eventsTable.name}', new_module, '${globalTag}'\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}' || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}' || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(%L || ''__'' || %L)) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}'), '${streamsTable.name}', new_module, '${globalTag}'\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}' || '_active'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}' || '_archived'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || '${globalTag}')\n );\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addTenantSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_tenant(new_module TEXT, new_tenant TEXT) RETURNS void AS $$\n BEGIN\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant), '${eventsTable.name}', new_module, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || new_tenant)\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant), '${streamsTable.name}', new_module, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant || '_active'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant || '_archived'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || new_tenant)\n );\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addModuleForAllTenantsSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_module_for_all_tenants(new_module TEXT) RETURNS void AS $$\n DECLARE\n tenant_record RECORD;\n BEGIN\n PERFORM add_module(new_module);\n \n FOR tenant_record IN SELECT DISTINCT tenant FROM ${eventsTable.name}\n LOOP\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant), '${eventsTable.name}', new_module, tenant_record.tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant), '${streamsTable.name}', new_module, tenant_record.tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant || '_active'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant || '_archived'), emt_sanitize_name('${streamsTable.name}_' || new_module || '__' || tenant_record.tenant)\n );\n END LOOP;\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addTenantForAllModulesSQL = rawSql(\n `\n CREATE OR REPLACE FUNCTION add_tenant_for_all_modules(new_tenant TEXT) RETURNS void AS $$\n DECLARE\n module_record RECORD;\n BEGIN\n FOR module_record IN SELECT DISTINCT partitionname FROM pg_partman.part_config WHERE parent_table = '${eventsTable.name}'\n LOOP\n -- For ${eventsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant), '${eventsTable.name}', module_record.partitionname, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_active'), emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_archived'), emt_sanitize_name('${eventsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n \n -- For ${streamsTable.name} table\n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I PARTITION OF %I\n FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',\n emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant), '${streamsTable.name}', module_record.partitionname, new_tenant\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I\n FOR VALUES IN (FALSE);',\n emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_active'), emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n \n EXECUTE format('\n CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I\n FOR VALUES IN (TRUE);',\n emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant || '_archived'), emt_sanitize_name('${streamsTable.name}_' || module_record.partitionname || '__' || new_tenant)\n );\n END LOOP;\n END;\n $$ LANGUAGE plpgsql;\n `,\n);\n\nexport const addDefaultPartition = rawSql(\n `SELECT emt_add_partition('${defaultTag}');`,\n);\n"],"mappings":"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","names":["rawSql","streamsTableSQL","rawSql","streamsTable","globalTag","eventsTableSQL","eventsTable","subscriptionsTableSQL","sanitizeNameSQL","addTablePartitions","addEventsPartitions","addModuleSQL","addTenantSQL","addModuleForAllTenantsSQL","addTenantForAllModulesSQL","addDefaultPartition","defaultTag"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkMI5QKIUYjs = require('./chunk-MI5QKIUY.js');var _chunkEMFXYVCKjs = require('./chunk-EMFXYVCK.js');var _chunkKADY7IHMjs = require('./chunk-KADY7IHM.js');var _chunkP36ZOB2Ejs = require('./chunk-P36ZOB2E.js');var _chunkXQZVOI6Wjs = require('./chunk-XQZVOI6W.js');var _dumbo = require('@event-driven-io/dumbo');var D=(e,t=_chunkMI5QKIUYjs.a)=>{let m=_dumbo.getPool.call(void 0, e),d=_chunkEMFXYVCKjs.b.call(void 0, m),{projections:V}=t;return{async aggregateStream(n,r){await d;let{evolve:s,initialState:i,read:E}=r,l=_optionalChain([E, 'optionalAccess', _ => _.expectedStreamVersion]),o=i(),a=await this.readStream(n,r.read);if(a===null)return null;let p=a.currentStreamVersion;w(p,l);for(let u of a.events)u&&(o=s(o,u));return{currentStreamVersion:p,state:o}},readStream:async(n,r)=>(await d,_chunkP36ZOB2Ejs.a.call(void 0, m,n,r)),appendToStream:async(n,r,s)=>{await d;let[i,...E]=n.split("-"),l=i&&E.length>0?i:"emt:unknown",o=await _chunkKADY7IHMjs.b.call(void 0, m,n,l,r,{...s,preCommitHook:(a,p)=>_chunkMI5QKIUYjs.b.call(void 0, V,e,a,p)});if(!o.success)throw new (0, _chunkXQZVOI6Wjs.f)(-1n,_nullishCoalesce(_optionalChain([s, 'optionalAccess', _2 => _2.expectedStreamVersion]), () => (_chunkXQZVOI6Wjs.e)));return{nextExpectedStreamVersion:o.nextStreamPosition}},close:()=>_dumbo.endPool.call(void 0, {connectionString:e})}},h=(e,t)=>t===_chunkXQZVOI6Wjs.e?!0:t==_chunkXQZVOI6Wjs.d?e===void 0:t==_chunkXQZVOI6Wjs.c?e!==void 0:e===t,w=(e,t)=>{if(t??=_chunkXQZVOI6Wjs.e,!h(e,t))throw new (0, _chunkXQZVOI6Wjs.f)(e,t)};exports.a = D;
|
|
2
|
+
//# sourceMappingURL=chunk-WHT7LTAU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/postgreSQLEventStore.ts"],"names":["endPool","getPool","getPostgreSQLEventStore","connectionString","options","defaultProjectionOptions","pool","ensureSchemaExists","createEventStoreSchema","projections","streamName","evolve","initialState","read","expectedStreamVersion","state","result","currentStreamVersion","assertExpectedVersionMatchesCurrent","event","readStream","events","firstPart","rest","streamType","appendResult","appendToStream","client","handleProjections","t","n","matchesExpectedVersion","current","expected","a","s"],"mappings":"oOAAA,OAAS,WAAAA,EAAS,WAAAC,MAAe,yBAoC1B,IAAMC,EAA0B,CACrCC,EACAC,EAAqCC,IACd,CACvB,IAAMC,EAAOL,EAAQE,CAAgB,EAC/BI,EAAqBC,EAAuBF,CAAI,EAEhD,CAAE,YAAAG,CAAY,EAAIL,EAExB,MAAO,CACL,MAAM,gBACJM,EACAN,EAC8C,CAC9C,MAAMG,EACN,GAAM,CAAE,OAAAI,EAAQ,aAAAC,EAAc,KAAAC,CAAK,EAAIT,EAEjCU,EAAwBD,GAAM,sBAEhCE,EAAQH,EAAa,EAEnBI,EAAS,MAAM,KAAK,WAAsBN,EAAYN,EAAQ,IAAI,EAExE,GAAIY,IAAW,KAAM,OAAO,KAE5B,IAAMC,EAAuBD,EAAO,qBAEpCE,EACED,EACAH,CACF,EAEA,QAAWK,KAASH,EAAO,OACpBG,IAELJ,EAAQJ,EAAOI,EAAOI,CAAK,GAG7B,MAAO,CACL,qBAAsBF,EACtB,MAAAF,CACF,CACF,EAEA,WAAY,MACVL,EACAN,KAQA,MAAMG,EACCa,EAAsBd,EAAMI,EAAYN,CAAO,GAGxD,eAAgB,MACdM,EACAW,EACAjB,IACkC,CAClC,MAAMG,EAEN,GAAM,CAACe,EAAW,GAAGC,CAAI,EAAIb,EAAW,MAAM,GAAG,EAE3Cc,EACJF,GAAaC,EAAK,OAAS,EAAID,EAAY,cAEvCG,EAAe,MAAMC,EACzBpB,EACAI,EACAc,EACAH,EACA,CACE,GAAGjB,EACH,cAAe,CAACuB,EAAQN,IACtBO,EAAkBnB,EAAaN,EAAkBwB,EAAQN,CAAM,CACnE,CACF,EAEA,GAAI,CAACI,EAAa,QAChB,MAAM,IAAII,EACR,CAAC,GACDzB,GAAS,uBAAyB0B,CACpC,EAEF,MAAO,CAAE,0BAA2BL,EAAa,kBAAmB,CACtE,EACA,MAAO,IAAMzB,EAAQ,CAAE,iBAAAG,CAAiB,CAAC,CAC3C,CACF,EAEM4B,EAAyB,CAC7BC,EACAC,IAEIA,IAAaH,EAA6B,GAE1CG,GAAYC,EAA8BF,IAAY,OAEtDC,GAAYE,EAAsBH,IAAY,OAE3CA,IAAYC,EAGff,EAAsC,CAC1Cc,EACAC,IACS,CAGT,GAFAA,IAAaH,EAET,CAACC,EAAuBC,EAASC,CAAQ,EAC3C,MAAM,IAAIJ,EAA6BG,EAASC,CAAQ,CAC5D","sourcesContent":["import { endPool, getPool } from '@event-driven-io/dumbo';\nimport {\n ExpectedVersionConflictError,\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type Event,\n type EventStore,\n type ExpectedStreamVersion,\n type ReadEventMetadataWithGlobalPosition,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from '@event-driven-io/emmett';\nimport {\n defaultProjectionOptions,\n handleProjections,\n type ProjectionDefintion,\n} from './projections';\nimport { appendToStream, createEventStoreSchema, readStream } from './schema';\n\nexport interface PostgresEventStore\n extends EventStore<\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n > {\n close(): Promise<void>;\n}\n\nexport type PostgresEventStoreOptions = {\n projections: ProjectionDefintion[];\n};\nexport const getPostgreSQLEventStore = (\n connectionString: string,\n options: PostgresEventStoreOptions = defaultProjectionOptions,\n): PostgresEventStore => {\n const pool = getPool(connectionString);\n const ensureSchemaExists = createEventStoreSchema(pool);\n\n const { projections } = options;\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<AggregateStreamResult<State> | null> {\n await ensureSchemaExists;\n const { evolve, initialState, read } = options;\n\n const expectedStreamVersion = read?.expectedStreamVersion;\n\n let state = initialState();\n\n const result = await this.readStream<EventType>(streamName, options.read);\n\n if (result === null) return null;\n\n const currentStreamVersion = result.currentStreamVersion;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n expectedStreamVersion,\n );\n\n for (const event of result.events) {\n if (!event) continue;\n\n state = evolve(state, event);\n }\n\n return {\n currentStreamVersion: currentStreamVersion,\n state,\n };\n },\n\n readStream: async <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n > => {\n await ensureSchemaExists;\n return readStream<EventType>(pool, streamName, options);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n await ensureSchemaExists;\n // TODO: This has to be smarter when we introduce urn-based resolution\n const [firstPart, ...rest] = streamName.split('-');\n\n const streamType =\n firstPart && rest.length > 0 ? firstPart : 'emt:unknown';\n\n const appendResult = await appendToStream(\n pool,\n streamName,\n streamType,\n events,\n {\n ...options,\n preCommitHook: (client, events) =>\n handleProjections(projections, connectionString, client, events),\n },\n );\n\n if (!appendResult.success)\n throw new ExpectedVersionConflictError<bigint>(\n -1n, //TODO: Return actual version in case of error\n options?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n );\n\n return { nextExpectedStreamVersion: appendResult.nextStreamPosition };\n },\n close: () => endPool({ connectionString }),\n };\n};\n\nconst matchesExpectedVersion = (\n current: bigint | undefined,\n expected: ExpectedStreamVersion,\n): boolean => {\n if (expected === NO_CONCURRENCY_CHECK) return true;\n\n if (expected == STREAM_DOES_NOT_EXIST) return current === undefined;\n\n if (expected == STREAM_EXISTS) return current !== undefined;\n\n return current === expected;\n};\n\nconst assertExpectedVersionMatchesCurrent = (\n current: bigint | undefined,\n expected: ExpectedStreamVersion | undefined,\n): void => {\n expected ??= NO_CONCURRENCY_CHECK;\n\n if (!matchesExpectedVersion(current, expected))\n throw new ExpectedVersionConflictError(current, expected);\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var n=class extends Error{constructor(t){super(`Cannot parse! ${t}`)}},i= exports.a ={stringify:(t,e)=>JSON.stringify(_optionalChain([e, 'optionalAccess', _ => _.map])?e.map(t):t,(r,a)=>typeof a=="bigint"?a.toString():a),parse:(t,e)=>{let r=JSON.parse(t,_optionalChain([e, 'optionalAccess', _2 => _2.reviver]));if(_optionalChain([e, 'optionalAccess', _3 => _3.typeCheck])&&!_optionalChain([e, 'optionalAccess', _4 => _4.typeCheck, 'call', _5 => _5(r)]))throw new n(t);return _optionalChain([e, 'optionalAccess', _6 => _6.map])?e.map(r):r}};var g=(t,e,r)=>({type:t,data:e,metadata:r});var l=(t=>(t.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",t.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",t.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",t))(l||{}),c=t=>typeof t=="number"&&t===t,m=t=>typeof t=="string";var s=class d extends Error{constructor(e){let r=e&&typeof e=="object"&&"errorCode"in e?e.errorCode:c(e)?e:500,a=e&&typeof e=="object"&&"message"in e?e.message:m(e)?e:`Error with status code '${r}' ocurred during Emmett processing`;super(a),this.errorCode=r,Object.setPrototypeOf(this,d.prototype)}},o=class f extends s{constructor(e,r,a){super({errorCode:412,message:_nullishCoalesce(a, () => (`Expected version ${r.toString()} does not match current ${_optionalChain([e, 'optionalAccess', _7 => _7.toString, 'call', _8 => _8()])}`))}),this.current=e,this.expected=r,Object.setPrototypeOf(this,f.prototype)}};var y="STREAM_EXISTS",u= exports.d ="STREAM_DOES_NOT_EXIST",p= exports.e ="NO_CONCURRENCY_CHECK";var w=class h extends o{constructor(e,r){super(_optionalChain([e, 'optionalAccess', _9 => _9.toString, 'call', _10 => _10()]),_optionalChain([r, 'optionalAccess', _11 => _11.toString, 'call', _12 => _12()])),Object.setPrototypeOf(this,h.prototype)}};var _asyncretry = require('async-retry'); var _asyncretry2 = _interopRequireDefault(_asyncretry);var _webstreamspolyfill = require('web-streams-polyfill');var _uuid = require('uuid');exports.a = i; exports.b = g; exports.c = y; exports.d = u; exports.e = p; exports.f = w;
|
|
2
|
+
//# sourceMappingURL=chunk-XQZVOI6W.js.map
|