@event-driven-io/emmett-postgresql 0.12.0 → 0.12.1
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-5U7HYDY6.mjs} +4 -4
- package/dist/chunk-5U7HYDY6.mjs.map +1 -0
- package/dist/{chunk-XRWQWEAF.js → chunk-GB5VCDBF.js} +2 -2
- package/dist/{chunk-N46ZM26V.js → chunk-GQQPVQW3.js} +4 -4
- package/dist/chunk-GQQPVQW3.js.map +1 -0
- package/dist/{chunk-K5K3ETWI.mjs → chunk-HZQ46ED2.mjs} +2 -2
- package/dist/{chunk-T5F5ZRBR.js → chunk-N4I2XRJV.js} +2 -2
- package/dist/{chunk-3P346ME6.mjs → chunk-YCS26XB2.mjs} +2 -2
- package/dist/eventStore/index.js +1 -1
- package/dist/eventStore/index.mjs +1 -1
- package/dist/eventStore/postgreSQLEventStore.js +1 -1
- package/dist/eventStore/postgreSQLEventStore.mjs +1 -1
- package/dist/eventStore/schema/appendToStream.js +1 -1
- package/dist/eventStore/schema/appendToStream.mjs +1 -1
- package/dist/eventStore/schema/index.js +1 -1
- package/dist/eventStore/schema/index.mjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/chunk-5Z7GAHAZ.mjs.map +0 -1
- package/dist/chunk-N46ZM26V.js.map +0 -1
- /package/dist/{chunk-XRWQWEAF.js.map → chunk-GB5VCDBF.js.map} +0 -0
- /package/dist/{chunk-K5K3ETWI.mjs.map → chunk-HZQ46ED2.mjs.map} +0 -0
- /package/dist/{chunk-T5F5ZRBR.js.map → chunk-N4I2XRJV.js.map} +0 -0
- /package/dist/{chunk-3P346ME6.mjs.map → chunk-YCS26XB2.mjs.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as
|
|
1
|
+
import{c as T,e as a,f as L}from"./chunk-ABNBEUC6.mjs";import{e as i,f as x}from"./chunk-FYXDBZNT.mjs";import{a as p,c,d as u,e as R,h as S,i as g,o as A}from"./chunk-MLVVMWHF.mjs";import"pg";import{v4 as N}from"uuid";var P=x(`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 @@ 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
|
+
`),w=(t,_,o,e,s)=>S(t,async n=>{if(e.length===0)return{success:!1,result:{success:!1}};let r;try{r=await I(n,_,o,e,{expectedStreamVersion:b(s?.expectedStreamVersion)})}catch(E){if(!f(E))throw E;r={success:!1,last_global_position:null,next_stream_position:null,transaction_id:null}}let{success:v,next_stream_position:l,last_global_position:m,transaction_id:d}=r;return{success:v,result:v&&l&&m&&d?{success:!0,nextStreamPosition:BigInt(l),lastGlobalPosition:BigInt(m),transactionId:d}:{success:!1}}}),b=t=>t===void 0||t===R||t==u||t==c?null:t,f=t=>t instanceof Error&&"code"in t&&t.code==="23505",I=(t,_,o,e,s)=>A(g(t,i(`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
|
+
)`,e.map(()=>i("%L",N())).join(","),e.map(n=>i("%L",p.stringify(n.data))).join(","),e.map(n=>i("%L",p.stringify(n.metadata??{}))).join(","),e.map(()=>"'1'").join(","),e.map(n=>i("%L",n.type)).join(","),_,o,s?.expectedStreamVersion??"NULL",s?.partition??T)));export{P as a,w as b};
|
|
94
|
+
//# sourceMappingURL=chunk-5U7HYDY6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/appendToStream.ts"],"sourcesContent":["import {\n JSONParser,\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n type AppendToStreamOptions,\n type Event,\n type ExpectedStreamVersion,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { executeInTransaction, executeSQL, single } from '../../execute';\nimport { rawSQL, sql } from '../../sql';\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 },\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 appendResult = await appendEventsRaw(\n client,\n streamName,\n streamType,\n events,\n {\n expectedStreamVersion: toExpectedVersion(\n options?.expectedStreamVersion,\n ),\n },\n );\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: Event[],\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(() => sql('%L', uuid())).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":"qLASA,MAAe,KACf,OAAS,MAAMA,MAAY,OAKpB,IAAMC,EAAkBC,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA0BeC,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAsBVC,EAAY,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAchBD,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKtBA,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBpC,EAWaE,EAAiB,CAC5BC,EACAC,EACAC,EACAC,EACAC,IAIAC,EAAwCL,EAAM,MAAOM,GAAW,CAC9D,GAAIH,EAAO,SAAW,EACpB,MAAO,CAAE,QAAS,GAAO,OAAQ,CAAE,QAAS,EAAM,CAAE,EAEtD,IAAII,EAEJ,GAAI,CACFA,EAAe,MAAMC,EACnBF,EACAL,EACAC,EACAC,EACA,CACE,sBAAuBM,EACrBL,GAAS,qBACX,CACF,CACF,CACF,OAASM,EAAO,CACd,GAAI,CAACC,EAA6BD,CAAK,EAAG,MAAMA,EAEhDH,EAAe,CACb,QAAS,GACT,qBAAsB,KACtB,qBAAsB,KACtB,eAAgB,IAClB,CACF,CAEA,GAAM,CACJ,QAAAK,EACA,qBAAAC,EACA,qBAAAC,EACA,eAAAC,CACF,EAAIR,EAEJ,MAAO,CACL,QAAAK,EACA,OACEA,GACAC,GACAC,GACAC,EACI,CACE,QAAS,GACT,mBAAoB,OAAOF,CAAoB,EAC/C,mBAAoB,OAAOC,CAAoB,EAC/C,cAAeC,CACjB,EACA,CAAE,QAAS,EAAM,CACzB,CACF,CAAC,EAEGN,EACJO,GAEIA,IAAa,QAEbA,IAAaC,GAGbD,GAAYE,GAGZF,GAAYG,EAAsB,KAE/BH,EAGHL,EAAgCD,GACpCA,aAAiB,OAAS,SAAUA,GAASA,EAAM,OAAS,QASxDF,EAAkB,CACtBF,EACAc,EACAlB,EACAC,EACAC,IAKAiB,EACEC,EACEhB,EACAiB,EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAWApB,EAAO,IAAI,IAAMoB,EAAI,KAAMC,EAAK,CAAC,CAAC,EAAE,KAAK,GAAG,EAC5CrB,EAAO,IAAKsB,GAAMF,EAAI,KAAM,EAAW,UAAUE,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,EACnEtB,EACG,IAAKsB,GAAMF,EAAI,KAAM,EAAW,UAAUE,EAAE,UAAY,CAAC,CAAC,CAAC,CAAC,EAC5D,KAAK,GAAG,EACXtB,EAAO,IAAI,IAAM,KAAK,EAAE,KAAK,GAAG,EAChCA,EAAO,IAAKsB,GAAMF,EAAI,KAAME,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,EAC7CL,EACAlB,EACAE,GAAS,uBAAyB,OAClCA,GAAS,WAAasB,CACxB,CACF,CACF","names":["uuid","appendEventsSQL","rawSQL","streamsTable","eventsTable","appendToStream","pool","streamName","streamType","events","options","executeInTransaction","client","appendResult","appendEventsRaw","toExpectedVersion","error","isOptimisticConcurrencyError","success","next_stream_position","last_global_position","transaction_id","expected","n","a","s","streamId","single","executeSQL","sql","uuid","e","defaultTag"]}
|
|
@@ -1,2 +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
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
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 _chunkN4I2XRJVjs = require('./chunk-N4I2XRJV.js');var _chunkGQQPVQW3js = require('./chunk-GQQPVQW3.js');var _chunkTMR7LHTXjs = require('./chunk-TMR7LHTX.js');var _chunkIZW7N6BPjs = require('./chunk-IZW7N6BP.js');require('pg');var w=t=>{let e=_chunkN4I2XRJVjs.b.call(void 0, t);return{async aggregateStream(n,r){await e;let{evolve:i,initialState:s,read:p}=r,S=_optionalChain([p, 'optionalAccess', _ => _.expectedStreamVersion]),a=s(),m=await this.readStream(n,r.read);if(m===null)return null;let E=m.currentStreamVersion;f(E,S);for(let u of m.events)u&&(a=i(a,u));return{currentStreamVersion:E,state:a}},readStream:async(n,r)=>(await e,_chunkTMR7LHTXjs.a.call(void 0, t,n,r)),appendToStream:async(n,r,i)=>{await e;let[s,...p]=n.split("-"),S=s&&p.length>0?s:"emt:unknown",a=await _chunkGQQPVQW3js.b.call(void 0, t,n,S,r,i);if(!a.success)throw new (0, _chunkIZW7N6BPjs.f)(-1n,_nullishCoalesce(_optionalChain([i, 'optionalAccess', _2 => _2.expectedStreamVersion]), () => (_chunkIZW7N6BPjs.e)));return{nextExpectedStreamVersion:a.nextStreamPosition}}}},T=(t,e)=>e===_chunkIZW7N6BPjs.e?!0:e==_chunkIZW7N6BPjs.d?t===void 0:e==_chunkIZW7N6BPjs.c?t!==void 0:t===e,f=(t,e)=>{if(e??=_chunkIZW7N6BPjs.e,!T(t,e))throw new (0, _chunkIZW7N6BPjs.f)(t,e)};exports.a = w;
|
|
2
|
+
//# sourceMappingURL=chunk-GB5VCDBF.js.map
|
|
@@ -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 _chunk4ZQCCOS3js = require('./chunk-4ZQCCOS3.js');var _chunkIZW7N6BPjs = require('./chunk-IZW7N6BP.js');require('pg');var _uuid = require('uuid');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 _chunk4ZQCCOS3js = require('./chunk-4ZQCCOS3.js');var _chunkIZW7N6BPjs = require('./chunk-IZW7N6BP.js');require('pg');var _uuid = require('uuid');var P=_chunk4ZQCCOS3js.f.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
|
+
`),w= exports.b =(t,_,o,e,s)=>_chunkIZW7N6BPjs.h.call(void 0, t,async n=>{if(e.length===0)return{success:!1,result:{success:!1}};let r;try{r=await I(n,_,o,e,{expectedStreamVersion:b(_optionalChain([s, 'optionalAccess', _2 => _2.expectedStreamVersion]))})}catch(E){if(!f(E))throw E;r={success:!1,last_global_position:null,next_stream_position:null,transaction_id:null}}let{success:v,next_stream_position:l,last_global_position:m,transaction_id:d}=r;return{success:v,result:v&&l&&m&&d?{success:!0,nextStreamPosition:BigInt(l),lastGlobalPosition:BigInt(m),transactionId:d}:{success:!1}}}),b=t=>t===void 0||t===_chunkIZW7N6BPjs.e||t==_chunkIZW7N6BPjs.d||t==_chunkIZW7N6BPjs.c?null:t,f=t=>t instanceof Error&&"code"in t&&t.code==="23505",I=(t,_,o,e,s)=>_chunkIZW7N6BPjs.o.call(void 0, _chunkIZW7N6BPjs.i.call(void 0, t,_chunk4ZQCCOS3js.e.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
|
+
)`,e.map(()=>_chunk4ZQCCOS3js.e.call(void 0, "%L",_uuid.v4.call(void 0, ))).join(","),e.map(n=>_chunk4ZQCCOS3js.e.call(void 0, "%L",_chunkIZW7N6BPjs.a.stringify(n.data))).join(","),e.map(n=>_chunk4ZQCCOS3js.e.call(void 0, "%L",_chunkIZW7N6BPjs.a.stringify(_nullishCoalesce(n.metadata, () => ({}))))).join(","),e.map(()=>"'1'").join(","),e.map(n=>_chunk4ZQCCOS3js.e.call(void 0, "%L",n.type)).join(","),_,o,_nullishCoalesce(_optionalChain([s, 'optionalAccess', _3 => _3.expectedStreamVersion]), () => ("NULL")),_nullishCoalesce(_optionalChain([s, 'optionalAccess', _4 => _4.partition]), () => (_chunkSS2LQM3Bjs.c)))));exports.a = P; exports.b = w;
|
|
94
|
+
//# sourceMappingURL=chunk-GQQPVQW3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventStore/schema/appendToStream.ts"],"names":["uuid","appendEventsSQL","rawSQL","streamsTable","eventsTable","appendToStream","pool","streamName","streamType","events","options","executeInTransaction","client","appendResult","appendEventsRaw","toExpectedVersion","error","isOptimisticConcurrencyError","success","next_stream_position","last_global_position","transaction_id","expected","n","a","s","streamId","single","executeSQL","sql","e","defaultTag"],"mappings":"kLASA,MAAe,KACf,OAAS,MAAMA,MAAY,OAKpB,IAAMC,EAAkBC,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA0BeC,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAsBVC,EAAY,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAchBD,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKtBA,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBpC,EAWaE,EAAiB,CAC5BC,EACAC,EACAC,EACAC,EACAC,IAIAC,EAAwCL,EAAM,MAAOM,GAAW,CAC9D,GAAIH,EAAO,SAAW,EACpB,MAAO,CAAE,QAAS,GAAO,OAAQ,CAAE,QAAS,EAAM,CAAE,EAEtD,IAAII,EAEJ,GAAI,CACFA,EAAe,MAAMC,EACnBF,EACAL,EACAC,EACAC,EACA,CACE,sBAAuBM,EACrBL,GAAS,qBACX,CACF,CACF,CACF,OAASM,EAAO,CACd,GAAI,CAACC,EAA6BD,CAAK,EAAG,MAAMA,EAEhDH,EAAe,CACb,QAAS,GACT,qBAAsB,KACtB,qBAAsB,KACtB,eAAgB,IAClB,CACF,CAEA,GAAM,CACJ,QAAAK,EACA,qBAAAC,EACA,qBAAAC,EACA,eAAAC,CACF,EAAIR,EAEJ,MAAO,CACL,QAAAK,EACA,OACEA,GACAC,GACAC,GACAC,EACI,CACE,QAAS,GACT,mBAAoB,OAAOF,CAAoB,EAC/C,mBAAoB,OAAOC,CAAoB,EAC/C,cAAeC,CACjB,EACA,CAAE,QAAS,EAAM,CACzB,CACF,CAAC,EAEGN,EACJO,GAEIA,IAAa,QAEbA,IAAaC,GAGbD,GAAYE,GAGZF,GAAYG,EAAsB,KAE/BH,EAGHL,EAAgCD,GACpCA,aAAiB,OAAS,SAAUA,GAASA,EAAM,OAAS,QASxDF,EAAkB,CACtBF,EACAc,EACAlB,EACAC,EACAC,IAKAiB,EACEC,EACEhB,EACAiB,EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAWApB,EAAO,IAAI,IAAMoB,EAAI,KAAM7B,EAAK,CAAC,CAAC,EAAE,KAAK,GAAG,EAC5CS,EAAO,IAAKqB,GAAMD,EAAI,KAAM,EAAW,UAAUC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,EACnErB,EACG,IAAKqB,GAAMD,EAAI,KAAM,EAAW,UAAUC,EAAE,UAAY,CAAC,CAAC,CAAC,CAAC,EAC5D,KAAK,GAAG,EACXrB,EAAO,IAAI,IAAM,KAAK,EAAE,KAAK,GAAG,EAChCA,EAAO,IAAKqB,GAAMD,EAAI,KAAMC,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,EAC7CJ,EACAlB,EACAE,GAAS,uBAAyB,OAClCA,GAAS,WAAaqB,CACxB,CACF,CACF","sourcesContent":["import {\n JSONParser,\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n type AppendToStreamOptions,\n type Event,\n type ExpectedStreamVersion,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { executeInTransaction, executeSQL, single } from '../../execute';\nimport { rawSQL, sql } from '../../sql';\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 },\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 appendResult = await appendEventsRaw(\n client,\n streamName,\n streamType,\n events,\n {\n expectedStreamVersion: toExpectedVersion(\n options?.expectedStreamVersion,\n ),\n },\n );\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: Event[],\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(() => sql('%L', uuid())).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"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as e}from"./chunk-5U7HYDY6.mjs";import{a as o,b as r,c as a,d as n,e as d,f as m,g as p,h as s,i,j as S,k as l}from"./chunk-DRZRZGSJ.mjs";import{k as t}from"./chunk-MLVVMWHF.mjs";import"pg";var Q=[o,r,a,n,d,m,p,s,i,S,e,l],v=L=>t(L,...Q);export{Q as a,v as b};
|
|
2
|
+
//# sourceMappingURL=chunk-HZQ46ED2.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkGQQPVQW3js = require('./chunk-GQQPVQW3.js');var _chunkZ67RDRQWjs = require('./chunk-Z67RDRQW.js');var _chunkIZW7N6BPjs = require('./chunk-IZW7N6BP.js');require('pg');var Q=[_chunkZ67RDRQWjs.a,_chunkZ67RDRQWjs.b,_chunkZ67RDRQWjs.c,_chunkZ67RDRQWjs.d,_chunkZ67RDRQWjs.e,_chunkZ67RDRQWjs.f,_chunkZ67RDRQWjs.g,_chunkZ67RDRQWjs.h,_chunkZ67RDRQWjs.i,_chunkZ67RDRQWjs.j,_chunkGQQPVQW3js.a,_chunkZ67RDRQWjs.k],v= exports.b =L=>_chunkIZW7N6BPjs.k.call(void 0, L,...Q);exports.a = Q; exports.b = v;
|
|
2
|
+
//# sourceMappingURL=chunk-N4I2XRJV.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as v}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{b as v}from"./chunk-HZQ46ED2.mjs";import{b as g}from"./chunk-5U7HYDY6.mjs";import{a as y}from"./chunk-7K6TUMXZ.mjs";import{c,d as l,e as o,f as d}from"./chunk-MLVVMWHF.mjs";import"pg";var w=t=>{let e=v(t);return{async aggregateStream(n,r){await e;let{evolve:i,initialState:s,read:p}=r,S=p?.expectedStreamVersion,a=s(),m=await this.readStream(n,r.read);if(m===null)return null;let E=m.currentStreamVersion;f(E,S);for(let u of m.events)u&&(a=i(a,u));return{currentStreamVersion:E,state:a}},readStream:async(n,r)=>(await e,y(t,n,r)),appendToStream:async(n,r,i)=>{await e;let[s,...p]=n.split("-"),S=s&&p.length>0?s:"emt:unknown",a=await g(t,n,S,r,i);if(!a.success)throw new d(-1n,i?.expectedStreamVersion??o);return{nextExpectedStreamVersion:a.nextStreamPosition}}}},T=(t,e)=>e===o?!0:e==l?t===void 0:e==c?t!==void 0:t===e,f=(t,e)=>{if(e??=o,!T(t,e))throw new d(t,e)};export{w as a};
|
|
2
|
+
//# sourceMappingURL=chunk-YCS26XB2.mjs.map
|
package/dist/eventStore/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-MERDQHBQ.js');var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-MERDQHBQ.js');var _chunkGB5VCDBFjs = require('../chunk-GB5VCDBF.js');var _chunkN4I2XRJVjs = require('../chunk-N4I2XRJV.js');var _chunkGQQPVQW3js = require('../chunk-GQQPVQW3.js');var _chunkTMR7LHTXjs = require('../chunk-TMR7LHTX.js');var _chunkZ67RDRQWjs = require('../chunk-Z67RDRQW.js');var _chunkSS2LQM3Bjs = require('../chunk-SS2LQM3B.js');require('../chunk-4ZQCCOS3.js');require('../chunk-IZW7N6BP.js');exports.addDefaultPartition = _chunkZ67RDRQWjs.k; exports.addEventsPartitions = _chunkZ67RDRQWjs.f; exports.addModuleForAllTenantsSQL = _chunkZ67RDRQWjs.i; exports.addModuleSQL = _chunkZ67RDRQWjs.g; exports.addTablePartitions = _chunkZ67RDRQWjs.e; exports.addTenantForAllModulesSQL = _chunkZ67RDRQWjs.j; exports.addTenantSQL = _chunkZ67RDRQWjs.h; exports.appendEventsSQL = _chunkGQQPVQW3js.a; exports.appendToStream = _chunkGQQPVQW3js.b; exports.createEventStoreSchema = _chunkN4I2XRJVjs.b; exports.defaultTag = _chunkSS2LQM3Bjs.c; exports.emmettPrefix = _chunkSS2LQM3Bjs.a; exports.eventsTable = _chunkSS2LQM3Bjs.f; exports.eventsTableSQL = _chunkZ67RDRQWjs.b; exports.getPostgreSQLEventStore = _chunkGB5VCDBFjs.a; exports.globalNames = _chunkSS2LQM3Bjs.d; exports.globalTag = _chunkSS2LQM3Bjs.b; exports.readStream = _chunkTMR7LHTXjs.a; exports.sanitizeNameSQL = _chunkZ67RDRQWjs.d; exports.schemaSQL = _chunkN4I2XRJVjs.a; exports.streamsTable = _chunkSS2LQM3Bjs.e; exports.streamsTableSQL = _chunkZ67RDRQWjs.a; exports.subscriptionsTableSQL = _chunkZ67RDRQWjs.c;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-HIATDE4Q.mjs";import{a as w}from"../chunk-
|
|
1
|
+
import"../chunk-HIATDE4Q.mjs";import{a as w}from"../chunk-YCS26XB2.mjs";import{a as u,b as v}from"../chunk-HZQ46ED2.mjs";import{a as g,b as h}from"../chunk-5U7HYDY6.mjs";import{a as t}from"../chunk-7K6TUMXZ.mjs";import{a as i,b as j,c as k,d as l,e as m,f as n,g as o,h as p,i as q,j as r,k as s}from"../chunk-DRZRZGSJ.mjs";import{a,b,c,d,e,f}from"../chunk-ABNBEUC6.mjs";import"../chunk-FYXDBZNT.mjs";import"../chunk-MLVVMWHF.mjs";export{s as addDefaultPartition,n as addEventsPartitions,q as addModuleForAllTenantsSQL,o as addModuleSQL,m as addTablePartitions,r as addTenantForAllModulesSQL,p as addTenantSQL,g as appendEventsSQL,h as appendToStream,v as createEventStoreSchema,c as defaultTag,a as emmettPrefix,f as eventsTable,j as eventsTableSQL,w as getPostgreSQLEventStore,d as globalNames,b as globalTag,t as readStream,l as sanitizeNameSQL,u as schemaSQL,e as streamsTable,i as streamsTableSQL,k as subscriptionsTableSQL};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkGB5VCDBFjs = require('../chunk-GB5VCDBF.js');require('../chunk-N4I2XRJV.js');require('../chunk-GQQPVQW3.js');require('../chunk-TMR7LHTX.js');require('../chunk-Z67RDRQW.js');require('../chunk-SS2LQM3B.js');require('../chunk-4ZQCCOS3.js');require('../chunk-IZW7N6BP.js');exports.getPostgreSQLEventStore = _chunkGB5VCDBFjs.a;
|
|
2
2
|
//# sourceMappingURL=postgreSQLEventStore.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a}from"../chunk-
|
|
1
|
+
import{a}from"../chunk-YCS26XB2.mjs";import"../chunk-HZQ46ED2.mjs";import"../chunk-5U7HYDY6.mjs";import"../chunk-7K6TUMXZ.mjs";import"../chunk-DRZRZGSJ.mjs";import"../chunk-ABNBEUC6.mjs";import"../chunk-FYXDBZNT.mjs";import"../chunk-MLVVMWHF.mjs";export{a as getPostgreSQLEventStore};
|
|
2
2
|
//# sourceMappingURL=postgreSQLEventStore.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkGQQPVQW3js = require('../../chunk-GQQPVQW3.js');require('../../chunk-SS2LQM3B.js');require('../../chunk-4ZQCCOS3.js');require('../../chunk-IZW7N6BP.js');exports.appendEventsSQL = _chunkGQQPVQW3js.a; exports.appendToStream = _chunkGQQPVQW3js.b;
|
|
2
2
|
//# sourceMappingURL=appendToStream.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b}from"../../chunk-
|
|
1
|
+
import{a,b}from"../../chunk-5U7HYDY6.mjs";import"../../chunk-ABNBEUC6.mjs";import"../../chunk-FYXDBZNT.mjs";import"../../chunk-MLVVMWHF.mjs";export{a as appendEventsSQL,b as appendToStream};
|
|
2
2
|
//# sourceMappingURL=appendToStream.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkN4I2XRJVjs = require('../../chunk-N4I2XRJV.js');var _chunkGQQPVQW3js = require('../../chunk-GQQPVQW3.js');var _chunkTMR7LHTXjs = require('../../chunk-TMR7LHTX.js');var _chunkZ67RDRQWjs = require('../../chunk-Z67RDRQW.js');var _chunkSS2LQM3Bjs = require('../../chunk-SS2LQM3B.js');require('../../chunk-4ZQCCOS3.js');require('../../chunk-IZW7N6BP.js');exports.addDefaultPartition = _chunkZ67RDRQWjs.k; exports.addEventsPartitions = _chunkZ67RDRQWjs.f; exports.addModuleForAllTenantsSQL = _chunkZ67RDRQWjs.i; exports.addModuleSQL = _chunkZ67RDRQWjs.g; exports.addTablePartitions = _chunkZ67RDRQWjs.e; exports.addTenantForAllModulesSQL = _chunkZ67RDRQWjs.j; exports.addTenantSQL = _chunkZ67RDRQWjs.h; exports.appendEventsSQL = _chunkGQQPVQW3js.a; exports.appendToStream = _chunkGQQPVQW3js.b; exports.createEventStoreSchema = _chunkN4I2XRJVjs.b; exports.defaultTag = _chunkSS2LQM3Bjs.c; exports.emmettPrefix = _chunkSS2LQM3Bjs.a; exports.eventsTable = _chunkSS2LQM3Bjs.f; exports.eventsTableSQL = _chunkZ67RDRQWjs.b; exports.globalNames = _chunkSS2LQM3Bjs.d; exports.globalTag = _chunkSS2LQM3Bjs.b; exports.readStream = _chunkTMR7LHTXjs.a; exports.sanitizeNameSQL = _chunkZ67RDRQWjs.d; exports.schemaSQL = _chunkN4I2XRJVjs.a; exports.streamsTable = _chunkSS2LQM3Bjs.e; exports.streamsTableSQL = _chunkZ67RDRQWjs.a; exports.subscriptionsTableSQL = _chunkZ67RDRQWjs.c;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u,b as v}from"../../chunk-
|
|
1
|
+
import{a as u,b as v}from"../../chunk-HZQ46ED2.mjs";import{a as g,b as h}from"../../chunk-5U7HYDY6.mjs";import{a as t}from"../../chunk-7K6TUMXZ.mjs";import{a as i,b as j,c as k,d as l,e as m,f as n,g as o,h as p,i as q,j as r,k as s}from"../../chunk-DRZRZGSJ.mjs";import{a,b,c,d,e,f}from"../../chunk-ABNBEUC6.mjs";import"../../chunk-FYXDBZNT.mjs";import"../../chunk-MLVVMWHF.mjs";export{s as addDefaultPartition,n as addEventsPartitions,q as addModuleForAllTenantsSQL,o as addModuleSQL,m as addTablePartitions,r as addTenantForAllModulesSQL,p as addTenantSQL,g as appendEventsSQL,h as appendToStream,v as createEventStoreSchema,c as defaultTag,a as emmettPrefix,f as eventsTable,j as eventsTableSQL,d as globalNames,b as globalTag,t as readStream,l as sanitizeNameSQL,u as schemaSQL,e as streamsTable,i as streamsTableSQL,k as subscriptionsTableSQL};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-HUB7W7J3.js');var _chunkC6E7NEXUjs = require('./chunk-C6E7NEXU.js');var _chunkVP4QNFWTjs = require('./chunk-VP4QNFWT.js');require('./chunk-MERDQHBQ.js');var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-HUB7W7J3.js');var _chunkC6E7NEXUjs = require('./chunk-C6E7NEXU.js');var _chunkVP4QNFWTjs = require('./chunk-VP4QNFWT.js');require('./chunk-MERDQHBQ.js');var _chunkGB5VCDBFjs = require('./chunk-GB5VCDBF.js');var _chunkN4I2XRJVjs = require('./chunk-N4I2XRJV.js');var _chunkGQQPVQW3js = require('./chunk-GQQPVQW3.js');var _chunkTMR7LHTXjs = require('./chunk-TMR7LHTX.js');var _chunkZ67RDRQWjs = require('./chunk-Z67RDRQW.js');var _chunkSS2LQM3Bjs = require('./chunk-SS2LQM3B.js');var _chunk4ZQCCOS3js = require('./chunk-4ZQCCOS3.js');var _chunkIZW7N6BPjs = require('./chunk-IZW7N6BP.js');exports.addDefaultPartition = _chunkZ67RDRQWjs.k; exports.addEventsPartitions = _chunkZ67RDRQWjs.f; exports.addModuleForAllTenantsSQL = _chunkZ67RDRQWjs.i; exports.addModuleSQL = _chunkZ67RDRQWjs.g; exports.addTablePartitions = _chunkZ67RDRQWjs.e; exports.addTenantForAllModulesSQL = _chunkZ67RDRQWjs.j; exports.addTenantSQL = _chunkZ67RDRQWjs.h; exports.appendEventsSQL = _chunkGQQPVQW3js.a; exports.appendToStream = _chunkGQQPVQW3js.b; exports.createEventStoreSchema = _chunkN4I2XRJVjs.b; exports.defaultTag = _chunkSS2LQM3Bjs.c; exports.emmettPrefix = _chunkSS2LQM3Bjs.a; exports.endAllPools = _chunkVP4QNFWTjs.c; exports.endPool = _chunkVP4QNFWTjs.b; exports.eventsTable = _chunkSS2LQM3Bjs.f; exports.eventsTableSQL = _chunkZ67RDRQWjs.b; exports.execute = _chunkIZW7N6BPjs.g; exports.executeInTransaction = _chunkIZW7N6BPjs.h; exports.executeSQL = _chunkIZW7N6BPjs.i; exports.executeSQLBatchInTransaction = _chunkIZW7N6BPjs.k; exports.executeSQLInTransaction = _chunkIZW7N6BPjs.j; exports.exists = _chunkIZW7N6BPjs.q; exports.first = _chunkIZW7N6BPjs.m; exports.firstOrNull = _chunkIZW7N6BPjs.l; exports.functionExists = _chunk4ZQCCOS3js.d; exports.functionExistsSQL = _chunk4ZQCCOS3js.c; exports.getPool = _chunkVP4QNFWTjs.a; exports.getPostgreSQLEventStore = _chunkGB5VCDBFjs.a; exports.globalNames = _chunkSS2LQM3Bjs.d; exports.globalTag = _chunkSS2LQM3Bjs.b; exports.mapRow = _chunkIZW7N6BPjs.p; exports.postgresClient = _chunkC6E7NEXUjs.a; exports.rawSQL = _chunk4ZQCCOS3js.f; exports.readStream = _chunkTMR7LHTXjs.a; exports.sanitizeNameSQL = _chunkZ67RDRQWjs.d; exports.schemaSQL = _chunkN4I2XRJVjs.a; exports.single = _chunkIZW7N6BPjs.o; exports.singleOrNull = _chunkIZW7N6BPjs.n; exports.sql = _chunk4ZQCCOS3js.e; exports.streamsTable = _chunkSS2LQM3Bjs.e; exports.streamsTableSQL = _chunkZ67RDRQWjs.a; exports.subscriptionsTableSQL = _chunkZ67RDRQWjs.c; exports.tableExists = _chunk4ZQCCOS3js.b; exports.tableExistsSQL = _chunk4ZQCCOS3js.a;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-GR4YFDV5.mjs";import{a as f}from"./chunk-QQC5YC26.mjs";import{a as o,b as r,c as e}from"./chunk-IX2XL3S5.mjs";import"./chunk-HIATDE4Q.mjs";import{a as R}from"./chunk-
|
|
1
|
+
import"./chunk-GR4YFDV5.mjs";import{a as f}from"./chunk-QQC5YC26.mjs";import{a as o,b as r,c as e}from"./chunk-IX2XL3S5.mjs";import"./chunk-HIATDE4Q.mjs";import{a as R}from"./chunk-YCS26XB2.mjs";import{a as P,b as Q}from"./chunk-HZQ46ED2.mjs";import{a as B,b as C}from"./chunk-5U7HYDY6.mjs";import{a as O}from"./chunk-7K6TUMXZ.mjs";import{a as D,b as E,c as F,d as G,e as H,f as I,g as J,h as K,i as L,j as M,k as N}from"./chunk-DRZRZGSJ.mjs";import{a as u,b as v,c as w,d as y,e as z,f as A}from"./chunk-ABNBEUC6.mjs";import{a as j,b as k,c as l,d as n,e as q,f as s}from"./chunk-FYXDBZNT.mjs";import{g as m,h as p,i as t,j as x,k as a,l as b,m as c,n as d,o as g,p as h,q as i}from"./chunk-MLVVMWHF.mjs";export{N as addDefaultPartition,I as addEventsPartitions,L as addModuleForAllTenantsSQL,J as addModuleSQL,H as addTablePartitions,M as addTenantForAllModulesSQL,K as addTenantSQL,B as appendEventsSQL,C as appendToStream,Q as createEventStoreSchema,w as defaultTag,u as emmettPrefix,e as endAllPools,r as endPool,A as eventsTable,E as eventsTableSQL,m as execute,p as executeInTransaction,t as executeSQL,a as executeSQLBatchInTransaction,x as executeSQLInTransaction,i as exists,c as first,b as firstOrNull,n as functionExists,l as functionExistsSQL,o as getPool,R as getPostgreSQLEventStore,y as globalNames,v as globalTag,h as mapRow,f as postgresClient,s as rawSQL,O as readStream,G as sanitizeNameSQL,P as schemaSQL,g as single,d as singleOrNull,q as sql,z as streamsTable,D as streamsTableSQL,F as subscriptionsTableSQL,k as tableExists,j as tableExistsSQL};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@event-driven-io/emmett-postgresql",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "Emmett - PostgreSQL - Event Sourcing development made simple",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsup",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"@event-driven-io/emmett-testcontainers": "^0.5.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"@event-driven-io/emmett": "0.12.
|
|
55
|
+
"@event-driven-io/emmett": "0.12.1",
|
|
56
56
|
"@types/pg": "^8.11.6",
|
|
57
57
|
"@types/pg-format": "^1.0.5",
|
|
58
58
|
"pg": "^8.12.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/eventStore/schema/appendToStream.ts"],"sourcesContent":["import {\n JSONParser,\n type AppendToStreamOptions,\n type Event,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { executeInTransaction, executeSQL, single } from '../../execute';\nimport { rawSQL, sql } from '../../sql';\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 },\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 appendResult = await appendEventsRaw(\n client,\n streamName,\n streamType,\n events,\n options,\n );\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 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: Event[],\n options?: AppendToStreamOptions & {\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(() => sql('%L', uuid())).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":"qKAKA,MAAe,KACf,OAAS,MAAMA,MAAY,OAKpB,IAAMC,EAAkBC,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA0BeC,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAsBVC,EAAY,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAchBD,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKtBA,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBpC,EAWaE,EAAiB,CAC5BC,EACAC,EACAC,EACAC,EACAC,IAIAC,EAAwCL,EAAM,MAAOM,GAAW,CAC9D,GAAIH,EAAO,SAAW,EACpB,MAAO,CAAE,QAAS,GAAO,OAAQ,CAAE,QAAS,EAAM,CAAE,EAEtD,IAAII,EAEJ,GAAI,CACFA,EAAe,MAAMC,EACnBF,EACAL,EACAC,EACAC,EACAC,CACF,CACF,OAASK,EAAO,CACd,GAAI,CAACC,EAA6BD,CAAK,EAAG,MAAMA,EAEhDF,EAAe,CACb,QAAS,GACT,qBAAsB,KACtB,qBAAsB,KACtB,eAAgB,IAClB,CACF,CAEA,GAAM,CACJ,QAAAI,EACA,qBAAAC,EACA,qBAAAC,EACA,eAAAC,CACF,EAAIP,EAEJ,MAAO,CACL,QAAAI,EACA,OACEA,GACAC,GACAC,GACAC,EACI,CACE,QAAS,GACT,mBAAoB,OAAOF,CAAoB,EAC/C,mBAAoB,OAAOC,CAAoB,EAC/C,cAAeC,CACjB,EACA,CAAE,QAAS,EAAM,CACzB,CACF,CAAC,EAEGJ,EAAgCD,GACpCA,aAAiB,OAAS,SAAUA,GAASA,EAAM,OAAS,QASxDD,EAAkB,CACtBF,EACAS,EACAb,EACAC,EACAC,IAIAY,EACEC,EACEX,EACAY,EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAWAf,EAAO,IAAI,IAAMe,EAAI,KAAMC,EAAK,CAAC,CAAC,EAAE,KAAK,GAAG,EAC5ChB,EAAO,IAAKiB,GAAMF,EAAI,KAAM,EAAW,UAAUE,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,EACnEjB,EACG,IAAKiB,GAAMF,EAAI,KAAM,EAAW,UAAUE,EAAE,UAAY,CAAC,CAAC,CAAC,CAAC,EAC5D,KAAK,GAAG,EACXjB,EAAO,IAAI,IAAM,KAAK,EAAE,KAAK,GAAG,EAChCA,EAAO,IAAKiB,GAAMF,EAAI,KAAME,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,EAC7CL,EACAb,EACAE,GAAS,uBAAyB,OAClCA,GAAS,WAAaiB,CACxB,CACF,CACF","names":["uuid","appendEventsSQL","rawSQL","streamsTable","eventsTable","appendToStream","pool","streamName","streamType","events","options","executeInTransaction","client","appendResult","appendEventsRaw","error","isOptimisticConcurrencyError","success","next_stream_position","last_global_position","transaction_id","streamId","single","executeSQL","sql","uuid","e","defaultTag"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/eventStore/schema/appendToStream.ts"],"names":["uuid","appendEventsSQL","rawSQL","streamsTable","eventsTable","appendToStream","pool","streamName","streamType","events","options","executeInTransaction","client","appendResult","appendEventsRaw","error","isOptimisticConcurrencyError","success","next_stream_position","last_global_position","transaction_id","streamId","single","executeSQL","sql","e","defaultTag"],"mappings":"kKAKA,MAAe,KACf,OAAS,MAAMA,MAAY,OAKpB,IAAMC,EAAkBC,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA0BeC,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAsBVC,EAAY,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAchBD,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKtBA,EAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBpC,EAWaE,EAAiB,CAC5BC,EACAC,EACAC,EACAC,EACAC,IAIAC,EAAwCL,EAAM,MAAOM,GAAW,CAC9D,GAAIH,EAAO,SAAW,EACpB,MAAO,CAAE,QAAS,GAAO,OAAQ,CAAE,QAAS,EAAM,CAAE,EAEtD,IAAII,EAEJ,GAAI,CACFA,EAAe,MAAMC,EACnBF,EACAL,EACAC,EACAC,EACAC,CACF,CACF,OAASK,EAAO,CACd,GAAI,CAACC,EAA6BD,CAAK,EAAG,MAAMA,EAEhDF,EAAe,CACb,QAAS,GACT,qBAAsB,KACtB,qBAAsB,KACtB,eAAgB,IAClB,CACF,CAEA,GAAM,CACJ,QAAAI,EACA,qBAAAC,EACA,qBAAAC,EACA,eAAAC,CACF,EAAIP,EAEJ,MAAO,CACL,QAAAI,EACA,OACEA,GACAC,GACAC,GACAC,EACI,CACE,QAAS,GACT,mBAAoB,OAAOF,CAAoB,EAC/C,mBAAoB,OAAOC,CAAoB,EAC/C,cAAeC,CACjB,EACA,CAAE,QAAS,EAAM,CACzB,CACF,CAAC,EAEGJ,EAAgCD,GACpCA,aAAiB,OAAS,SAAUA,GAASA,EAAM,OAAS,QASxDD,EAAkB,CACtBF,EACAS,EACAb,EACAC,EACAC,IAIAY,EACEC,EACEX,EACAY,EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAWAf,EAAO,IAAI,IAAMe,EAAI,KAAMxB,EAAK,CAAC,CAAC,EAAE,KAAK,GAAG,EAC5CS,EAAO,IAAKgB,GAAMD,EAAI,KAAM,EAAW,UAAUC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,EACnEhB,EACG,IAAKgB,GAAMD,EAAI,KAAM,EAAW,UAAUC,EAAE,UAAY,CAAC,CAAC,CAAC,CAAC,EAC5D,KAAK,GAAG,EACXhB,EAAO,IAAI,IAAM,KAAK,EAAE,KAAK,GAAG,EAChCA,EAAO,IAAKgB,GAAMD,EAAI,KAAMC,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,EAC7CJ,EACAb,EACAE,GAAS,uBAAyB,OAClCA,GAAS,WAAagB,CACxB,CACF,CACF","sourcesContent":["import {\n JSONParser,\n type AppendToStreamOptions,\n type Event,\n} from '@event-driven-io/emmett';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { executeInTransaction, executeSQL, single } from '../../execute';\nimport { rawSQL, sql } from '../../sql';\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 },\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 appendResult = await appendEventsRaw(\n client,\n streamName,\n streamType,\n events,\n options,\n );\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 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: Event[],\n options?: AppendToStreamOptions & {\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(() => sql('%L', uuid())).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"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|