@event-driven-io/emmett-postgresql 0.31.0 → 0.32.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/index.cjs +196 -138
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -15
- package/dist/index.d.ts +16 -15
- package/dist/index.js +201 -143
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -318,8 +318,8 @@ var streamTransformations = {
|
|
|
318
318
|
};
|
|
319
319
|
var { retry: retry2 } = streamTransformations;
|
|
320
320
|
var AssertionError = class extends Error {
|
|
321
|
-
constructor(
|
|
322
|
-
super(
|
|
321
|
+
constructor(message2) {
|
|
322
|
+
super(message2);
|
|
323
323
|
}
|
|
324
324
|
};
|
|
325
325
|
var isSubset = (superObj, subObj) => {
|
|
@@ -334,37 +334,37 @@ var isSubset = (superObj, subObj) => {
|
|
|
334
334
|
return sub[ele] === sup[ele];
|
|
335
335
|
});
|
|
336
336
|
};
|
|
337
|
-
var assertFails = (
|
|
338
|
-
throw new AssertionError(_nullishCoalesce(
|
|
337
|
+
var assertFails = (message2) => {
|
|
338
|
+
throw new AssertionError(_nullishCoalesce(message2, () => ( "That should not ever happened, right?")));
|
|
339
339
|
};
|
|
340
|
-
var assertDeepEqual = (actual, expected,
|
|
340
|
+
var assertDeepEqual = (actual, expected, message2) => {
|
|
341
341
|
if (!deepEquals(actual, expected))
|
|
342
342
|
throw new AssertionError(
|
|
343
|
-
_nullishCoalesce(
|
|
343
|
+
_nullishCoalesce(message2, () => ( `subObj:
|
|
344
344
|
${JSONParser.stringify(expected)}
|
|
345
345
|
is not equal to
|
|
346
346
|
${JSONParser.stringify(actual)}`))
|
|
347
347
|
);
|
|
348
348
|
};
|
|
349
|
-
function assertTrue(condition,
|
|
349
|
+
function assertTrue(condition, message2) {
|
|
350
350
|
if (condition !== true)
|
|
351
|
-
throw new AssertionError(_nullishCoalesce(
|
|
351
|
+
throw new AssertionError(_nullishCoalesce(message2, () => ( `Condition is false`)));
|
|
352
352
|
}
|
|
353
|
-
function assertOk(obj,
|
|
354
|
-
if (!obj) throw new AssertionError(_nullishCoalesce(
|
|
353
|
+
function assertOk(obj, message2) {
|
|
354
|
+
if (!obj) throw new AssertionError(_nullishCoalesce(message2, () => ( `Condition is not truthy`)));
|
|
355
355
|
}
|
|
356
|
-
function assertEqual(expected, actual,
|
|
356
|
+
function assertEqual(expected, actual, message2) {
|
|
357
357
|
if (expected !== actual)
|
|
358
358
|
throw new AssertionError(
|
|
359
|
-
`${_nullishCoalesce(
|
|
359
|
+
`${_nullishCoalesce(message2, () => ( "Objects are not equal"))}:
|
|
360
360
|
Expected: ${JSONParser.stringify(expected)}
|
|
361
361
|
Actual: ${JSONParser.stringify(actual)}`
|
|
362
362
|
);
|
|
363
363
|
}
|
|
364
|
-
function assertNotEqual(obj, other,
|
|
364
|
+
function assertNotEqual(obj, other, message2) {
|
|
365
365
|
if (obj === other)
|
|
366
366
|
throw new AssertionError(
|
|
367
|
-
_nullishCoalesce(
|
|
367
|
+
_nullishCoalesce(message2, () => ( `Objects are equal: ${JSONParser.stringify(obj)}`))
|
|
368
368
|
);
|
|
369
369
|
}
|
|
370
370
|
function assertIsNotNull(result) {
|
|
@@ -463,8 +463,8 @@ var streamsTable = {
|
|
|
463
463
|
isArchived: columns.isArchived
|
|
464
464
|
}
|
|
465
465
|
};
|
|
466
|
-
var
|
|
467
|
-
name: `${emmettPrefix}
|
|
466
|
+
var messagesTable = {
|
|
467
|
+
name: `${emmettPrefix}_messages`,
|
|
468
468
|
columns: {
|
|
469
469
|
partition: columns.partition,
|
|
470
470
|
isArchived: columns.isArchived
|
|
@@ -480,7 +480,7 @@ var readLastMessageGlobalPosition = async (execute, options) => {
|
|
|
480
480
|
execute.query(
|
|
481
481
|
_dumbo.sql.call(void 0,
|
|
482
482
|
`SELECT global_position
|
|
483
|
-
FROM ${
|
|
483
|
+
FROM ${messagesTable.name}
|
|
484
484
|
WHERE partition = %L AND is_archived = FALSE AND transaction_id < pg_snapshot_xmin(pg_current_snapshot())
|
|
485
485
|
ORDER BY transaction_id, global_position
|
|
486
486
|
LIMIT 1`,
|
|
@@ -504,8 +504,8 @@ var readMessagesBatch = async (execute, options) => {
|
|
|
504
504
|
const events = await _dumbo.mapRows.call(void 0,
|
|
505
505
|
execute.query(
|
|
506
506
|
_dumbo.sql.call(void 0,
|
|
507
|
-
`SELECT stream_id, stream_position, global_position,
|
|
508
|
-
FROM ${
|
|
507
|
+
`SELECT stream_id, stream_position, global_position, message_data, message_metadata, message_schema_version, message_type, message_id
|
|
508
|
+
FROM ${messagesTable.name}
|
|
509
509
|
WHERE partition = %L AND is_archived = FALSE AND transaction_id < pg_snapshot_xmin(pg_current_snapshot()) ${fromCondition} ${toCondition}
|
|
510
510
|
ORDER BY transaction_id, global_position
|
|
511
511
|
${limitCondition}`,
|
|
@@ -514,19 +514,20 @@ var readMessagesBatch = async (execute, options) => {
|
|
|
514
514
|
),
|
|
515
515
|
(row) => {
|
|
516
516
|
const rawEvent = {
|
|
517
|
-
type: row.
|
|
518
|
-
data: row.
|
|
519
|
-
metadata: row.
|
|
517
|
+
type: row.message_type,
|
|
518
|
+
data: row.message_data,
|
|
519
|
+
metadata: row.message_metadata
|
|
520
520
|
};
|
|
521
521
|
const metadata = {
|
|
522
522
|
..."metadata" in rawEvent ? _nullishCoalesce(rawEvent.metadata, () => ( {})) : {},
|
|
523
|
-
|
|
523
|
+
messageId: row.message_id,
|
|
524
524
|
streamName: row.stream_id,
|
|
525
525
|
streamPosition: BigInt(row.stream_position),
|
|
526
526
|
globalPosition: BigInt(row.global_position)
|
|
527
527
|
};
|
|
528
528
|
return {
|
|
529
529
|
...rawEvent,
|
|
530
|
+
kind: "Event",
|
|
530
531
|
metadata
|
|
531
532
|
};
|
|
532
533
|
}
|
|
@@ -623,13 +624,14 @@ var zipPostgreSQLEventStoreMessageBatchPullerStartFrom = (options) => {
|
|
|
623
624
|
|
|
624
625
|
|
|
625
626
|
|
|
626
|
-
var
|
|
627
|
-
`CREATE OR REPLACE FUNCTION
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
627
|
+
var appendToStreamSQL = _dumbo.rawSql.call(void 0,
|
|
628
|
+
`CREATE OR REPLACE FUNCTION emt_append_to_stream(
|
|
629
|
+
v_message_ids text[],
|
|
630
|
+
v_messages_data jsonb[],
|
|
631
|
+
v_messages_metadata jsonb[],
|
|
632
|
+
v_message_schema_versions text[],
|
|
633
|
+
v_message_types text[],
|
|
634
|
+
v_message_kinds text[],
|
|
633
635
|
v_stream_id text,
|
|
634
636
|
v_stream_type text,
|
|
635
637
|
v_expected_stream_position bigint DEFAULT NULL,
|
|
@@ -648,42 +650,15 @@ var appendEventsSQL = _dumbo.rawSql.call(void 0,
|
|
|
648
650
|
v_transaction_id xid8;
|
|
649
651
|
v_last_global_position bigint;
|
|
650
652
|
BEGIN
|
|
653
|
+
v_transaction_id := pg_current_xact_id();
|
|
654
|
+
|
|
651
655
|
IF v_expected_stream_position IS NULL THEN
|
|
652
656
|
SELECT COALESCE(max(stream_position), 0) INTO v_expected_stream_position
|
|
653
657
|
FROM ${streamsTable.name}
|
|
654
658
|
WHERE stream_id = v_stream_id AND partition = v_partition;
|
|
655
659
|
END IF;
|
|
656
660
|
|
|
657
|
-
v_next_stream_position := v_expected_stream_position + array_upper(
|
|
658
|
-
v_transaction_id := pg_current_xact_id();
|
|
659
|
-
|
|
660
|
-
WITH ev AS (
|
|
661
|
-
SELECT row_number() OVER () + v_expected_stream_position AS stream_position,
|
|
662
|
-
event_data,
|
|
663
|
-
event_metadata,
|
|
664
|
-
schema_version,
|
|
665
|
-
event_id,
|
|
666
|
-
event_type
|
|
667
|
-
FROM (
|
|
668
|
-
SELECT *
|
|
669
|
-
FROM
|
|
670
|
-
unnest(v_event_ids, v_events_data, v_events_metadata, v_event_schema_versions, v_event_types)
|
|
671
|
-
AS event(event_id, event_data, event_metadata, schema_version, event_type)
|
|
672
|
-
) AS event
|
|
673
|
-
),
|
|
674
|
-
all_events_insert AS (
|
|
675
|
-
INSERT INTO ${eventsTable.name}
|
|
676
|
-
(stream_id, stream_position, partition, event_data, event_metadata, event_schema_version, event_type, event_id, transaction_id)
|
|
677
|
-
SELECT
|
|
678
|
-
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
|
|
679
|
-
FROM ev
|
|
680
|
-
RETURNING global_position
|
|
681
|
-
)
|
|
682
|
-
SELECT
|
|
683
|
-
max(global_position) INTO v_last_global_position
|
|
684
|
-
FROM
|
|
685
|
-
all_events_insert;
|
|
686
|
-
|
|
661
|
+
v_next_stream_position := v_expected_stream_position + array_upper(v_messages_data, 1);
|
|
687
662
|
|
|
688
663
|
IF v_expected_stream_position = 0 THEN
|
|
689
664
|
INSERT INTO ${streamsTable.name}
|
|
@@ -703,25 +678,54 @@ var appendEventsSQL = _dumbo.rawSql.call(void 0,
|
|
|
703
678
|
END IF;
|
|
704
679
|
END IF;
|
|
705
680
|
|
|
681
|
+
WITH ev AS (
|
|
682
|
+
SELECT row_number() OVER () + v_expected_stream_position AS stream_position,
|
|
683
|
+
message_data,
|
|
684
|
+
message_metadata,
|
|
685
|
+
schema_version,
|
|
686
|
+
message_id,
|
|
687
|
+
message_type,
|
|
688
|
+
message_kind
|
|
689
|
+
FROM (
|
|
690
|
+
SELECT *
|
|
691
|
+
FROM
|
|
692
|
+
unnest(v_message_ids, v_messages_data, v_messages_metadata, v_message_schema_versions, v_message_types, v_message_kinds)
|
|
693
|
+
AS message(message_id, message_data, message_metadata, schema_version, message_type, message_kind)
|
|
694
|
+
) AS message
|
|
695
|
+
),
|
|
696
|
+
all_messages_insert AS (
|
|
697
|
+
INSERT INTO ${messagesTable.name}
|
|
698
|
+
(stream_id, stream_position, partition, message_data, message_metadata, message_schema_version, message_type, message_kind, message_id, transaction_id)
|
|
699
|
+
SELECT
|
|
700
|
+
v_stream_id, ev.stream_position, v_partition, ev.message_data, ev.message_metadata, ev.schema_version, ev.message_type, ev.message_kind, ev.message_id, v_transaction_id
|
|
701
|
+
FROM ev
|
|
702
|
+
RETURNING global_position
|
|
703
|
+
)
|
|
704
|
+
SELECT
|
|
705
|
+
max(global_position) INTO v_last_global_position
|
|
706
|
+
FROM
|
|
707
|
+
all_messages_insert;
|
|
708
|
+
|
|
706
709
|
RETURN QUERY SELECT TRUE, v_next_stream_position, v_last_global_position, v_transaction_id;
|
|
707
710
|
END;
|
|
708
711
|
$$;
|
|
709
712
|
`
|
|
710
713
|
);
|
|
711
|
-
var appendToStream = (pool, streamName, streamType,
|
|
714
|
+
var appendToStream = (pool, streamName, streamType, messages, options) => pool.withTransaction(async (transaction) => {
|
|
712
715
|
const { execute } = transaction;
|
|
713
|
-
if (
|
|
716
|
+
if (messages.length === 0)
|
|
714
717
|
return { success: false, result: { success: false } };
|
|
715
718
|
let appendResult;
|
|
716
719
|
try {
|
|
717
720
|
const expectedStreamVersion = toExpectedVersion(
|
|
718
721
|
_optionalChain([options, 'optionalAccess', _19 => _19.expectedStreamVersion])
|
|
719
722
|
);
|
|
720
|
-
const
|
|
723
|
+
const messagesToAppend = messages.map((e, i) => ({
|
|
721
724
|
...e,
|
|
725
|
+
kind: _nullishCoalesce(e.kind, () => ( "Event")),
|
|
722
726
|
metadata: {
|
|
723
727
|
streamName,
|
|
724
|
-
|
|
728
|
+
messageId: _uuid.v4.call(void 0, ),
|
|
725
729
|
streamPosition: BigInt(i),
|
|
726
730
|
..."metadata" in e ? _nullishCoalesce(e.metadata, () => ( {})) : {}
|
|
727
731
|
}
|
|
@@ -730,13 +734,13 @@ var appendToStream = (pool, streamName, streamType, events, options) => pool.wit
|
|
|
730
734
|
execute,
|
|
731
735
|
streamName,
|
|
732
736
|
streamType,
|
|
733
|
-
|
|
737
|
+
messagesToAppend,
|
|
734
738
|
{
|
|
735
739
|
expectedStreamVersion
|
|
736
740
|
}
|
|
737
741
|
);
|
|
738
742
|
if (_optionalChain([options, 'optionalAccess', _20 => _20.preCommitHook]))
|
|
739
|
-
await options.preCommitHook(
|
|
743
|
+
await options.preCommitHook(messagesToAppend, { transaction });
|
|
740
744
|
} catch (error) {
|
|
741
745
|
if (!isOptimisticConcurrencyError(error)) throw error;
|
|
742
746
|
appendResult = {
|
|
@@ -770,25 +774,27 @@ var toExpectedVersion = (expected) => {
|
|
|
770
774
|
return expected;
|
|
771
775
|
};
|
|
772
776
|
var isOptimisticConcurrencyError = (error) => error instanceof Error && "code" in error && error.code === "23505";
|
|
773
|
-
var appendEventsRaw = (execute, streamId, streamType,
|
|
777
|
+
var appendEventsRaw = (execute, streamId, streamType, messages, options) => _dumbo.single.call(void 0,
|
|
774
778
|
execute.command(
|
|
775
779
|
_dumbo.sql.call(void 0,
|
|
776
|
-
`SELECT * FROM
|
|
780
|
+
`SELECT * FROM emt_append_to_stream(
|
|
777
781
|
ARRAY[%s]::text[],
|
|
778
782
|
ARRAY[%s]::jsonb[],
|
|
779
783
|
ARRAY[%s]::jsonb[],
|
|
780
784
|
ARRAY[%s]::text[],
|
|
781
785
|
ARRAY[%s]::text[],
|
|
786
|
+
ARRAY[%s]::text[],
|
|
782
787
|
%L::text,
|
|
783
788
|
%L::text,
|
|
784
789
|
%s::bigint,
|
|
785
790
|
%L::text
|
|
786
791
|
)`,
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
+
messages.map((e) => _dumbo.sql.call(void 0, "%L", e.metadata.messageId)).join(","),
|
|
793
|
+
messages.map((e) => _dumbo.sql.call(void 0, "%L", JSONParser.stringify(e.data))).join(","),
|
|
794
|
+
messages.map((e) => _dumbo.sql.call(void 0, "%L", JSONParser.stringify(_nullishCoalesce(e.metadata, () => ( {}))))).join(","),
|
|
795
|
+
messages.map(() => `'1'`).join(","),
|
|
796
|
+
messages.map((e) => _dumbo.sql.call(void 0, "%L", e.type)).join(","),
|
|
797
|
+
messages.map((e) => _dumbo.sql.call(void 0, "%L", e.kind === "Event" ? "E" : "C")).join(","),
|
|
792
798
|
streamId,
|
|
793
799
|
streamType,
|
|
794
800
|
_nullishCoalesce(_optionalChain([options, 'optionalAccess', _21 => _21.expectedStreamVersion]), () => ( "NULL")),
|
|
@@ -886,7 +892,7 @@ var streamsTableSQL = _dumbo.rawSql.call(void 0,
|
|
|
886
892
|
`CREATE TABLE IF NOT EXISTS ${streamsTable.name}(
|
|
887
893
|
stream_id TEXT NOT NULL,
|
|
888
894
|
stream_position BIGINT NOT NULL,
|
|
889
|
-
partition TEXT NOT NULL DEFAULT '${globalTag}
|
|
895
|
+
partition TEXT NOT NULL DEFAULT '${globalTag}',
|
|
890
896
|
stream_type TEXT NOT NULL,
|
|
891
897
|
stream_metadata JSONB NOT NULL,
|
|
892
898
|
is_archived BOOLEAN NOT NULL DEFAULT FALSE,
|
|
@@ -894,21 +900,22 @@ var streamsTableSQL = _dumbo.rawSql.call(void 0,
|
|
|
894
900
|
UNIQUE (stream_id, partition, is_archived)
|
|
895
901
|
) PARTITION BY LIST (partition);`
|
|
896
902
|
);
|
|
897
|
-
var
|
|
903
|
+
var messagesTableSQL = _dumbo.rawSql.call(void 0,
|
|
898
904
|
`
|
|
899
|
-
CREATE SEQUENCE IF NOT EXISTS
|
|
905
|
+
CREATE SEQUENCE IF NOT EXISTS emt_global_message_position;
|
|
900
906
|
|
|
901
|
-
CREATE TABLE IF NOT EXISTS ${
|
|
907
|
+
CREATE TABLE IF NOT EXISTS ${messagesTable.name}(
|
|
902
908
|
stream_id TEXT NOT NULL,
|
|
903
909
|
stream_position BIGINT NOT NULL,
|
|
904
910
|
partition TEXT NOT NULL DEFAULT '${globalTag}',
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
911
|
+
message_kind CHAR(1) NOT NULL DEFAULT 'E',
|
|
912
|
+
message_data JSONB NOT NULL,
|
|
913
|
+
message_metadata JSONB NOT NULL,
|
|
914
|
+
message_schema_version TEXT NOT NULL,
|
|
915
|
+
message_type TEXT NOT NULL,
|
|
916
|
+
message_id TEXT NOT NULL,
|
|
910
917
|
is_archived BOOLEAN NOT NULL DEFAULT FALSE,
|
|
911
|
-
global_position BIGINT DEFAULT nextval('
|
|
918
|
+
global_position BIGINT DEFAULT nextval('emt_global_message_position'),
|
|
912
919
|
transaction_id XID8 NOT NULL,
|
|
913
920
|
created TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
914
921
|
PRIMARY KEY (stream_id, stream_position, partition, is_archived)
|
|
@@ -919,7 +926,7 @@ var subscriptionsTableSQL = _dumbo.rawSql.call(void 0,
|
|
|
919
926
|
CREATE TABLE IF NOT EXISTS ${subscriptionsTable.name}(
|
|
920
927
|
subscription_id TEXT NOT NULL,
|
|
921
928
|
version INT NOT NULL DEFAULT 1,
|
|
922
|
-
partition TEXT NOT NULL DEFAULT '${globalTag}
|
|
929
|
+
partition TEXT NOT NULL DEFAULT '${globalTag}',
|
|
923
930
|
last_processed_position BIGINT NOT NULL,
|
|
924
931
|
last_processed_transaction_id XID8 NOT NULL,
|
|
925
932
|
PRIMARY KEY (subscription_id, partition, version)
|
|
@@ -967,11 +974,11 @@ var addTablePartitions = _dumbo.rawSql.call(void 0,
|
|
|
967
974
|
END;
|
|
968
975
|
$$ LANGUAGE plpgsql;`
|
|
969
976
|
);
|
|
970
|
-
var
|
|
977
|
+
var addPartitionSQL = _dumbo.rawSql.call(void 0,
|
|
971
978
|
`
|
|
972
979
|
CREATE OR REPLACE FUNCTION emt_add_partition(partition_name TEXT) RETURNS void AS $$
|
|
973
980
|
BEGIN
|
|
974
|
-
PERFORM emt_add_table_partition('${
|
|
981
|
+
PERFORM emt_add_table_partition('${messagesTable.name}', partition_name);
|
|
975
982
|
PERFORM emt_add_table_partition('${streamsTable.name}', partition_name);
|
|
976
983
|
|
|
977
984
|
EXECUTE format('
|
|
@@ -986,23 +993,23 @@ var addModuleSQL = _dumbo.rawSql.call(void 0,
|
|
|
986
993
|
`
|
|
987
994
|
CREATE OR REPLACE FUNCTION add_module(new_module TEXT) RETURNS void AS $$
|
|
988
995
|
BEGIN
|
|
989
|
-
-- For ${
|
|
996
|
+
-- For ${messagesTable.name} table
|
|
990
997
|
EXECUTE format('
|
|
991
998
|
CREATE TABLE IF NOT EXISTS %I PARTITION OF %I
|
|
992
999
|
FOR VALUES IN (emt_sanitize_name(%L || ''__'' || %L)) PARTITION BY LIST (is_archived);',
|
|
993
|
-
emt_sanitize_name('${
|
|
1000
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}'), '${messagesTable.name}', new_module, '${globalTag}'
|
|
994
1001
|
);
|
|
995
1002
|
|
|
996
1003
|
EXECUTE format('
|
|
997
1004
|
CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I
|
|
998
1005
|
FOR VALUES IN (FALSE);',
|
|
999
|
-
emt_sanitize_name('${
|
|
1006
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}' || '_active'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}')
|
|
1000
1007
|
);
|
|
1001
1008
|
|
|
1002
1009
|
EXECUTE format('
|
|
1003
1010
|
CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I
|
|
1004
1011
|
FOR VALUES IN (TRUE);',
|
|
1005
|
-
emt_sanitize_name('${
|
|
1012
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}' || '_archived'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || '${globalTag}')
|
|
1006
1013
|
);
|
|
1007
1014
|
|
|
1008
1015
|
-- For ${streamsTable.name} table
|
|
@@ -1031,23 +1038,23 @@ var addTenantSQL = _dumbo.rawSql.call(void 0,
|
|
|
1031
1038
|
`
|
|
1032
1039
|
CREATE OR REPLACE FUNCTION add_tenant(new_module TEXT, new_tenant TEXT) RETURNS void AS $$
|
|
1033
1040
|
BEGIN
|
|
1034
|
-
-- For ${
|
|
1041
|
+
-- For ${messagesTable.name} table
|
|
1035
1042
|
EXECUTE format('
|
|
1036
1043
|
CREATE TABLE IF NOT EXISTS %I PARTITION OF %I
|
|
1037
1044
|
FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',
|
|
1038
|
-
emt_sanitize_name('${
|
|
1045
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant), '${messagesTable.name}', new_module, new_tenant
|
|
1039
1046
|
);
|
|
1040
1047
|
|
|
1041
1048
|
EXECUTE format('
|
|
1042
1049
|
CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I
|
|
1043
1050
|
FOR VALUES IN (FALSE);',
|
|
1044
|
-
emt_sanitize_name('${
|
|
1051
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant || '_active'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant)
|
|
1045
1052
|
);
|
|
1046
1053
|
|
|
1047
1054
|
EXECUTE format('
|
|
1048
1055
|
CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I
|
|
1049
1056
|
FOR VALUES IN (TRUE);',
|
|
1050
|
-
emt_sanitize_name('${
|
|
1057
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant || '_archived'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || new_tenant)
|
|
1051
1058
|
);
|
|
1052
1059
|
|
|
1053
1060
|
-- For ${streamsTable.name} table
|
|
@@ -1080,25 +1087,25 @@ var addModuleForAllTenantsSQL = _dumbo.rawSql.call(void 0,
|
|
|
1080
1087
|
BEGIN
|
|
1081
1088
|
PERFORM add_module(new_module);
|
|
1082
1089
|
|
|
1083
|
-
FOR tenant_record IN SELECT DISTINCT tenant FROM ${
|
|
1090
|
+
FOR tenant_record IN SELECT DISTINCT tenant FROM ${messagesTable.name}
|
|
1084
1091
|
LOOP
|
|
1085
|
-
-- For ${
|
|
1092
|
+
-- For ${messagesTable.name} table
|
|
1086
1093
|
EXECUTE format('
|
|
1087
1094
|
CREATE TABLE IF NOT EXISTS %I PARTITION OF %I
|
|
1088
1095
|
FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',
|
|
1089
|
-
emt_sanitize_name('${
|
|
1096
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant), '${messagesTable.name}', new_module, tenant_record.tenant
|
|
1090
1097
|
);
|
|
1091
1098
|
|
|
1092
1099
|
EXECUTE format('
|
|
1093
1100
|
CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I
|
|
1094
1101
|
FOR VALUES IN (FALSE);',
|
|
1095
|
-
emt_sanitize_name('${
|
|
1102
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant || '_active'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant)
|
|
1096
1103
|
);
|
|
1097
1104
|
|
|
1098
1105
|
EXECUTE format('
|
|
1099
1106
|
CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I
|
|
1100
1107
|
FOR VALUES IN (TRUE);',
|
|
1101
|
-
emt_sanitize_name('${
|
|
1108
|
+
emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant || '_archived'), emt_sanitize_name('${messagesTable.name}_' || new_module || '__' || tenant_record.tenant)
|
|
1102
1109
|
);
|
|
1103
1110
|
|
|
1104
1111
|
-- For ${streamsTable.name} table
|
|
@@ -1130,25 +1137,25 @@ var addTenantForAllModulesSQL = _dumbo.rawSql.call(void 0,
|
|
|
1130
1137
|
DECLARE
|
|
1131
1138
|
module_record RECORD;
|
|
1132
1139
|
BEGIN
|
|
1133
|
-
FOR module_record IN SELECT DISTINCT partitionname FROM pg_partman.part_config WHERE parent_table = '${
|
|
1140
|
+
FOR module_record IN SELECT DISTINCT partitionname FROM pg_partman.part_config WHERE parent_table = '${messagesTable.name}'
|
|
1134
1141
|
LOOP
|
|
1135
|
-
-- For ${
|
|
1142
|
+
-- For ${messagesTable.name} table
|
|
1136
1143
|
EXECUTE format('
|
|
1137
1144
|
CREATE TABLE IF NOT EXISTS %I PARTITION OF %I
|
|
1138
1145
|
FOR VALUES IN (emt_sanitize_name(''%s__%s'')) PARTITION BY LIST (is_archived);',
|
|
1139
|
-
emt_sanitize_name('${
|
|
1146
|
+
emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant), '${messagesTable.name}', module_record.partitionname, new_tenant
|
|
1140
1147
|
);
|
|
1141
1148
|
|
|
1142
1149
|
EXECUTE format('
|
|
1143
1150
|
CREATE TABLE IF NOT EXISTS %I_active PARTITION OF %I
|
|
1144
1151
|
FOR VALUES IN (FALSE);',
|
|
1145
|
-
emt_sanitize_name('${
|
|
1152
|
+
emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant || '_active'), emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant)
|
|
1146
1153
|
);
|
|
1147
1154
|
|
|
1148
1155
|
EXECUTE format('
|
|
1149
1156
|
CREATE TABLE IF NOT EXISTS %I_archived PARTITION OF %I
|
|
1150
1157
|
FOR VALUES IN (TRUE);',
|
|
1151
|
-
emt_sanitize_name('${
|
|
1158
|
+
emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant || '_archived'), emt_sanitize_name('${messagesTable.name}_' || module_record.partitionname || '__' || new_tenant)
|
|
1152
1159
|
);
|
|
1153
1160
|
|
|
1154
1161
|
-- For ${streamsTable.name} table
|
|
@@ -1174,9 +1181,76 @@ var addTenantForAllModulesSQL = _dumbo.rawSql.call(void 0,
|
|
|
1174
1181
|
$$ LANGUAGE plpgsql;
|
|
1175
1182
|
`
|
|
1176
1183
|
);
|
|
1177
|
-
var
|
|
1184
|
+
var addDefaultPartitionSQL = _dumbo.rawSql.call(void 0,
|
|
1178
1185
|
`SELECT emt_add_partition('${defaultTag}');`
|
|
1179
1186
|
);
|
|
1187
|
+
var migrationFromEventsToMessagesSQL = _dumbo.rawSql.call(void 0, `
|
|
1188
|
+
DO $$
|
|
1189
|
+
DECLARE
|
|
1190
|
+
partition_record RECORD;
|
|
1191
|
+
BEGIN
|
|
1192
|
+
-- Rename the main table and its columns if it exists
|
|
1193
|
+
IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'emt_events') THEN
|
|
1194
|
+
-- Rename all partitions first
|
|
1195
|
+
FOR partition_record IN
|
|
1196
|
+
SELECT tablename
|
|
1197
|
+
FROM pg_tables
|
|
1198
|
+
WHERE tablename LIKE 'emt_events_%'
|
|
1199
|
+
ORDER BY tablename DESC -- to handle child partitions first
|
|
1200
|
+
LOOP
|
|
1201
|
+
EXECUTE format('ALTER TABLE %I RENAME TO %I',
|
|
1202
|
+
partition_record.tablename,
|
|
1203
|
+
REPLACE(partition_record.tablename, 'events', 'messages'));
|
|
1204
|
+
END LOOP;
|
|
1205
|
+
|
|
1206
|
+
-- Rename the main table
|
|
1207
|
+
ALTER TABLE emt_events RENAME TO emt_messages;
|
|
1208
|
+
|
|
1209
|
+
-- Rename columns
|
|
1210
|
+
ALTER TABLE emt_messages
|
|
1211
|
+
RENAME COLUMN event_data TO message_data;
|
|
1212
|
+
ALTER TABLE emt_messages
|
|
1213
|
+
RENAME COLUMN event_metadata TO message_metadata;
|
|
1214
|
+
ALTER TABLE emt_messages
|
|
1215
|
+
RENAME COLUMN event_schema_version TO message_schema_version;
|
|
1216
|
+
ALTER TABLE emt_messages
|
|
1217
|
+
RENAME COLUMN event_type TO message_type;
|
|
1218
|
+
ALTER TABLE emt_messages
|
|
1219
|
+
RENAME COLUMN event_id TO message_id;
|
|
1220
|
+
ALTER TABLE emt_messages
|
|
1221
|
+
ADD COLUMN message_kind CHAR(1) NOT NULL DEFAULT 'E';
|
|
1222
|
+
|
|
1223
|
+
-- Rename sequence if it exists
|
|
1224
|
+
IF EXISTS (SELECT 1 FROM pg_sequences WHERE sequencename = 'emt_global_event_position') THEN
|
|
1225
|
+
ALTER SEQUENCE emt_global_event_position
|
|
1226
|
+
RENAME TO emt_global_message_position;
|
|
1227
|
+
|
|
1228
|
+
ALTER TABLE emt_messages
|
|
1229
|
+
ALTER COLUMN global_position
|
|
1230
|
+
SET DEFAULT nextval('emt_global_message_position');
|
|
1231
|
+
END IF;
|
|
1232
|
+
END IF;
|
|
1233
|
+
END $$;`);
|
|
1234
|
+
|
|
1235
|
+
// src/eventStore/schema/readProcessorCheckpoint.ts
|
|
1236
|
+
|
|
1237
|
+
var readProcessorCheckpoint = async (execute, options) => {
|
|
1238
|
+
const result = await _dumbo.singleOrNull.call(void 0,
|
|
1239
|
+
execute.query(
|
|
1240
|
+
_dumbo.sql.call(void 0,
|
|
1241
|
+
`SELECT last_processed_position
|
|
1242
|
+
FROM ${subscriptionsTable.name}
|
|
1243
|
+
WHERE partition = %L AND subscription_id = %L
|
|
1244
|
+
LIMIT 1`,
|
|
1245
|
+
_nullishCoalesce(_optionalChain([options, 'optionalAccess', _23 => _23.partition]), () => ( defaultTag)),
|
|
1246
|
+
options.processorId
|
|
1247
|
+
)
|
|
1248
|
+
)
|
|
1249
|
+
);
|
|
1250
|
+
return {
|
|
1251
|
+
lastProcessedPosition: result !== null ? BigInt(result.last_processed_position) : null
|
|
1252
|
+
};
|
|
1253
|
+
};
|
|
1180
1254
|
|
|
1181
1255
|
// src/eventStore/schema/readStream.ts
|
|
1182
1256
|
|
|
@@ -1189,28 +1263,29 @@ var readStream = async (execute, streamId, options) => {
|
|
|
1189
1263
|
const events = await _dumbo.mapRows.call(void 0,
|
|
1190
1264
|
execute.query(
|
|
1191
1265
|
_dumbo.sql.call(void 0,
|
|
1192
|
-
`SELECT stream_id, stream_position, global_position,
|
|
1193
|
-
FROM ${
|
|
1266
|
+
`SELECT stream_id, stream_position, global_position, message_data, message_metadata, message_schema_version, message_type, message_id
|
|
1267
|
+
FROM ${messagesTable.name}
|
|
1194
1268
|
WHERE stream_id = %L AND partition = %L AND is_archived = FALSE ${fromCondition} ${toCondition}`,
|
|
1195
1269
|
streamId,
|
|
1196
|
-
_nullishCoalesce(_optionalChain([options, 'optionalAccess',
|
|
1270
|
+
_nullishCoalesce(_optionalChain([options, 'optionalAccess', _24 => _24.partition]), () => ( defaultTag))
|
|
1197
1271
|
)
|
|
1198
1272
|
),
|
|
1199
1273
|
(row) => {
|
|
1200
1274
|
const rawEvent = {
|
|
1201
|
-
type: row.
|
|
1202
|
-
data: row.
|
|
1203
|
-
metadata: row.
|
|
1275
|
+
type: row.message_type,
|
|
1276
|
+
data: row.message_data,
|
|
1277
|
+
metadata: row.message_metadata
|
|
1204
1278
|
};
|
|
1205
1279
|
const metadata = {
|
|
1206
1280
|
..."metadata" in rawEvent ? _nullishCoalesce(rawEvent.metadata, () => ( {})) : {},
|
|
1207
|
-
|
|
1281
|
+
messageId: row.message_id,
|
|
1208
1282
|
streamName: streamId,
|
|
1209
1283
|
streamPosition: BigInt(row.stream_position),
|
|
1210
1284
|
globalPosition: BigInt(row.global_position)
|
|
1211
1285
|
};
|
|
1212
1286
|
return {
|
|
1213
1287
|
...rawEvent,
|
|
1288
|
+
kind: "Event",
|
|
1214
1289
|
metadata
|
|
1215
1290
|
};
|
|
1216
1291
|
}
|
|
@@ -1226,40 +1301,21 @@ var readStream = async (execute, streamId, options) => {
|
|
|
1226
1301
|
};
|
|
1227
1302
|
};
|
|
1228
1303
|
|
|
1229
|
-
// src/eventStore/schema/readProcessorCheckpoint.ts
|
|
1230
|
-
|
|
1231
|
-
var readProcessorCheckpoint = async (execute, options) => {
|
|
1232
|
-
const result = await _dumbo.singleOrNull.call(void 0,
|
|
1233
|
-
execute.query(
|
|
1234
|
-
_dumbo.sql.call(void 0,
|
|
1235
|
-
`SELECT last_processed_position
|
|
1236
|
-
FROM ${subscriptionsTable.name}
|
|
1237
|
-
WHERE partition = %L AND subscription_id = %L
|
|
1238
|
-
LIMIT 1`,
|
|
1239
|
-
_nullishCoalesce(_optionalChain([options, 'optionalAccess', _24 => _24.partition]), () => ( defaultTag)),
|
|
1240
|
-
options.processorId
|
|
1241
|
-
)
|
|
1242
|
-
)
|
|
1243
|
-
);
|
|
1244
|
-
return {
|
|
1245
|
-
lastProcessedPosition: result !== null ? BigInt(result.last_processed_position) : null
|
|
1246
|
-
};
|
|
1247
|
-
};
|
|
1248
|
-
|
|
1249
1304
|
// src/eventStore/schema/index.ts
|
|
1250
1305
|
var schemaSQL = [
|
|
1306
|
+
migrationFromEventsToMessagesSQL,
|
|
1251
1307
|
streamsTableSQL,
|
|
1252
|
-
|
|
1308
|
+
messagesTableSQL,
|
|
1253
1309
|
subscriptionsTableSQL,
|
|
1254
1310
|
sanitizeNameSQL,
|
|
1255
1311
|
addTablePartitions,
|
|
1256
|
-
|
|
1312
|
+
addPartitionSQL,
|
|
1257
1313
|
addModuleSQL,
|
|
1258
1314
|
addTenantSQL,
|
|
1259
1315
|
addModuleForAllTenantsSQL,
|
|
1260
1316
|
addTenantForAllModulesSQL,
|
|
1261
|
-
|
|
1262
|
-
|
|
1317
|
+
appendToStreamSQL,
|
|
1318
|
+
addDefaultPartitionSQL,
|
|
1263
1319
|
storeSubscriptionCheckpointSQL
|
|
1264
1320
|
];
|
|
1265
1321
|
var createEventStoreSchema = async (pool) => {
|
|
@@ -1675,10 +1731,11 @@ var PostgreSQLProjectionSpec = {
|
|
|
1675
1731
|
globalPosition: ++globalPosition,
|
|
1676
1732
|
streamPosition: globalPosition,
|
|
1677
1733
|
streamName: `test-${_uuid.v4.call(void 0, )}`,
|
|
1678
|
-
|
|
1734
|
+
messageId: _uuid.v4.call(void 0, )
|
|
1679
1735
|
};
|
|
1680
1736
|
allEvents.push({
|
|
1681
1737
|
...event,
|
|
1738
|
+
kind: "Event",
|
|
1682
1739
|
metadata: {
|
|
1683
1740
|
...metadata,
|
|
1684
1741
|
..."metadata" in event ? _nullishCoalesce(event.metadata, () => ( {})) : {}
|
|
@@ -1992,5 +2049,6 @@ var getPostgreSQLEventStore = (connectionString, options = defaultPostgreSQLOpti
|
|
|
1992
2049
|
|
|
1993
2050
|
|
|
1994
2051
|
|
|
1995
|
-
|
|
2052
|
+
|
|
2053
|
+
exports.DefaultPostgreSQLEventStoreProcessorBatchSize = DefaultPostgreSQLEventStoreProcessorBatchSize; exports.DefaultPostgreSQLEventStoreProcessorPullingFrequencyInMs = DefaultPostgreSQLEventStoreProcessorPullingFrequencyInMs; exports.PostgreSQLEventStoreDefaultStreamVersion = PostgreSQLEventStoreDefaultStreamVersion; exports.PostgreSQLProcessor = PostgreSQLProcessor; exports.PostgreSQLProjectionSpec = PostgreSQLProjectionSpec; exports.addDefaultPartitionSQL = addDefaultPartitionSQL; exports.addModuleForAllTenantsSQL = addModuleForAllTenantsSQL; exports.addModuleSQL = addModuleSQL; exports.addPartitionSQL = addPartitionSQL; exports.addTablePartitions = addTablePartitions; exports.addTenantForAllModulesSQL = addTenantForAllModulesSQL; exports.addTenantSQL = addTenantSQL; exports.appendToStream = appendToStream; exports.appendToStreamSQL = appendToStreamSQL; exports.assertSQLQueryResultMatches = assertSQLQueryResultMatches; exports.createEventStoreSchema = createEventStoreSchema; exports.defaultPostgreSQLOptions = defaultPostgreSQLOptions; exports.defaultTag = defaultTag; exports.documentDoesNotExist = documentDoesNotExist; exports.documentExists = documentExists; exports.documentMatchingExists = documentMatchingExists; exports.documentsAreTheSame = documentsAreTheSame; exports.documentsMatchingHaveCount = documentsMatchingHaveCount; exports.emmettPrefix = emmettPrefix; exports.eventInStream = eventInStream; exports.eventsInStream = eventsInStream; exports.expectPongoDocuments = expectPongoDocuments; exports.expectSQL = expectSQL; exports.getPostgreSQLEventStore = getPostgreSQLEventStore; exports.globalNames = globalNames; exports.globalTag = globalTag; exports.handleProjections = handleProjections; exports.messagesTable = messagesTable; exports.messagesTableSQL = messagesTableSQL; exports.migrationFromEventsToMessagesSQL = migrationFromEventsToMessagesSQL; exports.newEventsInStream = newEventsInStream; exports.pongoMultiStreamProjection = pongoMultiStreamProjection; exports.pongoProjection = pongoProjection; exports.pongoSingleStreamProjection = pongoSingleStreamProjection; exports.postgreSQLEventStoreConsumer = postgreSQLEventStoreConsumer; exports.postgreSQLEventStoreMessageBatchPuller = postgreSQLEventStoreMessageBatchPuller; exports.postgreSQLProcessor = postgreSQLProcessor; exports.postgreSQLProjection = postgreSQLProjection; exports.postgreSQLProjectionProcessor = postgreSQLProjectionProcessor; exports.postgreSQLRawBatchSQLProjection = postgreSQLRawBatchSQLProjection; exports.postgreSQLRawSQLProjection = postgreSQLRawSQLProjection; exports.readLastMessageGlobalPosition = readLastMessageGlobalPosition; exports.readMessagesBatch = readMessagesBatch; exports.readProcessorCheckpoint = readProcessorCheckpoint; exports.readStream = readStream; exports.sanitizeNameSQL = sanitizeNameSQL; exports.schemaSQL = schemaSQL; exports.storeProcessorCheckpoint = storeProcessorCheckpoint; exports.storeSubscriptionCheckpointSQL = storeSubscriptionCheckpointSQL; exports.streamsTable = streamsTable; exports.streamsTableSQL = streamsTableSQL; exports.subscriptionsTable = subscriptionsTable; exports.subscriptionsTableSQL = subscriptionsTableSQL; exports.zipPostgreSQLEventStoreMessageBatchPullerStartFrom = zipPostgreSQLEventStoreMessageBatchPullerStartFrom;
|
|
1996
2054
|
//# sourceMappingURL=index.cjs.map
|