@shipfox/api-triggers 13.0.0 → 14.0.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/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +34 -0
- package/README.md +14 -10
- package/dist/core/entities/decision.d.ts +3 -2
- package/dist/core/entities/decision.d.ts.map +1 -1
- package/dist/core/entities/decision.js.map +1 -1
- package/dist/core/entities/job-listener-subscription.d.ts +2 -1
- package/dist/core/entities/job-listener-subscription.d.ts.map +1 -1
- package/dist/core/entities/job-listener-subscription.js.map +1 -1
- package/dist/core/entities/received-event.d.ts +14 -1
- package/dist/core/entities/received-event.d.ts.map +1 -1
- package/dist/core/entities/received-event.js +2 -1
- package/dist/core/entities/received-event.js.map +1 -1
- package/dist/core/entities/subscription.d.ts +2 -1
- package/dist/core/entities/subscription.d.ts.map +1 -1
- package/dist/core/entities/subscription.js.map +1 -1
- package/dist/core/fire-cron.d.ts.map +1 -1
- package/dist/core/fire-cron.js +3 -1
- package/dist/core/fire-cron.js.map +1 -1
- package/dist/core/fire-manual.d.ts.map +1 -1
- package/dist/core/fire-manual.js +3 -1
- package/dist/core/fire-manual.js.map +1 -1
- package/dist/core/record-trigger-history.d.ts +2 -0
- package/dist/core/record-trigger-history.d.ts.map +1 -1
- package/dist/core/record-trigger-history.js +13 -1
- package/dist/core/record-trigger-history.js.map +1 -1
- package/dist/core/route-event-to-job-listeners.js +2 -0
- package/dist/core/route-event-to-job-listeners.js.map +1 -1
- package/dist/db/db.d.ts +48 -14
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/event-history.d.ts +17 -0
- package/dist/db/event-history.d.ts.map +1 -1
- package/dist/db/event-history.js +45 -1
- package/dist/db/event-history.js.map +1 -1
- package/dist/db/event-queries.d.ts +5 -1
- package/dist/db/event-queries.d.ts.map +1 -1
- package/dist/db/event-queries.js +30 -4
- package/dist/db/event-queries.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/job-listener-subscriptions.d.ts +1 -1
- package/dist/db/job-listener-subscriptions.d.ts.map +1 -1
- package/dist/db/job-listener-subscriptions.js +10 -3
- package/dist/db/job-listener-subscriptions.js.map +1 -1
- package/dist/db/schema/decisions.d.ts +3 -3
- package/dist/db/schema/decisions.d.ts.map +1 -1
- package/dist/db/schema/decisions.js +8 -3
- package/dist/db/schema/decisions.js.map +1 -1
- package/dist/db/schema/job-listener-subscriptions.d.ts +1 -1
- package/dist/db/schema/job-listener-subscriptions.d.ts.map +1 -1
- package/dist/db/schema/job-listener-subscriptions.js +2 -1
- package/dist/db/schema/job-listener-subscriptions.js.map +1 -1
- package/dist/db/schema/received-events.d.ts +38 -4
- package/dist/db/schema/received-events.d.ts.map +1 -1
- package/dist/db/schema/received-events.js +11 -2
- package/dist/db/schema/received-events.js.map +1 -1
- package/dist/db/schema/subscriptions.d.ts +1 -1
- package/dist/db/schema/subscriptions.d.ts.map +1 -1
- package/dist/db/schema/subscriptions.js +2 -1
- package/dist/db/schema/subscriptions.js.map +1 -1
- package/dist/db/subscription-event.d.ts +7 -0
- package/dist/db/subscription-event.d.ts.map +1 -0
- package/dist/db/subscription-event.js +19 -0
- package/dist/db/subscription-event.js.map +1 -0
- package/dist/db/subscriptions.d.ts +5 -1
- package/dist/db/subscriptions.d.ts.map +1 -1
- package/dist/db/subscriptions.js +10 -3
- package/dist/db/subscriptions.js.map +1 -1
- package/dist/presentation/dto/trigger-events.d.ts +3 -2
- package/dist/presentation/dto/trigger-events.d.ts.map +1 -1
- package/dist/presentation/dto/trigger-events.js +9 -0
- package/dist/presentation/dto/trigger-events.js.map +1 -1
- package/dist/presentation/routes/get-trigger-event.d.ts.map +1 -1
- package/dist/presentation/routes/get-trigger-event.js +8 -4
- package/dist/presentation/routes/get-trigger-event.js.map +1 -1
- package/dist/presentation/routes/list-trigger-event-facets.js +1 -1
- package/dist/presentation/routes/list-trigger-event-facets.js.map +1 -1
- package/dist/presentation/routes/list-trigger-events.d.ts.map +1 -1
- package/dist/presentation/routes/list-trigger-events.js +3 -1
- package/dist/presentation/routes/list-trigger-events.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0001_nullable_subscription_events.sql +2 -0
- package/drizzle/0002_dev_trigger_journal.sql +7 -0
- package/drizzle/0003_add_origin_facet_index.sql +1 -0
- package/drizzle/meta/0001_snapshot.json +905 -0
- package/drizzle/meta/0002_snapshot.json +947 -0
- package/drizzle/meta/0003_snapshot.json +968 -0
- package/drizzle/meta/_journal.json +21 -0
- package/package.json +7 -7
- package/src/core/dispatch-integration-event.test.ts +88 -0
- package/src/core/entities/decision.ts +3 -2
- package/src/core/entities/job-listener-subscription.ts +2 -1
- package/src/core/entities/received-event.ts +15 -1
- package/src/core/entities/subscription.ts +2 -1
- package/src/core/fire-cron.test.ts +20 -0
- package/src/core/fire-cron.ts +3 -1
- package/src/core/fire-manual.test.ts +25 -0
- package/src/core/fire-manual.ts +3 -1
- package/src/core/record-trigger-history.test.ts +78 -0
- package/src/core/record-trigger-history.ts +19 -0
- package/src/core/route-event-to-job-listeners.test.ts +47 -0
- package/src/core/route-event-to-job-listeners.ts +2 -0
- package/src/db/event-history.test.ts +123 -0
- package/src/db/event-history.ts +84 -1
- package/src/db/event-queries.ts +56 -3
- package/src/db/index.ts +1 -0
- package/src/db/job-listener-subscriptions.test.ts +133 -1
- package/src/db/job-listener-subscriptions.ts +5 -4
- package/src/db/schema/decisions.test.ts +93 -4
- package/src/db/schema/decisions.ts +12 -3
- package/src/db/schema/job-listener-subscriptions.ts +2 -1
- package/src/db/schema/received-events.test.ts +45 -0
- package/src/db/schema/received-events.ts +12 -1
- package/src/db/schema/subscriptions.ts +2 -1
- package/src/db/subscription-event.ts +24 -0
- package/src/db/subscriptions.test.ts +137 -0
- package/src/db/subscriptions.ts +9 -4
- package/src/presentation/dto/trigger-events.test.ts +193 -0
- package/src/presentation/dto/trigger-events.ts +12 -0
- package/src/presentation/routes/get-trigger-event.test.ts +179 -0
- package/src/presentation/routes/get-trigger-event.ts +15 -3
- package/src/presentation/routes/list-trigger-event-facets.test.ts +39 -2
- package/src/presentation/routes/list-trigger-event-facets.ts +1 -1
- package/src/presentation/routes/list-trigger-events.test.ts +99 -0
- package/src/presentation/routes/list-trigger-events.ts +4 -0
- package/test/factories/received-event.ts +2 -0
- package/tsconfig.build.tsbuildinfo +1 -1
package/dist/db/db.d.ts
CHANGED
|
@@ -273,7 +273,7 @@ export declare const schema: {
|
|
|
273
273
|
columnType: "PgText";
|
|
274
274
|
data: string;
|
|
275
275
|
driverParam: string;
|
|
276
|
-
notNull:
|
|
276
|
+
notNull: false;
|
|
277
277
|
hasDefault: false;
|
|
278
278
|
isPrimaryKey: false;
|
|
279
279
|
isAutoincrement: false;
|
|
@@ -435,7 +435,7 @@ export declare const schema: {
|
|
|
435
435
|
columnType: "PgText";
|
|
436
436
|
data: string;
|
|
437
437
|
driverParam: string;
|
|
438
|
-
notNull:
|
|
438
|
+
notNull: false;
|
|
439
439
|
hasDefault: false;
|
|
440
440
|
isPrimaryKey: false;
|
|
441
441
|
isAutoincrement: false;
|
|
@@ -736,14 +736,14 @@ export declare const schema: {
|
|
|
736
736
|
tableName: "received_events";
|
|
737
737
|
dataType: "string";
|
|
738
738
|
columnType: "PgText";
|
|
739
|
-
data: "cron" | "integration" | "manual";
|
|
739
|
+
data: "cron" | "dev" | "integration" | "manual";
|
|
740
740
|
driverParam: string;
|
|
741
741
|
notNull: true;
|
|
742
742
|
hasDefault: false;
|
|
743
743
|
isPrimaryKey: false;
|
|
744
744
|
isAutoincrement: false;
|
|
745
745
|
hasRuntimeDefault: false;
|
|
746
|
-
enumValues: ["integration", "manual", "cron"];
|
|
746
|
+
enumValues: ["integration", "manual", "cron", "dev"];
|
|
747
747
|
baseColumn: never;
|
|
748
748
|
identity: undefined;
|
|
749
749
|
generated: undefined;
|
|
@@ -816,6 +816,23 @@ export declare const schema: {
|
|
|
816
816
|
identity: undefined;
|
|
817
817
|
generated: undefined;
|
|
818
818
|
}, {}, {}>;
|
|
819
|
+
replayOfEventId: import("drizzle-orm/pg-core").PgColumn<{
|
|
820
|
+
name: "replay_of_event_id";
|
|
821
|
+
tableName: "received_events";
|
|
822
|
+
dataType: "string";
|
|
823
|
+
columnType: "PgUUID";
|
|
824
|
+
data: string;
|
|
825
|
+
driverParam: string;
|
|
826
|
+
notNull: false;
|
|
827
|
+
hasDefault: false;
|
|
828
|
+
isPrimaryKey: false;
|
|
829
|
+
isAutoincrement: false;
|
|
830
|
+
hasRuntimeDefault: false;
|
|
831
|
+
enumValues: undefined;
|
|
832
|
+
baseColumn: never;
|
|
833
|
+
identity: undefined;
|
|
834
|
+
generated: undefined;
|
|
835
|
+
}, {}, {}>;
|
|
819
836
|
deliveryId: import("drizzle-orm/pg-core").PgColumn<{
|
|
820
837
|
name: "delivery_id";
|
|
821
838
|
tableName: "received_events";
|
|
@@ -1017,14 +1034,14 @@ export declare const schema: {
|
|
|
1017
1034
|
tableName: "decisions";
|
|
1018
1035
|
dataType: "string";
|
|
1019
1036
|
columnType: "PgText";
|
|
1020
|
-
data: "listener" | "trigger";
|
|
1037
|
+
data: "dev" | "listener" | "trigger";
|
|
1021
1038
|
driverParam: string;
|
|
1022
1039
|
notNull: true;
|
|
1023
1040
|
hasDefault: false;
|
|
1024
1041
|
isPrimaryKey: false;
|
|
1025
1042
|
isAutoincrement: false;
|
|
1026
1043
|
hasRuntimeDefault: false;
|
|
1027
|
-
enumValues: ["trigger", "listener"];
|
|
1044
|
+
enumValues: ["trigger", "listener", "dev"];
|
|
1028
1045
|
baseColumn: never;
|
|
1029
1046
|
identity: undefined;
|
|
1030
1047
|
generated: undefined;
|
|
@@ -1036,7 +1053,7 @@ export declare const schema: {
|
|
|
1036
1053
|
columnType: "PgUUID";
|
|
1037
1054
|
data: string;
|
|
1038
1055
|
driverParam: string;
|
|
1039
|
-
notNull:
|
|
1056
|
+
notNull: false;
|
|
1040
1057
|
hasDefault: false;
|
|
1041
1058
|
isPrimaryKey: false;
|
|
1042
1059
|
isAutoincrement: false;
|
|
@@ -1528,7 +1545,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
1528
1545
|
columnType: "PgText";
|
|
1529
1546
|
data: string;
|
|
1530
1547
|
driverParam: string;
|
|
1531
|
-
notNull:
|
|
1548
|
+
notNull: false;
|
|
1532
1549
|
hasDefault: false;
|
|
1533
1550
|
isPrimaryKey: false;
|
|
1534
1551
|
isAutoincrement: false;
|
|
@@ -1690,7 +1707,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
1690
1707
|
columnType: "PgText";
|
|
1691
1708
|
data: string;
|
|
1692
1709
|
driverParam: string;
|
|
1693
|
-
notNull:
|
|
1710
|
+
notNull: false;
|
|
1694
1711
|
hasDefault: false;
|
|
1695
1712
|
isPrimaryKey: false;
|
|
1696
1713
|
isAutoincrement: false;
|
|
@@ -1991,14 +2008,14 @@ export declare function db(): NodePgDatabase<{
|
|
|
1991
2008
|
tableName: "received_events";
|
|
1992
2009
|
dataType: "string";
|
|
1993
2010
|
columnType: "PgText";
|
|
1994
|
-
data: "cron" | "integration" | "manual";
|
|
2011
|
+
data: "cron" | "dev" | "integration" | "manual";
|
|
1995
2012
|
driverParam: string;
|
|
1996
2013
|
notNull: true;
|
|
1997
2014
|
hasDefault: false;
|
|
1998
2015
|
isPrimaryKey: false;
|
|
1999
2016
|
isAutoincrement: false;
|
|
2000
2017
|
hasRuntimeDefault: false;
|
|
2001
|
-
enumValues: ["integration", "manual", "cron"];
|
|
2018
|
+
enumValues: ["integration", "manual", "cron", "dev"];
|
|
2002
2019
|
baseColumn: never;
|
|
2003
2020
|
identity: undefined;
|
|
2004
2021
|
generated: undefined;
|
|
@@ -2071,6 +2088,23 @@ export declare function db(): NodePgDatabase<{
|
|
|
2071
2088
|
identity: undefined;
|
|
2072
2089
|
generated: undefined;
|
|
2073
2090
|
}, {}, {}>;
|
|
2091
|
+
replayOfEventId: import("drizzle-orm/pg-core").PgColumn<{
|
|
2092
|
+
name: "replay_of_event_id";
|
|
2093
|
+
tableName: "received_events";
|
|
2094
|
+
dataType: "string";
|
|
2095
|
+
columnType: "PgUUID";
|
|
2096
|
+
data: string;
|
|
2097
|
+
driverParam: string;
|
|
2098
|
+
notNull: false;
|
|
2099
|
+
hasDefault: false;
|
|
2100
|
+
isPrimaryKey: false;
|
|
2101
|
+
isAutoincrement: false;
|
|
2102
|
+
hasRuntimeDefault: false;
|
|
2103
|
+
enumValues: undefined;
|
|
2104
|
+
baseColumn: never;
|
|
2105
|
+
identity: undefined;
|
|
2106
|
+
generated: undefined;
|
|
2107
|
+
}, {}, {}>;
|
|
2074
2108
|
deliveryId: import("drizzle-orm/pg-core").PgColumn<{
|
|
2075
2109
|
name: "delivery_id";
|
|
2076
2110
|
tableName: "received_events";
|
|
@@ -2272,14 +2306,14 @@ export declare function db(): NodePgDatabase<{
|
|
|
2272
2306
|
tableName: "decisions";
|
|
2273
2307
|
dataType: "string";
|
|
2274
2308
|
columnType: "PgText";
|
|
2275
|
-
data: "listener" | "trigger";
|
|
2309
|
+
data: "dev" | "listener" | "trigger";
|
|
2276
2310
|
driverParam: string;
|
|
2277
2311
|
notNull: true;
|
|
2278
2312
|
hasDefault: false;
|
|
2279
2313
|
isPrimaryKey: false;
|
|
2280
2314
|
isAutoincrement: false;
|
|
2281
2315
|
hasRuntimeDefault: false;
|
|
2282
|
-
enumValues: ["trigger", "listener"];
|
|
2316
|
+
enumValues: ["trigger", "listener", "dev"];
|
|
2283
2317
|
baseColumn: never;
|
|
2284
2318
|
identity: undefined;
|
|
2285
2319
|
generated: undefined;
|
|
@@ -2291,7 +2325,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
2291
2325
|
columnType: "PgUUID";
|
|
2292
2326
|
data: string;
|
|
2293
2327
|
driverParam: string;
|
|
2294
|
-
notNull:
|
|
2328
|
+
notNull: false;
|
|
2295
2329
|
hasDefault: false;
|
|
2296
2330
|
isPrimaryKey: false;
|
|
2297
2331
|
isAutoincrement: false;
|
package/dist/db/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAC,MAAM,uBAAuB,CAAC;AASnE,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,4 +47,21 @@ export interface UpsertListenerFailedDecisionParams {
|
|
|
47
47
|
}
|
|
48
48
|
export declare function upsertListenerFilterErrorDecision(params: UpsertListenerFailedDecisionParams): Promise<void>;
|
|
49
49
|
export declare function upsertListenerDispatchErrorDecision(params: UpsertListenerFailedDecisionParams): Promise<void>;
|
|
50
|
+
export interface UpsertDevTriggeredDecisionParams {
|
|
51
|
+
receivedEventId: string;
|
|
52
|
+
triggerKey: string;
|
|
53
|
+
workflowDefinitionId: string;
|
|
54
|
+
run: {
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export declare function upsertDevTriggeredDecision(params: UpsertDevTriggeredDecisionParams): Promise<void>;
|
|
60
|
+
export interface UpsertDevFilterErrorDecisionParams {
|
|
61
|
+
receivedEventId: string;
|
|
62
|
+
triggerKey: string;
|
|
63
|
+
workflowDefinitionId: string;
|
|
64
|
+
reason: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function upsertDevFilterErrorDecision(params: UpsertDevFilterErrorDecisionParams): Promise<void>;
|
|
50
67
|
//# sourceMappingURL=event-history.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-history.d.ts","sourceRoot":"","sources":["../../src/db/event-history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,6CAA6C,CAAC;AACzF,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAKxE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,UAAU,EAAE,IAAI,CAAC;CAClB;AAID,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B5F;AAED,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1E;AAED,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7F;AAID,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU7F;AAOD,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9F;AAED,MAAM,WAAW,6BAA6B;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,mBAAmB,CAAC;IAClC,GAAG,EAAE;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;CACjC;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,mBAAmB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjG;AAGD,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,IAAI,CAAC,CAEf;AA6BD,MAAM,WAAW,qCAAqC;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,uBAAuB,CAAC;CACvC;AAED,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,MAAM,WAAW,kCAAkC;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,uBAAuB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,kCAAkC,GACzC,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,kCAAkC,GACzC,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
1
|
+
{"version":3,"file":"event-history.d.ts","sourceRoot":"","sources":["../../src/db/event-history.ts"],"names":[],"mappings":"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"}
|
package/dist/db/event-history.js
CHANGED
|
@@ -201,7 +201,51 @@ function listenerDecisionIdentity(params) {
|
|
|
201
201
|
};
|
|
202
202
|
}
|
|
203
203
|
function listenerSubscriptionName(subscription) {
|
|
204
|
-
|
|
204
|
+
// A NULL event is a source subscription; `*` keeps the audit name unambiguous.
|
|
205
|
+
return `listener ${subscription.kind}[${subscription.matcherOrdinal}] ${subscription.source}/${subscription.event ?? '*'}`;
|
|
206
|
+
}
|
|
207
|
+
// A dev journal entry has exactly one decision. Its partial unique index uses
|
|
208
|
+
// received_event_id because NULL subscription ids do not conflict in the
|
|
209
|
+
// regular subscription identity index.
|
|
210
|
+
export async function upsertDevTriggeredDecision(params) {
|
|
211
|
+
await upsertDevDecision(params, {
|
|
212
|
+
decision: 'triggered',
|
|
213
|
+
runId: params.run.id,
|
|
214
|
+
runName: params.run.name,
|
|
215
|
+
reason: null
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// Refusals before run creation (filter false or evaluation error on replay).
|
|
219
|
+
export async function upsertDevFilterErrorDecision(params) {
|
|
220
|
+
await upsertDevDecision(params, {
|
|
221
|
+
decision: 'filter-error',
|
|
222
|
+
runId: null,
|
|
223
|
+
runName: null,
|
|
224
|
+
reason: params.reason
|
|
225
|
+
}, {
|
|
226
|
+
preserveTriggered: true
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
async function upsertDevDecision(params, values, options = {}) {
|
|
230
|
+
await db().insert(triggersDecisions).values({
|
|
231
|
+
receivedEventId: params.receivedEventId,
|
|
232
|
+
subscriptionKind: 'dev',
|
|
233
|
+
subscriptionId: null,
|
|
234
|
+
subscriptionName: params.triggerKey,
|
|
235
|
+
workflowDefinitionId: params.workflowDefinitionId,
|
|
236
|
+
projectId: null,
|
|
237
|
+
decision: values.decision,
|
|
238
|
+
runId: values.runId,
|
|
239
|
+
runName: values.runName,
|
|
240
|
+
reason: values.reason
|
|
241
|
+
}).onConflictDoUpdate({
|
|
242
|
+
target: triggersDecisions.receivedEventId,
|
|
243
|
+
targetWhere: sql`"subscription_kind" = 'dev'`,
|
|
244
|
+
set: values,
|
|
245
|
+
...options.preserveTriggered ? {
|
|
246
|
+
setWhere: ne(triggersDecisions.decision, 'triggered')
|
|
247
|
+
} : {}
|
|
248
|
+
});
|
|
205
249
|
}
|
|
206
250
|
|
|
207
251
|
//# sourceMappingURL=event-history.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/event-history.ts"],"sourcesContent":["import {and, eq, ne, notInArray, sql} from 'drizzle-orm';\nimport type {JobListenerSubscription} from '#core/entities/job-listener-subscription.js';\nimport type {TriggerEventOrigin} from '#core/entities/received-event.js';\nimport type {TriggerSubscription} from '#core/entities/subscription.js';\nimport {db} from './db.js';\nimport {triggersDecisions} from './schema/decisions.js';\nimport {triggersReceivedEvents} from './schema/received-events.js';\n\nexport interface InsertReceivedEventParams {\n eventRef: string;\n origin: TriggerEventOrigin;\n workspaceId: string;\n provider: string | null;\n source: string;\n event: string;\n deliveryId: string | null;\n connectionId: string | null;\n connectionName: string | null;\n payload: Record<string, unknown> | null;\n receivedAt: Date;\n}\n\n// `event_ref` is unique and delivery is at-least-once, so the same event can\n// arrive twice; either path returns the row id used to attach decisions.\nexport async function insertReceivedEvent(params: InsertReceivedEventParams): Promise<string> {\n const [inserted] = await db()\n .insert(triggersReceivedEvents)\n .values({\n eventRef: params.eventRef,\n origin: params.origin,\n workspaceId: params.workspaceId,\n provider: params.provider,\n source: params.source,\n event: params.event,\n deliveryId: params.deliveryId,\n connectionId: params.connectionId,\n connectionName: params.connectionName,\n payload: params.payload,\n receivedAt: params.receivedAt,\n })\n .onConflictDoNothing({target: triggersReceivedEvents.eventRef})\n .returning({id: triggersReceivedEvents.id});\n if (inserted) return inserted.id;\n\n const [existing] = await db()\n .select({id: triggersReceivedEvents.id})\n .from(triggersReceivedEvents)\n .where(eq(triggersReceivedEvents.eventRef, params.eventRef));\n if (!existing) {\n throw new Error(`received_events row missing after conflict for event_ref ${params.eventRef}`);\n }\n return existing.id;\n}\n\nexport async function markReceivedEventDiscarded(id: string): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({outcome: 'discarded', matchedCount: 0, processedAt: new Date()})\n .where(\n and(\n eq(triggersReceivedEvents.id, id),\n notInArray(triggersReceivedEvents.outcome, ['routed', 'errored']),\n ),\n );\n}\n\nexport async function markReceivedEventRouted(id: string, matchedCount: number): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({outcome: 'routed', matchedCount, processedAt: new Date()})\n .where(eq(triggersReceivedEvents.id, id));\n}\n\n// No processedAt: `failed` is transient. Under at-least-once dispatch, a late\n// failure must not clobber a sibling invocation's terminal outcome.\nexport async function markReceivedEventFailed(id: string, matchedCount: number): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({outcome: 'failed', matchedCount})\n .where(\n and(\n eq(triggersReceivedEvents.id, id),\n notInArray(triggersReceivedEvents.outcome, ['routed', 'discarded', 'errored']),\n ),\n );\n}\n\n// Terminal outcome for a fan-out that produced no new run this pass. The CASE is a\n// cross-attempt safety net: under at-least-once delivery a prior attempt may already have\n// created a run (its decision row is `triggered`, which is never downgraded), so promote the\n// event to `routed` rather than falsely record `errored`. Guarded so it never downgrades a\n// terminal success.\nexport async function markReceivedEventErrored(id: string, matchedCount: number): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({\n outcome: sql`CASE WHEN EXISTS (\n SELECT 1\n FROM ${triggersDecisions}\n WHERE ${triggersDecisions.receivedEventId} = ${triggersReceivedEvents.id}\n AND ${triggersDecisions.decision} = 'triggered'\n ) THEN 'routed' ELSE 'errored' END`,\n matchedCount,\n processedAt: new Date(),\n })\n .where(\n and(\n eq(triggersReceivedEvents.id, id),\n notInArray(triggersReceivedEvents.outcome, ['routed', 'discarded']),\n ),\n );\n}\n\nexport interface UpsertTriggeredDecisionParams {\n receivedEventId: string;\n subscription: TriggerSubscription;\n run: {id: string; name: string};\n}\n\nexport async function upsertTriggeredDecision(\n params: UpsertTriggeredDecisionParams,\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n receivedEventId: params.receivedEventId,\n subscriptionKind: 'trigger',\n subscriptionId: params.subscription.id,\n subscriptionName: params.subscription.name,\n workflowDefinitionId: params.subscription.workflowDefinitionId,\n projectId: params.subscription.projectId,\n decision: 'triggered',\n runId: params.run.id,\n runName: params.run.name,\n reason: null,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision: 'triggered', runId: params.run.id, runName: params.run.name, reason: null},\n });\n}\n\nexport interface UpsertFailedDecisionParams {\n receivedEventId: string;\n subscription: TriggerSubscription;\n reason: string;\n}\n\nexport async function upsertFilterErrorDecision(params: UpsertFailedDecisionParams): Promise<void> {\n await upsertFailedDecision(params, 'filter-error');\n}\n\n// A created run is ground truth. A later retry failure must not erase it.\nexport async function upsertDispatchErrorDecision(\n params: UpsertFailedDecisionParams,\n): Promise<void> {\n await upsertFailedDecision(params, 'dispatch-error');\n}\n\nasync function upsertFailedDecision(\n params: UpsertFailedDecisionParams,\n decision: 'filter-error' | 'dispatch-error',\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n receivedEventId: params.receivedEventId,\n subscriptionKind: 'trigger',\n subscriptionId: params.subscription.id,\n subscriptionName: params.subscription.name,\n workflowDefinitionId: params.subscription.workflowDefinitionId,\n projectId: params.subscription.projectId,\n decision,\n reason: params.reason,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision, reason: params.reason, runId: null, runName: null},\n setWhere: ne(triggersDecisions.decision, 'triggered'),\n });\n}\n\nexport interface UpsertListenerTriggeredDecisionParams {\n receivedEventId: string;\n subscription: JobListenerSubscription;\n}\n\nexport async function upsertListenerTriggeredDecision(\n params: UpsertListenerTriggeredDecisionParams,\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n ...listenerDecisionIdentity(params),\n decision: 'triggered',\n runId: null,\n runName: null,\n reason: null,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision: 'triggered', runId: null, runName: null, reason: null},\n });\n}\n\nexport interface UpsertListenerFailedDecisionParams {\n receivedEventId: string;\n subscription: JobListenerSubscription;\n reason: string;\n}\n\nexport async function upsertListenerFilterErrorDecision(\n params: UpsertListenerFailedDecisionParams,\n): Promise<void> {\n await upsertListenerFailedDecision(params, 'filter-error');\n}\n\nexport async function upsertListenerDispatchErrorDecision(\n params: UpsertListenerFailedDecisionParams,\n): Promise<void> {\n await upsertListenerFailedDecision(params, 'dispatch-error');\n}\n\nasync function upsertListenerFailedDecision(\n params: UpsertListenerFailedDecisionParams,\n decision: 'filter-error' | 'dispatch-error',\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n ...listenerDecisionIdentity(params),\n decision,\n reason: params.reason,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision, reason: params.reason, runId: null, runName: null},\n setWhere: ne(triggersDecisions.decision, 'triggered'),\n });\n}\n\nfunction listenerDecisionIdentity(params: {\n receivedEventId: string;\n subscription: JobListenerSubscription;\n}) {\n const {subscription} = params;\n return {\n receivedEventId: params.receivedEventId,\n subscriptionKind: 'listener' as const,\n subscriptionId: subscription.id,\n subscriptionName: listenerSubscriptionName(subscription),\n workflowDefinitionId: null,\n projectId: null,\n workflowRunId: subscription.workflowRunId,\n jobId: subscription.jobId,\n matcherKind: subscription.kind,\n matcherOrdinal: subscription.matcherOrdinal,\n };\n}\n\nfunction listenerSubscriptionName(subscription: JobListenerSubscription): string {\n return `listener ${subscription.kind}[${subscription.matcherOrdinal}] ${subscription.source}/${subscription.event}`;\n}\n"],"names":["and","eq","ne","notInArray","sql","db","triggersDecisions","triggersReceivedEvents","insertReceivedEvent","params","inserted","insert","values","eventRef","origin","workspaceId","provider","source","event","deliveryId","connectionId","connectionName","payload","receivedAt","onConflictDoNothing","target","returning","id","existing","select","from","where","Error","markReceivedEventDiscarded","update","set","outcome","matchedCount","processedAt","Date","markReceivedEventRouted","markReceivedEventFailed","markReceivedEventErrored","receivedEventId","decision","upsertTriggeredDecision","subscriptionKind","subscriptionId","subscription","subscriptionName","name","workflowDefinitionId","projectId","runId","run","runName","reason","onConflictDoUpdate","upsertFilterErrorDecision","upsertFailedDecision","upsertDispatchErrorDecision","setWhere","upsertListenerTriggeredDecision","listenerDecisionIdentity","upsertListenerFilterErrorDecision","upsertListenerFailedDecision","upsertListenerDispatchErrorDecision","listenerSubscriptionName","workflowRunId","jobId","matcherKind","kind","matcherOrdinal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/db/event-history.ts"],"sourcesContent":["import {and, eq, ne, notInArray, sql} from 'drizzle-orm';\nimport type {JobListenerSubscription} from '#core/entities/job-listener-subscription.js';\nimport type {TriggerEventOrigin} from '#core/entities/received-event.js';\nimport type {TriggerSubscription} from '#core/entities/subscription.js';\nimport {db} from './db.js';\nimport {triggersDecisions} from './schema/decisions.js';\nimport {triggersReceivedEvents} from './schema/received-events.js';\n\nexport interface InsertReceivedEventParams {\n eventRef: string;\n origin: TriggerEventOrigin;\n workspaceId: string;\n provider: string | null;\n source: string;\n event: string;\n deliveryId: string | null;\n connectionId: string | null;\n connectionName: string | null;\n payload: Record<string, unknown> | null;\n receivedAt: Date;\n}\n\n// `event_ref` is unique and delivery is at-least-once, so the same event can\n// arrive twice; either path returns the row id used to attach decisions.\nexport async function insertReceivedEvent(params: InsertReceivedEventParams): Promise<string> {\n const [inserted] = await db()\n .insert(triggersReceivedEvents)\n .values({\n eventRef: params.eventRef,\n origin: params.origin,\n workspaceId: params.workspaceId,\n provider: params.provider,\n source: params.source,\n event: params.event,\n deliveryId: params.deliveryId,\n connectionId: params.connectionId,\n connectionName: params.connectionName,\n payload: params.payload,\n receivedAt: params.receivedAt,\n })\n .onConflictDoNothing({target: triggersReceivedEvents.eventRef})\n .returning({id: triggersReceivedEvents.id});\n if (inserted) return inserted.id;\n\n const [existing] = await db()\n .select({id: triggersReceivedEvents.id})\n .from(triggersReceivedEvents)\n .where(eq(triggersReceivedEvents.eventRef, params.eventRef));\n if (!existing) {\n throw new Error(`received_events row missing after conflict for event_ref ${params.eventRef}`);\n }\n return existing.id;\n}\n\nexport async function markReceivedEventDiscarded(id: string): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({outcome: 'discarded', matchedCount: 0, processedAt: new Date()})\n .where(\n and(\n eq(triggersReceivedEvents.id, id),\n notInArray(triggersReceivedEvents.outcome, ['routed', 'errored']),\n ),\n );\n}\n\nexport async function markReceivedEventRouted(id: string, matchedCount: number): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({outcome: 'routed', matchedCount, processedAt: new Date()})\n .where(eq(triggersReceivedEvents.id, id));\n}\n\n// No processedAt: `failed` is transient. Under at-least-once dispatch, a late\n// failure must not clobber a sibling invocation's terminal outcome.\nexport async function markReceivedEventFailed(id: string, matchedCount: number): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({outcome: 'failed', matchedCount})\n .where(\n and(\n eq(triggersReceivedEvents.id, id),\n notInArray(triggersReceivedEvents.outcome, ['routed', 'discarded', 'errored']),\n ),\n );\n}\n\n// Terminal outcome for a fan-out that produced no new run this pass. The CASE is a\n// cross-attempt safety net: under at-least-once delivery a prior attempt may already have\n// created a run (its decision row is `triggered`, which is never downgraded), so promote the\n// event to `routed` rather than falsely record `errored`. Guarded so it never downgrades a\n// terminal success.\nexport async function markReceivedEventErrored(id: string, matchedCount: number): Promise<void> {\n await db()\n .update(triggersReceivedEvents)\n .set({\n outcome: sql`CASE WHEN EXISTS (\n SELECT 1\n FROM ${triggersDecisions}\n WHERE ${triggersDecisions.receivedEventId} = ${triggersReceivedEvents.id}\n AND ${triggersDecisions.decision} = 'triggered'\n ) THEN 'routed' ELSE 'errored' END`,\n matchedCount,\n processedAt: new Date(),\n })\n .where(\n and(\n eq(triggersReceivedEvents.id, id),\n notInArray(triggersReceivedEvents.outcome, ['routed', 'discarded']),\n ),\n );\n}\n\nexport interface UpsertTriggeredDecisionParams {\n receivedEventId: string;\n subscription: TriggerSubscription;\n run: {id: string; name: string};\n}\n\nexport async function upsertTriggeredDecision(\n params: UpsertTriggeredDecisionParams,\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n receivedEventId: params.receivedEventId,\n subscriptionKind: 'trigger',\n subscriptionId: params.subscription.id,\n subscriptionName: params.subscription.name,\n workflowDefinitionId: params.subscription.workflowDefinitionId,\n projectId: params.subscription.projectId,\n decision: 'triggered',\n runId: params.run.id,\n runName: params.run.name,\n reason: null,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision: 'triggered', runId: params.run.id, runName: params.run.name, reason: null},\n });\n}\n\nexport interface UpsertFailedDecisionParams {\n receivedEventId: string;\n subscription: TriggerSubscription;\n reason: string;\n}\n\nexport async function upsertFilterErrorDecision(params: UpsertFailedDecisionParams): Promise<void> {\n await upsertFailedDecision(params, 'filter-error');\n}\n\n// A created run is ground truth. A later retry failure must not erase it.\nexport async function upsertDispatchErrorDecision(\n params: UpsertFailedDecisionParams,\n): Promise<void> {\n await upsertFailedDecision(params, 'dispatch-error');\n}\n\nasync function upsertFailedDecision(\n params: UpsertFailedDecisionParams,\n decision: 'filter-error' | 'dispatch-error',\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n receivedEventId: params.receivedEventId,\n subscriptionKind: 'trigger',\n subscriptionId: params.subscription.id,\n subscriptionName: params.subscription.name,\n workflowDefinitionId: params.subscription.workflowDefinitionId,\n projectId: params.subscription.projectId,\n decision,\n reason: params.reason,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision, reason: params.reason, runId: null, runName: null},\n setWhere: ne(triggersDecisions.decision, 'triggered'),\n });\n}\n\nexport interface UpsertListenerTriggeredDecisionParams {\n receivedEventId: string;\n subscription: JobListenerSubscription;\n}\n\nexport async function upsertListenerTriggeredDecision(\n params: UpsertListenerTriggeredDecisionParams,\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n ...listenerDecisionIdentity(params),\n decision: 'triggered',\n runId: null,\n runName: null,\n reason: null,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision: 'triggered', runId: null, runName: null, reason: null},\n });\n}\n\nexport interface UpsertListenerFailedDecisionParams {\n receivedEventId: string;\n subscription: JobListenerSubscription;\n reason: string;\n}\n\nexport async function upsertListenerFilterErrorDecision(\n params: UpsertListenerFailedDecisionParams,\n): Promise<void> {\n await upsertListenerFailedDecision(params, 'filter-error');\n}\n\nexport async function upsertListenerDispatchErrorDecision(\n params: UpsertListenerFailedDecisionParams,\n): Promise<void> {\n await upsertListenerFailedDecision(params, 'dispatch-error');\n}\n\nasync function upsertListenerFailedDecision(\n params: UpsertListenerFailedDecisionParams,\n decision: 'filter-error' | 'dispatch-error',\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n ...listenerDecisionIdentity(params),\n decision,\n reason: params.reason,\n })\n .onConflictDoUpdate({\n target: [\n triggersDecisions.receivedEventId,\n triggersDecisions.subscriptionKind,\n triggersDecisions.subscriptionId,\n ],\n set: {decision, reason: params.reason, runId: null, runName: null},\n setWhere: ne(triggersDecisions.decision, 'triggered'),\n });\n}\n\nfunction listenerDecisionIdentity(params: {\n receivedEventId: string;\n subscription: JobListenerSubscription;\n}) {\n const {subscription} = params;\n return {\n receivedEventId: params.receivedEventId,\n subscriptionKind: 'listener' as const,\n subscriptionId: subscription.id,\n subscriptionName: listenerSubscriptionName(subscription),\n workflowDefinitionId: null,\n projectId: null,\n workflowRunId: subscription.workflowRunId,\n jobId: subscription.jobId,\n matcherKind: subscription.kind,\n matcherOrdinal: subscription.matcherOrdinal,\n };\n}\n\nfunction listenerSubscriptionName(subscription: JobListenerSubscription): string {\n // A NULL event is a source subscription; `*` keeps the audit name unambiguous.\n return `listener ${subscription.kind}[${subscription.matcherOrdinal}] ${subscription.source}/${subscription.event ?? '*'}`;\n}\n\nexport interface UpsertDevTriggeredDecisionParams {\n receivedEventId: string;\n triggerKey: string;\n workflowDefinitionId: string;\n run: {id: string; name: string};\n}\n\n// A dev journal entry has exactly one decision. Its partial unique index uses\n// received_event_id because NULL subscription ids do not conflict in the\n// regular subscription identity index.\nexport async function upsertDevTriggeredDecision(\n params: UpsertDevTriggeredDecisionParams,\n): Promise<void> {\n await upsertDevDecision(params, {\n decision: 'triggered',\n runId: params.run.id,\n runName: params.run.name,\n reason: null,\n });\n}\n\nexport interface UpsertDevFilterErrorDecisionParams {\n receivedEventId: string;\n triggerKey: string;\n workflowDefinitionId: string;\n reason: string;\n}\n\n// Refusals before run creation (filter false or evaluation error on replay).\nexport async function upsertDevFilterErrorDecision(\n params: UpsertDevFilterErrorDecisionParams,\n): Promise<void> {\n await upsertDevDecision(\n params,\n {\n decision: 'filter-error',\n runId: null,\n runName: null,\n reason: params.reason,\n },\n {preserveTriggered: true},\n );\n}\n\ntype DevDecisionValues = {\n decision: 'triggered' | 'filter-error';\n runId: string | null;\n runName: string | null;\n reason: string | null;\n};\n\nasync function upsertDevDecision(\n params: {\n receivedEventId: string;\n triggerKey: string;\n workflowDefinitionId: string;\n },\n values: DevDecisionValues,\n options: {preserveTriggered?: boolean} = {},\n): Promise<void> {\n await db()\n .insert(triggersDecisions)\n .values({\n receivedEventId: params.receivedEventId,\n subscriptionKind: 'dev',\n subscriptionId: null,\n subscriptionName: params.triggerKey,\n workflowDefinitionId: params.workflowDefinitionId,\n projectId: null,\n decision: values.decision,\n runId: values.runId,\n runName: values.runName,\n reason: values.reason,\n })\n .onConflictDoUpdate({\n target: triggersDecisions.receivedEventId,\n targetWhere: sql`\"subscription_kind\" = 'dev'`,\n set: values,\n ...(options.preserveTriggered ? {setWhere: ne(triggersDecisions.decision, 'triggered')} : {}),\n });\n}\n"],"names":["and","eq","ne","notInArray","sql","db","triggersDecisions","triggersReceivedEvents","insertReceivedEvent","params","inserted","insert","values","eventRef","origin","workspaceId","provider","source","event","deliveryId","connectionId","connectionName","payload","receivedAt","onConflictDoNothing","target","returning","id","existing","select","from","where","Error","markReceivedEventDiscarded","update","set","outcome","matchedCount","processedAt","Date","markReceivedEventRouted","markReceivedEventFailed","markReceivedEventErrored","receivedEventId","decision","upsertTriggeredDecision","subscriptionKind","subscriptionId","subscription","subscriptionName","name","workflowDefinitionId","projectId","runId","run","runName","reason","onConflictDoUpdate","upsertFilterErrorDecision","upsertFailedDecision","upsertDispatchErrorDecision","setWhere","upsertListenerTriggeredDecision","listenerDecisionIdentity","upsertListenerFilterErrorDecision","upsertListenerFailedDecision","upsertListenerDispatchErrorDecision","listenerSubscriptionName","workflowRunId","jobId","matcherKind","kind","matcherOrdinal","upsertDevTriggeredDecision","upsertDevDecision","upsertDevFilterErrorDecision","preserveTriggered","options","triggerKey","targetWhere"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TriggerDecision } from '#core/entities/decision.js';
|
|
2
|
-
import type { TriggerEventOutcome, TriggerReceivedEvent, TriggerReceivedEventSummary } from '#core/entities/received-event.js';
|
|
2
|
+
import type { TriggerEventOrigin, TriggerEventOutcome, TriggerEventReplay, TriggerReceivedEvent, TriggerReceivedEventSummary } from '#core/entities/received-event.js';
|
|
3
3
|
export interface TriggerEventCursor {
|
|
4
4
|
receivedAt: Date;
|
|
5
5
|
id: string;
|
|
@@ -7,7 +7,9 @@ export interface TriggerEventCursor {
|
|
|
7
7
|
export interface TriggerEventListFilters {
|
|
8
8
|
source?: string[] | undefined;
|
|
9
9
|
event?: string[] | undefined;
|
|
10
|
+
origins?: TriggerEventOrigin[] | undefined;
|
|
10
11
|
outcomes?: TriggerEventOutcome[] | undefined;
|
|
12
|
+
replayable?: boolean | undefined;
|
|
11
13
|
from?: Date | undefined;
|
|
12
14
|
to?: Date | undefined;
|
|
13
15
|
}
|
|
@@ -30,9 +32,11 @@ export interface TriggerEventFacet {
|
|
|
30
32
|
export interface ListTriggerEventFacetsResult {
|
|
31
33
|
sources: TriggerEventFacet[];
|
|
32
34
|
events: TriggerEventFacet[];
|
|
35
|
+
origins: TriggerEventFacet[];
|
|
33
36
|
}
|
|
34
37
|
export declare function listTriggerEventFacets(params: {
|
|
35
38
|
workspaceId: string;
|
|
36
39
|
}): Promise<ListTriggerEventFacetsResult>;
|
|
40
|
+
export declare function listReplaysOfTriggerEvent(eventId: string, workspaceId: string): Promise<TriggerEventReplay[]>;
|
|
37
41
|
export declare function listDecisionsByReceivedEventId(receivedEventId: string): Promise<TriggerDecision[]>;
|
|
38
42
|
//# sourceMappingURL=event-queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-queries.d.ts","sourceRoot":"","sources":["../../src/db/event-queries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,kCAAkC,CAAC;AAU1C,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,IAAI,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAC7C,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,EAAE,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"event-queries.d.ts","sourceRoot":"","sources":["../../src/db/event-queries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,kCAAkC,CAAC;AAU1C,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,IAAI,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,OAAO,CAAC,EAAE,kBAAkB,EAAE,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAC7C,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,EAAE,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACvC;AA6BD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAgBlC;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAO/F;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAmBD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAOxC;AAKD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA+B/B;AAID,wBAAsB,8BAA8B,CAClD,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAO5B"}
|
package/dist/db/event-queries.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { paginateTimestampIdRows, timestampIdCursorWhere } from '@shipfox/node-drizzle';
|
|
2
|
-
import { and, asc, count, desc, eq, gte, inArray, lte } from 'drizzle-orm';
|
|
2
|
+
import { and, asc, count, desc, eq, gte, inArray, isNotNull, lte } from 'drizzle-orm';
|
|
3
3
|
import { db } from './db.js';
|
|
4
4
|
import { toTriggerDecision, triggersDecisions } from './schema/decisions.js';
|
|
5
5
|
import { toTriggerReceivedEvent, toTriggerReceivedEventSummary, triggerReceivedEventSummaryColumns, triggersReceivedEvents } from './schema/received-events.js';
|
|
@@ -19,7 +19,14 @@ function listConditions(params) {
|
|
|
19
19
|
if (cursorCondition) conditions.push(cursorCondition);
|
|
20
20
|
if (filters?.source?.length) conditions.push(inArray(triggersReceivedEvents.source, filters.source));
|
|
21
21
|
if (filters?.event?.length) conditions.push(inArray(triggersReceivedEvents.event, filters.event));
|
|
22
|
+
if (filters?.origins?.length) conditions.push(inArray(triggersReceivedEvents.origin, filters.origins));
|
|
22
23
|
if (filters?.outcomes?.length) conditions.push(inArray(triggersReceivedEvents.outcome, filters.outcomes));
|
|
24
|
+
// `replayable` is the picker's convenience filter: integration events with a
|
|
25
|
+
// stored payload are the only ones a dev run can replay.
|
|
26
|
+
if (filters?.replayable) {
|
|
27
|
+
conditions.push(eq(triggersReceivedEvents.origin, 'integration'));
|
|
28
|
+
conditions.push(isNotNull(triggersReceivedEvents.payload));
|
|
29
|
+
}
|
|
23
30
|
if (filters?.from) conditions.push(gte(triggersReceivedEvents.receivedAt, filters.from));
|
|
24
31
|
if (filters?.to) conditions.push(lte(triggersReceivedEvents.receivedAt, filters.to));
|
|
25
32
|
return conditions;
|
|
@@ -59,15 +66,34 @@ async function listFacet(workspaceId, column) {
|
|
|
59
66
|
}));
|
|
60
67
|
}
|
|
61
68
|
export async function listTriggerEventFacets(params) {
|
|
62
|
-
const [sources, events] = await Promise.all([
|
|
69
|
+
const [sources, events, origins] = await Promise.all([
|
|
63
70
|
listFacet(params.workspaceId, triggersReceivedEvents.source),
|
|
64
|
-
listFacet(params.workspaceId, triggersReceivedEvents.event)
|
|
71
|
+
listFacet(params.workspaceId, triggersReceivedEvents.event),
|
|
72
|
+
listFacet(params.workspaceId, triggersReceivedEvents.origin)
|
|
65
73
|
]);
|
|
66
74
|
return {
|
|
67
75
|
sources,
|
|
68
|
-
events
|
|
76
|
+
events,
|
|
77
|
+
origins
|
|
69
78
|
};
|
|
70
79
|
}
|
|
80
|
+
// The workspace predicate mirrors the route's workspace gate: replay links are
|
|
81
|
+
// deliberately FK-less, so the back-direction lookup must not surface a replay
|
|
82
|
+
// row that another workspace's writer pointed at this event id.
|
|
83
|
+
export async function listReplaysOfTriggerEvent(eventId, workspaceId) {
|
|
84
|
+
const rows = await db().select({
|
|
85
|
+
id: triggersReceivedEvents.id,
|
|
86
|
+
receivedAt: triggersReceivedEvents.receivedAt,
|
|
87
|
+
outcome: triggersReceivedEvents.outcome,
|
|
88
|
+
runId: triggersDecisions.runId
|
|
89
|
+
}).from(triggersReceivedEvents).leftJoin(triggersDecisions, and(eq(triggersDecisions.receivedEventId, triggersReceivedEvents.id), eq(triggersDecisions.subscriptionKind, 'dev'))).where(and(eq(triggersReceivedEvents.replayOfEventId, eventId), eq(triggersReceivedEvents.workspaceId, workspaceId), eq(triggersReceivedEvents.origin, 'dev'))).orderBy(desc(triggersReceivedEvents.receivedAt), desc(triggersReceivedEvents.id));
|
|
90
|
+
return rows.map((row)=>({
|
|
91
|
+
id: row.id,
|
|
92
|
+
receivedAt: row.receivedAt,
|
|
93
|
+
outcome: row.outcome,
|
|
94
|
+
runId: row.runId
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
71
97
|
// `received_event_id` is a globally-unique uuid, so the parent-event lookup is the
|
|
72
98
|
// workspace gate; the decision query needs no separate workspace predicate.
|
|
73
99
|
export async function listDecisionsByReceivedEventId(receivedEventId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/event-queries.ts"],"sourcesContent":["import {paginateTimestampIdRows, timestampIdCursorWhere} from '@shipfox/node-drizzle';\nimport {and, asc, count, desc, eq, gte, inArray, lte, type SQL} from 'drizzle-orm';\nimport type {PgColumn} from 'drizzle-orm/pg-core';\nimport type {TriggerDecision} from '#core/entities/decision.js';\nimport type {\n TriggerEventOutcome,\n TriggerReceivedEvent,\n TriggerReceivedEventSummary,\n} from '#core/entities/received-event.js';\nimport {db} from './db.js';\nimport {toTriggerDecision, triggersDecisions} from './schema/decisions.js';\nimport {\n toTriggerReceivedEvent,\n toTriggerReceivedEventSummary,\n triggerReceivedEventSummaryColumns,\n triggersReceivedEvents,\n} from './schema/received-events.js';\n\nexport interface TriggerEventCursor {\n receivedAt: Date;\n id: string;\n}\n\nexport interface TriggerEventListFilters {\n source?: string[] | undefined;\n event?: string[] | undefined;\n outcomes?: TriggerEventOutcome[] | undefined;\n from?: Date | undefined;\n to?: Date | undefined;\n}\n\nexport interface ListTriggerEventsParams {\n workspaceId: string;\n limit: number;\n cursor?: TriggerEventCursor | undefined;\n filters?: TriggerEventListFilters | undefined;\n}\n\nexport interface ListTriggerEventsResult {\n events: TriggerReceivedEventSummary[];\n nextCursor: TriggerEventCursor | null;\n}\n\nfunction listConditions(params: ListTriggerEventsParams): SQL[] {\n const {workspaceId, cursor, filters} = params;\n const conditions: SQL[] = [eq(triggersReceivedEvents.workspaceId, workspaceId)];\n const cursorCondition = timestampIdCursorWhere({\n timestampColumn: triggersReceivedEvents.receivedAt,\n idColumn: triggersReceivedEvents.id,\n cursor: cursor ? {createdAt: cursor.receivedAt, id: cursor.id} : undefined,\n });\n if (cursorCondition) conditions.push(cursorCondition);\n if (filters?.source?.length)\n conditions.push(inArray(triggersReceivedEvents.source, filters.source));\n if (filters?.event?.length) conditions.push(inArray(triggersReceivedEvents.event, filters.event));\n if (filters?.outcomes?.length)\n conditions.push(inArray(triggersReceivedEvents.outcome, filters.outcomes));\n if (filters?.from) conditions.push(gte(triggersReceivedEvents.receivedAt, filters.from));\n if (filters?.to) conditions.push(lte(triggersReceivedEvents.receivedAt, filters.to));\n return conditions;\n}\n\nexport async function listTriggerEvents(\n params: ListTriggerEventsParams,\n): Promise<ListTriggerEventsResult> {\n const rows = await db()\n .select(triggerReceivedEventSummaryColumns)\n .from(triggersReceivedEvents)\n .where(and(...listConditions(params)))\n .orderBy(desc(triggersReceivedEvents.receivedAt), desc(triggersReceivedEvents.id))\n .limit(params.limit + 1);\n\n const page = paginateTimestampIdRows({rows, limit: params.limit, timestampKey: 'receivedAt'});\n\n return {\n events: page.pageRows.map(toTriggerReceivedEventSummary),\n nextCursor: page.nextCursor\n ? {receivedAt: page.nextCursor.createdAt, id: page.nextCursor.id}\n : null,\n };\n}\n\nexport async function getTriggerEventById(id: string): Promise<TriggerReceivedEvent | undefined> {\n const [row] = await db()\n .select()\n .from(triggersReceivedEvents)\n .where(eq(triggersReceivedEvents.id, id))\n .limit(1);\n return row ? toTriggerReceivedEvent(row) : undefined;\n}\n\nexport interface TriggerEventFacet {\n value: string;\n count: number;\n}\n\nexport interface ListTriggerEventFacetsResult {\n sources: TriggerEventFacet[];\n events: TriggerEventFacet[];\n}\n\n// Distinct filter values for a workspace, capped so one noisy integration can't flood\n// the dropdown. Workspace-unfiltered by design: a stable option list, not one that\n// shifts as the other filters change. The (workspace_id, source) / (workspace_id, event)\n// indexes back the group-by. Ties break on the value so the order is deterministic.\nconst FACET_LIMIT = 50;\n\nasync function listFacet(workspaceId: string, column: PgColumn): Promise<TriggerEventFacet[]> {\n const rows = await db()\n .select({value: column, count: count()})\n .from(triggersReceivedEvents)\n .where(eq(triggersReceivedEvents.workspaceId, workspaceId))\n .groupBy(column)\n .orderBy(desc(count()), asc(column))\n .limit(FACET_LIMIT);\n return rows.map((row) => ({value: row.value as string, count: Number(row.count)}));\n}\n\nexport async function listTriggerEventFacets(params: {\n workspaceId: string;\n}): Promise<ListTriggerEventFacetsResult> {\n const [sources, events] = await Promise.all([\n listFacet(params.workspaceId, triggersReceivedEvents.source),\n listFacet(params.workspaceId, triggersReceivedEvents.event),\n ]);\n return {sources, events};\n}\n\n// `received_event_id` is a globally-unique uuid, so the parent-event lookup is the\n// workspace gate; the decision query needs no separate workspace predicate.\nexport async function listDecisionsByReceivedEventId(\n receivedEventId: string,\n): Promise<TriggerDecision[]> {\n const rows = await db()\n .select()\n .from(triggersDecisions)\n .where(eq(triggersDecisions.receivedEventId, receivedEventId))\n .orderBy(asc(triggersDecisions.createdAt), asc(triggersDecisions.id));\n return rows.map(toTriggerDecision);\n}\n"],"names":["paginateTimestampIdRows","timestampIdCursorWhere","and","asc","count","desc","eq","gte","inArray","lte","db","toTriggerDecision","triggersDecisions","toTriggerReceivedEvent","toTriggerReceivedEventSummary","triggerReceivedEventSummaryColumns","triggersReceivedEvents","listConditions","params","workspaceId","cursor","filters","conditions","cursorCondition","timestampColumn","receivedAt","idColumn","id","createdAt","undefined","push","source","length","event","outcomes","outcome","from","to","listTriggerEvents","rows","select","where","orderBy","limit","page","timestampKey","events","pageRows","map","nextCursor","getTriggerEventById","row","FACET_LIMIT","listFacet","column","value","groupBy","Number","listTriggerEventFacets","sources","Promise","all","listDecisionsByReceivedEventId","receivedEventId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/db/event-queries.ts"],"sourcesContent":["import {paginateTimestampIdRows, timestampIdCursorWhere} from '@shipfox/node-drizzle';\nimport {and, asc, count, desc, eq, gte, inArray, isNotNull, lte, type SQL} from 'drizzle-orm';\nimport type {PgColumn} from 'drizzle-orm/pg-core';\nimport type {TriggerDecision} from '#core/entities/decision.js';\nimport type {\n TriggerEventOrigin,\n TriggerEventOutcome,\n TriggerEventReplay,\n TriggerReceivedEvent,\n TriggerReceivedEventSummary,\n} from '#core/entities/received-event.js';\nimport {db} from './db.js';\nimport {toTriggerDecision, triggersDecisions} from './schema/decisions.js';\nimport {\n toTriggerReceivedEvent,\n toTriggerReceivedEventSummary,\n triggerReceivedEventSummaryColumns,\n triggersReceivedEvents,\n} from './schema/received-events.js';\n\nexport interface TriggerEventCursor {\n receivedAt: Date;\n id: string;\n}\n\nexport interface TriggerEventListFilters {\n source?: string[] | undefined;\n event?: string[] | undefined;\n origins?: TriggerEventOrigin[] | undefined;\n outcomes?: TriggerEventOutcome[] | undefined;\n replayable?: boolean | undefined;\n from?: Date | undefined;\n to?: Date | undefined;\n}\n\nexport interface ListTriggerEventsParams {\n workspaceId: string;\n limit: number;\n cursor?: TriggerEventCursor | undefined;\n filters?: TriggerEventListFilters | undefined;\n}\n\nexport interface ListTriggerEventsResult {\n events: TriggerReceivedEventSummary[];\n nextCursor: TriggerEventCursor | null;\n}\n\nfunction listConditions(params: ListTriggerEventsParams): SQL[] {\n const {workspaceId, cursor, filters} = params;\n const conditions: SQL[] = [eq(triggersReceivedEvents.workspaceId, workspaceId)];\n const cursorCondition = timestampIdCursorWhere({\n timestampColumn: triggersReceivedEvents.receivedAt,\n idColumn: triggersReceivedEvents.id,\n cursor: cursor ? {createdAt: cursor.receivedAt, id: cursor.id} : undefined,\n });\n if (cursorCondition) conditions.push(cursorCondition);\n if (filters?.source?.length)\n conditions.push(inArray(triggersReceivedEvents.source, filters.source));\n if (filters?.event?.length) conditions.push(inArray(triggersReceivedEvents.event, filters.event));\n if (filters?.origins?.length)\n conditions.push(inArray(triggersReceivedEvents.origin, filters.origins));\n if (filters?.outcomes?.length)\n conditions.push(inArray(triggersReceivedEvents.outcome, filters.outcomes));\n // `replayable` is the picker's convenience filter: integration events with a\n // stored payload are the only ones a dev run can replay.\n if (filters?.replayable) {\n conditions.push(eq(triggersReceivedEvents.origin, 'integration'));\n conditions.push(isNotNull(triggersReceivedEvents.payload));\n }\n if (filters?.from) conditions.push(gte(triggersReceivedEvents.receivedAt, filters.from));\n if (filters?.to) conditions.push(lte(triggersReceivedEvents.receivedAt, filters.to));\n return conditions;\n}\n\nexport async function listTriggerEvents(\n params: ListTriggerEventsParams,\n): Promise<ListTriggerEventsResult> {\n const rows = await db()\n .select(triggerReceivedEventSummaryColumns)\n .from(triggersReceivedEvents)\n .where(and(...listConditions(params)))\n .orderBy(desc(triggersReceivedEvents.receivedAt), desc(triggersReceivedEvents.id))\n .limit(params.limit + 1);\n\n const page = paginateTimestampIdRows({rows, limit: params.limit, timestampKey: 'receivedAt'});\n\n return {\n events: page.pageRows.map(toTriggerReceivedEventSummary),\n nextCursor: page.nextCursor\n ? {receivedAt: page.nextCursor.createdAt, id: page.nextCursor.id}\n : null,\n };\n}\n\nexport async function getTriggerEventById(id: string): Promise<TriggerReceivedEvent | undefined> {\n const [row] = await db()\n .select()\n .from(triggersReceivedEvents)\n .where(eq(triggersReceivedEvents.id, id))\n .limit(1);\n return row ? toTriggerReceivedEvent(row) : undefined;\n}\n\nexport interface TriggerEventFacet {\n value: string;\n count: number;\n}\n\nexport interface ListTriggerEventFacetsResult {\n sources: TriggerEventFacet[];\n events: TriggerEventFacet[];\n origins: TriggerEventFacet[];\n}\n\n// Distinct filter values for a workspace, capped so one noisy integration can't flood\n// the dropdown. Workspace-unfiltered by design: a stable option list, not one that\n// shifts as the other filters change. The (workspace_id, source) / (workspace_id, event)\n// indexes back the group-by. Ties break on the value so the order is deterministic.\nconst FACET_LIMIT = 50;\n\nasync function listFacet(workspaceId: string, column: PgColumn): Promise<TriggerEventFacet[]> {\n const rows = await db()\n .select({value: column, count: count()})\n .from(triggersReceivedEvents)\n .where(eq(triggersReceivedEvents.workspaceId, workspaceId))\n .groupBy(column)\n .orderBy(desc(count()), asc(column))\n .limit(FACET_LIMIT);\n return rows.map((row) => ({value: row.value as string, count: Number(row.count)}));\n}\n\nexport async function listTriggerEventFacets(params: {\n workspaceId: string;\n}): Promise<ListTriggerEventFacetsResult> {\n const [sources, events, origins] = await Promise.all([\n listFacet(params.workspaceId, triggersReceivedEvents.source),\n listFacet(params.workspaceId, triggersReceivedEvents.event),\n listFacet(params.workspaceId, triggersReceivedEvents.origin),\n ]);\n return {sources, events, origins};\n}\n\n// The workspace predicate mirrors the route's workspace gate: replay links are\n// deliberately FK-less, so the back-direction lookup must not surface a replay\n// row that another workspace's writer pointed at this event id.\nexport async function listReplaysOfTriggerEvent(\n eventId: string,\n workspaceId: string,\n): Promise<TriggerEventReplay[]> {\n const rows = await db()\n .select({\n id: triggersReceivedEvents.id,\n receivedAt: triggersReceivedEvents.receivedAt,\n outcome: triggersReceivedEvents.outcome,\n runId: triggersDecisions.runId,\n })\n .from(triggersReceivedEvents)\n .leftJoin(\n triggersDecisions,\n and(\n eq(triggersDecisions.receivedEventId, triggersReceivedEvents.id),\n eq(triggersDecisions.subscriptionKind, 'dev'),\n ),\n )\n .where(\n and(\n eq(triggersReceivedEvents.replayOfEventId, eventId),\n eq(triggersReceivedEvents.workspaceId, workspaceId),\n eq(triggersReceivedEvents.origin, 'dev'),\n ),\n )\n .orderBy(desc(triggersReceivedEvents.receivedAt), desc(triggersReceivedEvents.id));\n\n return rows.map((row) => ({\n id: row.id,\n receivedAt: row.receivedAt,\n outcome: row.outcome,\n runId: row.runId,\n }));\n}\n\n// `received_event_id` is a globally-unique uuid, so the parent-event lookup is the\n// workspace gate; the decision query needs no separate workspace predicate.\nexport async function listDecisionsByReceivedEventId(\n receivedEventId: string,\n): Promise<TriggerDecision[]> {\n const rows = await db()\n .select()\n .from(triggersDecisions)\n .where(eq(triggersDecisions.receivedEventId, receivedEventId))\n .orderBy(asc(triggersDecisions.createdAt), asc(triggersDecisions.id));\n return rows.map(toTriggerDecision);\n}\n"],"names":["paginateTimestampIdRows","timestampIdCursorWhere","and","asc","count","desc","eq","gte","inArray","isNotNull","lte","db","toTriggerDecision","triggersDecisions","toTriggerReceivedEvent","toTriggerReceivedEventSummary","triggerReceivedEventSummaryColumns","triggersReceivedEvents","listConditions","params","workspaceId","cursor","filters","conditions","cursorCondition","timestampColumn","receivedAt","idColumn","id","createdAt","undefined","push","source","length","event","origins","origin","outcomes","outcome","replayable","payload","from","to","listTriggerEvents","rows","select","where","orderBy","limit","page","timestampKey","events","pageRows","map","nextCursor","getTriggerEventById","row","FACET_LIMIT","listFacet","column","value","groupBy","Number","listTriggerEventFacets","sources","Promise","all","listReplaysOfTriggerEvent","eventId","runId","leftJoin","receivedEventId","subscriptionKind","replayOfEventId","listDecisionsByReceivedEventId"],"mappings":"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"}
|
package/dist/db/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { advanceCronSchedule, claimDueCronSchedules, countDueCronSchedules, deleteCronScheduleForSubscription, getCronScheduleBySubscriptionId, syncCronSchedule, } from './cron-schedules.js';
|
|
2
2
|
export { closeDb, db, type Executor, schema, type Tx } from './db.js';
|
|
3
|
-
export { getTriggerEventById, type ListTriggerEventFacetsResult, type ListTriggerEventsParams, type ListTriggerEventsResult, listDecisionsByReceivedEventId, listTriggerEventFacets, listTriggerEvents, type TriggerEventCursor, type TriggerEventFacet, type TriggerEventListFilters, } from './event-queries.js';
|
|
3
|
+
export { getTriggerEventById, type ListTriggerEventFacetsResult, type ListTriggerEventsParams, type ListTriggerEventsResult, listDecisionsByReceivedEventId, listReplaysOfTriggerEvent, listTriggerEventFacets, listTriggerEvents, type TriggerEventCursor, type TriggerEventFacet, type TriggerEventListFilters, } from './event-queries.js';
|
|
4
4
|
export { type FindMatchingJobListenerSubscriptionsParams, findMatchingJobListenerSubscriptions, type ListenerMatcher, type ProjectJobListenerSubscriptionsParams, projectJobListenerSubscriptions, removeJobListenerSubscriptionsForJob, } from './job-listener-subscriptions.js';
|
|
5
5
|
export { type CronScheduleDb, type CronScheduleInsertDb, toCronSchedule, triggersCronSchedules, } from './schema/cron-schedules.js';
|
|
6
6
|
export { jobListenerSubscriptions } from './schema/job-listener-subscriptions.js';
|
package/dist/db/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,iCAAiC,EACjC,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAC,MAAM,SAAS,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,8BAA8B,EAC9B,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,0CAA0C,EAC/C,oCAAoC,EACpC,KAAK,eAAe,EACpB,KAAK,qCAAqC,EAC1C,+BAA+B,EAC/B,oCAAoC,GACrC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,cAAc,EACd,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,wBAAwB,EAAC,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,mCAAmC,EACnC,0BAA0B,EAC1B,wCAAwC,EACxC,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,iCAAiC,EACjC,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAC,MAAM,SAAS,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,8BAA8B,EAC9B,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,0CAA0C,EAC/C,oCAAoC,EACpC,KAAK,eAAe,EACpB,KAAK,qCAAqC,EAC1C,+BAA+B,EAC/B,oCAAoC,GACrC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,cAAc,EACd,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,wBAAwB,EAAC,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,mCAAmC,EACnC,0BAA0B,EAC1B,wCAAwC,EACxC,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|
package/dist/db/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { dirname, resolve } from 'node:path';
|
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
export { advanceCronSchedule, claimDueCronSchedules, countDueCronSchedules, deleteCronScheduleForSubscription, getCronScheduleBySubscriptionId, syncCronSchedule } from './cron-schedules.js';
|
|
4
4
|
export { closeDb, db, schema } from './db.js';
|
|
5
|
-
export { getTriggerEventById, listDecisionsByReceivedEventId, listTriggerEventFacets, listTriggerEvents } from './event-queries.js';
|
|
5
|
+
export { getTriggerEventById, listDecisionsByReceivedEventId, listReplaysOfTriggerEvent, listTriggerEventFacets, listTriggerEvents } from './event-queries.js';
|
|
6
6
|
export { findMatchingJobListenerSubscriptions, projectJobListenerSubscriptions, removeJobListenerSubscriptionsForJob } from './job-listener-subscriptions.js';
|
|
7
7
|
export { toCronSchedule, triggersCronSchedules } from './schema/cron-schedules.js';
|
|
8
8
|
export { jobListenerSubscriptions } from './schema/job-listener-subscriptions.js';
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {\n advanceCronSchedule,\n claimDueCronSchedules,\n countDueCronSchedules,\n deleteCronScheduleForSubscription,\n getCronScheduleBySubscriptionId,\n syncCronSchedule,\n} from './cron-schedules.js';\nexport {closeDb, db, type Executor, schema, type Tx} from './db.js';\nexport {\n getTriggerEventById,\n type ListTriggerEventFacetsResult,\n type ListTriggerEventsParams,\n type ListTriggerEventsResult,\n listDecisionsByReceivedEventId,\n listTriggerEventFacets,\n listTriggerEvents,\n type TriggerEventCursor,\n type TriggerEventFacet,\n type TriggerEventListFilters,\n} from './event-queries.js';\nexport {\n type FindMatchingJobListenerSubscriptionsParams,\n findMatchingJobListenerSubscriptions,\n type ListenerMatcher,\n type ProjectJobListenerSubscriptionsParams,\n projectJobListenerSubscriptions,\n removeJobListenerSubscriptionsForJob,\n} from './job-listener-subscriptions.js';\nexport {\n type CronScheduleDb,\n type CronScheduleInsertDb,\n toCronSchedule,\n triggersCronSchedules,\n} from './schema/cron-schedules.js';\nexport {jobListenerSubscriptions} from './schema/job-listener-subscriptions.js';\nexport {triggersOutbox} from './schema/outbox.js';\nexport {triggerSubscriptions} from './schema/subscriptions.js';\nexport {\n deleteSubscriptionsForDefinition,\n findMatchingSubscriptions,\n getManualSubscriptionByDefinitionId,\n getTriggerSubscriptionById,\n listSubscriptionsByWorkflowDefinitionIds,\n projectDefinitionTriggers,\n} from './subscriptions.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","advanceCronSchedule","claimDueCronSchedules","countDueCronSchedules","deleteCronScheduleForSubscription","getCronScheduleBySubscriptionId","syncCronSchedule","closeDb","db","schema","getTriggerEventById","listDecisionsByReceivedEventId","listTriggerEventFacets","listTriggerEvents","findMatchingJobListenerSubscriptions","projectJobListenerSubscriptions","removeJobListenerSubscriptionsForJob","toCronSchedule","triggersCronSchedules","jobListenerSubscriptions","triggersOutbox","triggerSubscriptions","deleteSubscriptionsForDefinition","findMatchingSubscriptions","getManualSubscriptionByDefinitionId","getTriggerSubscriptionById","listSubscriptionsByWorkflowDefinitionIds","projectDefinitionTriggers","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SACEC,mBAAmB,EACnBC,qBAAqB,EACrBC,qBAAqB,EACrBC,iCAAiC,EACjCC,+BAA+B,EAC/BC,gBAAgB,QACX,sBAAsB;AAC7B,SAAQC,OAAO,EAAEC,EAAE,EAAiBC,MAAM,QAAgB,UAAU;AACpE,SACEC,mBAAmB,EAInBC,8BAA8B,EAC9BC,sBAAsB,EACtBC,iBAAiB,QAIZ,qBAAqB;AAC5B,SAEEC,oCAAoC,EAGpCC,+BAA+B,EAC/BC,oCAAoC,QAC/B,kCAAkC;AACzC,SAGEC,cAAc,EACdC,qBAAqB,QAChB,6BAA6B;AACpC,SAAQC,wBAAwB,QAAO,yCAAyC;AAChF,SAAQC,cAAc,QAAO,qBAAqB;AAClD,SAAQC,oBAAoB,QAAO,4BAA4B;AAC/D,SACEC,gCAAgC,EAChCC,yBAAyB,EACzBC,mCAAmC,EACnCC,0BAA0B,EAC1BC,wCAAwC,EACxCC,yBAAyB,QACpB,qBAAqB;AAE5B,OAAO,MAAMC,
|
|
1
|
+
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {\n advanceCronSchedule,\n claimDueCronSchedules,\n countDueCronSchedules,\n deleteCronScheduleForSubscription,\n getCronScheduleBySubscriptionId,\n syncCronSchedule,\n} from './cron-schedules.js';\nexport {closeDb, db, type Executor, schema, type Tx} from './db.js';\nexport {\n getTriggerEventById,\n type ListTriggerEventFacetsResult,\n type ListTriggerEventsParams,\n type ListTriggerEventsResult,\n listDecisionsByReceivedEventId,\n listReplaysOfTriggerEvent,\n listTriggerEventFacets,\n listTriggerEvents,\n type TriggerEventCursor,\n type TriggerEventFacet,\n type TriggerEventListFilters,\n} from './event-queries.js';\nexport {\n type FindMatchingJobListenerSubscriptionsParams,\n findMatchingJobListenerSubscriptions,\n type ListenerMatcher,\n type ProjectJobListenerSubscriptionsParams,\n projectJobListenerSubscriptions,\n removeJobListenerSubscriptionsForJob,\n} from './job-listener-subscriptions.js';\nexport {\n type CronScheduleDb,\n type CronScheduleInsertDb,\n toCronSchedule,\n triggersCronSchedules,\n} from './schema/cron-schedules.js';\nexport {jobListenerSubscriptions} from './schema/job-listener-subscriptions.js';\nexport {triggersOutbox} from './schema/outbox.js';\nexport {triggerSubscriptions} from './schema/subscriptions.js';\nexport {\n deleteSubscriptionsForDefinition,\n findMatchingSubscriptions,\n getManualSubscriptionByDefinitionId,\n getTriggerSubscriptionById,\n listSubscriptionsByWorkflowDefinitionIds,\n projectDefinitionTriggers,\n} from './subscriptions.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","advanceCronSchedule","claimDueCronSchedules","countDueCronSchedules","deleteCronScheduleForSubscription","getCronScheduleBySubscriptionId","syncCronSchedule","closeDb","db","schema","getTriggerEventById","listDecisionsByReceivedEventId","listReplaysOfTriggerEvent","listTriggerEventFacets","listTriggerEvents","findMatchingJobListenerSubscriptions","projectJobListenerSubscriptions","removeJobListenerSubscriptionsForJob","toCronSchedule","triggersCronSchedules","jobListenerSubscriptions","triggersOutbox","triggerSubscriptions","deleteSubscriptionsForDefinition","findMatchingSubscriptions","getManualSubscriptionByDefinitionId","getTriggerSubscriptionById","listSubscriptionsByWorkflowDefinitionIds","projectDefinitionTriggers","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SACEC,mBAAmB,EACnBC,qBAAqB,EACrBC,qBAAqB,EACrBC,iCAAiC,EACjCC,+BAA+B,EAC/BC,gBAAgB,QACX,sBAAsB;AAC7B,SAAQC,OAAO,EAAEC,EAAE,EAAiBC,MAAM,QAAgB,UAAU;AACpE,SACEC,mBAAmB,EAInBC,8BAA8B,EAC9BC,yBAAyB,EACzBC,sBAAsB,EACtBC,iBAAiB,QAIZ,qBAAqB;AAC5B,SAEEC,oCAAoC,EAGpCC,+BAA+B,EAC/BC,oCAAoC,QAC/B,kCAAkC;AACzC,SAGEC,cAAc,EACdC,qBAAqB,QAChB,6BAA6B;AACpC,SAAQC,wBAAwB,QAAO,yCAAyC;AAChF,SAAQC,cAAc,QAAO,qBAAqB;AAClD,SAAQC,oBAAoB,QAAO,4BAA4B;AAC/D,SACEC,gCAAgC,EAChCC,yBAAyB,EACzBC,mCAAmC,EACnCC,0BAA0B,EAC1BC,wCAAwC,EACxCC,yBAAyB,QACpB,qBAAqB;AAE5B,OAAO,MAAMC,iBAAiB9B,QAAQD,QAAQE,cAAc,YAAY8B,GAAG,IAAI,iBAAiB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { JobListenerSubscription } from '#core/entities/job-listener-subscription.js';
|
|
2
2
|
export interface ListenerMatcher {
|
|
3
3
|
source: string;
|
|
4
|
-
event
|
|
4
|
+
event?: string | undefined;
|
|
5
5
|
inputs?: Readonly<Record<string, unknown>> | undefined;
|
|
6
6
|
filter?: string | undefined;
|
|
7
7
|
filter_snapshot?: Readonly<Record<string, unknown>> | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-listener-subscriptions.d.ts","sourceRoot":"","sources":["../../src/db/job-listener-subscriptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"job-listener-subscriptions.d.ts","sourceRoot":"","sources":["../../src/db/job-listener-subscriptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AAUrD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACvD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAChE,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACrE;AAED,MAAM,WAAW,qCAAqC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,IAAI,CAAC,CA+Cf;AA6BD,wBAAsB,oCAAoC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMzF;AAED,MAAM,WAAW,0CAA0C;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,oCAAoC,CACxD,MAAM,EAAE,0CAA0C,GACjD,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAYpC;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjF"}
|