@layered-loader/sqs 1.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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +433 -0
  3. package/dist/index.d.ts +13 -0
  4. package/dist/index.js +13 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/SqsGroupNotificationConsumer.d.ts +28 -0
  7. package/dist/lib/SqsGroupNotificationConsumer.js +107 -0
  8. package/dist/lib/SqsGroupNotificationConsumer.js.map +1 -0
  9. package/dist/lib/SqsGroupNotificationFactory.d.ts +22 -0
  10. package/dist/lib/SqsGroupNotificationFactory.js +40 -0
  11. package/dist/lib/SqsGroupNotificationFactory.js.map +1 -0
  12. package/dist/lib/SqsGroupNotificationPublisher.d.ts +38 -0
  13. package/dist/lib/SqsGroupNotificationPublisher.js +102 -0
  14. package/dist/lib/SqsGroupNotificationPublisher.js.map +1 -0
  15. package/dist/lib/SqsNotificationConsumer.d.ts +44 -0
  16. package/dist/lib/SqsNotificationConsumer.js +123 -0
  17. package/dist/lib/SqsNotificationConsumer.js.map +1 -0
  18. package/dist/lib/SqsNotificationFactory.d.ts +29 -0
  19. package/dist/lib/SqsNotificationFactory.js +40 -0
  20. package/dist/lib/SqsNotificationFactory.js.map +1 -0
  21. package/dist/lib/SqsNotificationPublisher.d.ts +39 -0
  22. package/dist/lib/SqsNotificationPublisher.js +109 -0
  23. package/dist/lib/SqsNotificationPublisher.js.map +1 -0
  24. package/dist/lib/channelNameResolver.d.ts +12 -0
  25. package/dist/lib/channelNameResolver.js +18 -0
  26. package/dist/lib/channelNameResolver.js.map +1 -0
  27. package/dist/lib/groupNotificationSchemas.d.ts +49 -0
  28. package/dist/lib/groupNotificationSchemas.js +31 -0
  29. package/dist/lib/groupNotificationSchemas.js.map +1 -0
  30. package/dist/lib/notificationSchemas.d.ts +66 -0
  31. package/dist/lib/notificationSchemas.js +40 -0
  32. package/dist/lib/notificationSchemas.js.map +1 -0
  33. package/dist/lib/triggers/AbstractSqsTrigger.d.ts +62 -0
  34. package/dist/lib/triggers/AbstractSqsTrigger.js +104 -0
  35. package/dist/lib/triggers/AbstractSqsTrigger.js.map +1 -0
  36. package/dist/lib/triggers/SqsGroupInvalidationTrigger.d.ts +39 -0
  37. package/dist/lib/triggers/SqsGroupInvalidationTrigger.js +46 -0
  38. package/dist/lib/triggers/SqsGroupInvalidationTrigger.js.map +1 -0
  39. package/dist/lib/triggers/SqsInvalidationTrigger.d.ts +56 -0
  40. package/dist/lib/triggers/SqsInvalidationTrigger.js +47 -0
  41. package/dist/lib/triggers/SqsInvalidationTrigger.js.map +1 -0
  42. package/dist/lib/triggers/dispatch.d.ts +19 -0
  43. package/dist/lib/triggers/dispatch.js +69 -0
  44. package/dist/lib/triggers/dispatch.js.map +1 -0
  45. package/dist/lib/triggers/types.d.ts +54 -0
  46. package/dist/lib/triggers/types.js +12 -0
  47. package/dist/lib/triggers/types.js.map +1 -0
  48. package/package.json +75 -0
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { CLEAR_COMMAND, NOTIFICATION_ID_FIELD, NOTIFICATION_TIMESTAMP_FIELD, NOTIFICATION_TYPE_FIELD } from './notificationSchemas.js';
3
+ export declare const DELETE_GROUP_COMMAND = "DELETE_GROUP";
4
+ export declare const DELETE_FROM_GROUP_COMMAND = "DELETE_FROM_GROUP";
5
+ export { CLEAR_COMMAND, NOTIFICATION_ID_FIELD, NOTIFICATION_TIMESTAMP_FIELD, NOTIFICATION_TYPE_FIELD, };
6
+ export declare const CLEAR_GROUP_NOTIFICATION_SCHEMA: z.ZodObject<{
7
+ type: z.ZodLiteral<"CLEAR">;
8
+ id: z.ZodString;
9
+ timestamp: z.ZodString;
10
+ originUuid: z.ZodString;
11
+ }, z.core.$strip>;
12
+ export declare const DELETE_GROUP_NOTIFICATION_SCHEMA: z.ZodObject<{
13
+ type: z.ZodLiteral<"DELETE_GROUP">;
14
+ group: z.ZodString;
15
+ id: z.ZodString;
16
+ timestamp: z.ZodString;
17
+ originUuid: z.ZodString;
18
+ }, z.core.$strip>;
19
+ export declare const DELETE_FROM_GROUP_NOTIFICATION_SCHEMA: z.ZodObject<{
20
+ type: z.ZodLiteral<"DELETE_FROM_GROUP">;
21
+ key: z.ZodString;
22
+ group: z.ZodString;
23
+ id: z.ZodString;
24
+ timestamp: z.ZodString;
25
+ originUuid: z.ZodString;
26
+ }, z.core.$strip>;
27
+ export type ClearGroupNotificationCommand = z.infer<typeof CLEAR_GROUP_NOTIFICATION_SCHEMA>;
28
+ export type DeleteGroupNotificationCommand = z.infer<typeof DELETE_GROUP_NOTIFICATION_SCHEMA>;
29
+ export type DeleteFromGroupNotificationCommand = z.infer<typeof DELETE_FROM_GROUP_NOTIFICATION_SCHEMA>;
30
+ export type GroupNotificationCommand = ClearGroupNotificationCommand | DeleteGroupNotificationCommand | DeleteFromGroupNotificationCommand;
31
+ export declare const GROUP_NOTIFICATION_SCHEMAS: readonly [z.ZodObject<{
32
+ type: z.ZodLiteral<"CLEAR">;
33
+ id: z.ZodString;
34
+ timestamp: z.ZodString;
35
+ originUuid: z.ZodString;
36
+ }, z.core.$strip>, z.ZodObject<{
37
+ type: z.ZodLiteral<"DELETE_GROUP">;
38
+ group: z.ZodString;
39
+ id: z.ZodString;
40
+ timestamp: z.ZodString;
41
+ originUuid: z.ZodString;
42
+ }, z.core.$strip>, z.ZodObject<{
43
+ type: z.ZodLiteral<"DELETE_FROM_GROUP">;
44
+ key: z.ZodString;
45
+ group: z.ZodString;
46
+ id: z.ZodString;
47
+ timestamp: z.ZodString;
48
+ originUuid: z.ZodString;
49
+ }, z.core.$strip>];
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import { CLEAR_COMMAND, NOTIFICATION_ID_FIELD, NOTIFICATION_TIMESTAMP_FIELD, NOTIFICATION_TYPE_FIELD, } from './notificationSchemas.js';
3
+ export const DELETE_GROUP_COMMAND = 'DELETE_GROUP';
4
+ export const DELETE_FROM_GROUP_COMMAND = 'DELETE_FROM_GROUP';
5
+ export { CLEAR_COMMAND, NOTIFICATION_ID_FIELD, NOTIFICATION_TIMESTAMP_FIELD, NOTIFICATION_TYPE_FIELD, };
6
+ const NOTIFICATION_BASE_SHAPE = {
7
+ id: z.string().uuid(),
8
+ timestamp: z.string().datetime(),
9
+ originUuid: z.string().uuid(),
10
+ };
11
+ export const CLEAR_GROUP_NOTIFICATION_SCHEMA = z.object({
12
+ ...NOTIFICATION_BASE_SHAPE,
13
+ type: z.literal(CLEAR_COMMAND),
14
+ });
15
+ export const DELETE_GROUP_NOTIFICATION_SCHEMA = z.object({
16
+ ...NOTIFICATION_BASE_SHAPE,
17
+ type: z.literal(DELETE_GROUP_COMMAND),
18
+ group: z.string(),
19
+ });
20
+ export const DELETE_FROM_GROUP_NOTIFICATION_SCHEMA = z.object({
21
+ ...NOTIFICATION_BASE_SHAPE,
22
+ type: z.literal(DELETE_FROM_GROUP_COMMAND),
23
+ key: z.string(),
24
+ group: z.string(),
25
+ });
26
+ export const GROUP_NOTIFICATION_SCHEMAS = [
27
+ CLEAR_GROUP_NOTIFICATION_SCHEMA,
28
+ DELETE_GROUP_NOTIFICATION_SCHEMA,
29
+ DELETE_FROM_GROUP_NOTIFICATION_SCHEMA,
30
+ ];
31
+ //# sourceMappingURL=groupNotificationSchemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupNotificationSchemas.js","sourceRoot":"","sources":["../../lib/groupNotificationSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,0BAA0B,CAAA;AAEjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAA;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAA;AAE5D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,GACxB,CAAA;AAED,MAAM,uBAAuB,GAAG;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAC9B,CAAA;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,GAAG,uBAAuB;IAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;CAC/B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,MAAM,CAAC;IACvD,GAAG,uBAAuB;IAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5D,GAAG,uBAAuB;IAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAA;AAaF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,+BAA+B;IAC/B,gCAAgC;IAChC,qCAAqC;CAC7B,CAAA"}
@@ -0,0 +1,66 @@
1
+ import { z } from 'zod';
2
+ export declare const CLEAR_COMMAND = "CLEAR";
3
+ export declare const DELETE_COMMAND = "DELETE";
4
+ export declare const DELETE_MANY_COMMAND = "DELETE_MANY";
5
+ export declare const SET_COMMAND = "SET";
6
+ export declare const NOTIFICATION_TYPE_FIELD = "type";
7
+ export declare const NOTIFICATION_ID_FIELD = "id";
8
+ export declare const NOTIFICATION_TIMESTAMP_FIELD = "timestamp";
9
+ export declare const CLEAR_NOTIFICATION_SCHEMA: z.ZodObject<{
10
+ type: z.ZodLiteral<"CLEAR">;
11
+ id: z.ZodString;
12
+ timestamp: z.ZodString;
13
+ originUuid: z.ZodString;
14
+ }, z.core.$strip>;
15
+ export declare const DELETE_NOTIFICATION_SCHEMA: z.ZodObject<{
16
+ type: z.ZodLiteral<"DELETE">;
17
+ key: z.ZodString;
18
+ id: z.ZodString;
19
+ timestamp: z.ZodString;
20
+ originUuid: z.ZodString;
21
+ }, z.core.$strip>;
22
+ export declare const DELETE_MANY_NOTIFICATION_SCHEMA: z.ZodObject<{
23
+ type: z.ZodLiteral<"DELETE_MANY">;
24
+ keys: z.ZodArray<z.ZodString>;
25
+ id: z.ZodString;
26
+ timestamp: z.ZodString;
27
+ originUuid: z.ZodString;
28
+ }, z.core.$strip>;
29
+ export declare const SET_NOTIFICATION_SCHEMA: z.ZodObject<{
30
+ type: z.ZodLiteral<"SET">;
31
+ key: z.ZodString;
32
+ value: z.ZodNullable<z.ZodUnknown>;
33
+ id: z.ZodString;
34
+ timestamp: z.ZodString;
35
+ originUuid: z.ZodString;
36
+ }, z.core.$strip>;
37
+ export type ClearNotificationCommand = z.infer<typeof CLEAR_NOTIFICATION_SCHEMA>;
38
+ export type DeleteNotificationCommand = z.infer<typeof DELETE_NOTIFICATION_SCHEMA>;
39
+ export type DeleteManyNotificationCommand = z.infer<typeof DELETE_MANY_NOTIFICATION_SCHEMA>;
40
+ export type SetNotificationCommand = z.infer<typeof SET_NOTIFICATION_SCHEMA>;
41
+ export type NotificationCommand = ClearNotificationCommand | DeleteNotificationCommand | DeleteManyNotificationCommand | SetNotificationCommand;
42
+ export declare const NOTIFICATION_SCHEMAS: readonly [z.ZodObject<{
43
+ type: z.ZodLiteral<"CLEAR">;
44
+ id: z.ZodString;
45
+ timestamp: z.ZodString;
46
+ originUuid: z.ZodString;
47
+ }, z.core.$strip>, z.ZodObject<{
48
+ type: z.ZodLiteral<"DELETE">;
49
+ key: z.ZodString;
50
+ id: z.ZodString;
51
+ timestamp: z.ZodString;
52
+ originUuid: z.ZodString;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ type: z.ZodLiteral<"DELETE_MANY">;
55
+ keys: z.ZodArray<z.ZodString>;
56
+ id: z.ZodString;
57
+ timestamp: z.ZodString;
58
+ originUuid: z.ZodString;
59
+ }, z.core.$strip>, z.ZodObject<{
60
+ type: z.ZodLiteral<"SET">;
61
+ key: z.ZodString;
62
+ value: z.ZodNullable<z.ZodUnknown>;
63
+ id: z.ZodString;
64
+ timestamp: z.ZodString;
65
+ originUuid: z.ZodString;
66
+ }, z.core.$strip>];
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ export const CLEAR_COMMAND = 'CLEAR';
3
+ export const DELETE_COMMAND = 'DELETE';
4
+ export const DELETE_MANY_COMMAND = 'DELETE_MANY';
5
+ export const SET_COMMAND = 'SET';
6
+ export const NOTIFICATION_TYPE_FIELD = 'type';
7
+ export const NOTIFICATION_ID_FIELD = 'id';
8
+ export const NOTIFICATION_TIMESTAMP_FIELD = 'timestamp';
9
+ const NOTIFICATION_BASE_SHAPE = {
10
+ id: z.string().uuid(),
11
+ timestamp: z.string().datetime(),
12
+ originUuid: z.string().uuid(),
13
+ };
14
+ export const CLEAR_NOTIFICATION_SCHEMA = z.object({
15
+ ...NOTIFICATION_BASE_SHAPE,
16
+ type: z.literal(CLEAR_COMMAND),
17
+ });
18
+ export const DELETE_NOTIFICATION_SCHEMA = z.object({
19
+ ...NOTIFICATION_BASE_SHAPE,
20
+ type: z.literal(DELETE_COMMAND),
21
+ key: z.string(),
22
+ });
23
+ export const DELETE_MANY_NOTIFICATION_SCHEMA = z.object({
24
+ ...NOTIFICATION_BASE_SHAPE,
25
+ type: z.literal(DELETE_MANY_COMMAND),
26
+ keys: z.array(z.string()),
27
+ });
28
+ export const SET_NOTIFICATION_SCHEMA = z.object({
29
+ ...NOTIFICATION_BASE_SHAPE,
30
+ type: z.literal(SET_COMMAND),
31
+ key: z.string(),
32
+ value: z.unknown().nullable(),
33
+ });
34
+ export const NOTIFICATION_SCHEMAS = [
35
+ CLEAR_NOTIFICATION_SCHEMA,
36
+ DELETE_NOTIFICATION_SCHEMA,
37
+ DELETE_MANY_NOTIFICATION_SCHEMA,
38
+ SET_NOTIFICATION_SCHEMA,
39
+ ];
40
+ //# sourceMappingURL=notificationSchemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notificationSchemas.js","sourceRoot":"","sources":["../../lib/notificationSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAA;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAA;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAA;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAA;AAEhC,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAA;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAA;AACzC,MAAM,CAAC,MAAM,4BAA4B,GAAG,WAAW,CAAA;AAEvD,MAAM,uBAAuB,GAAG;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAC9B,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,GAAG,uBAAuB;IAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;CAC/B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,GAAG,uBAAuB;IAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC/B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,GAAG,uBAAuB;IAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC1B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,GAAG,uBAAuB;IAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAA;AAaF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,yBAAyB;IACzB,0BAA0B;IAC1B,+BAA+B;IAC/B,uBAAuB;CACf,CAAA"}
@@ -0,0 +1,62 @@
1
+ import type { MessageHandlerConfig } from '@message-queue-toolkit/core';
2
+ import { type SNSSQSConsumerDependencies, type SNSSQSCreationConfig, type SNSSQSQueueLocatorType } from '@message-queue-toolkit/sns';
3
+ import { type SQSConsumerDependencies, type SQSCreationConfig, type SQSQueueLocatorType } from '@message-queue-toolkit/sqs';
4
+ import type { SqsSubscriptionOptions } from '../SqsNotificationConsumer.js';
5
+ import type { InvalidationTrigger } from './types.js';
6
+ /**
7
+ * Discriminated source config shared by every SQS-based trigger
8
+ * (flat or group, current and future variants).
9
+ */
10
+ export type SqsTriggerSource = {
11
+ sourceType: 'sqs-queue';
12
+ dependencies: SQSConsumerDependencies;
13
+ creationConfig: SQSCreationConfig;
14
+ locatorConfig?: never;
15
+ } | {
16
+ sourceType: 'sqs-queue';
17
+ dependencies: SQSConsumerDependencies;
18
+ creationConfig?: never;
19
+ locatorConfig: SQSQueueLocatorType;
20
+ } | {
21
+ sourceType: 'sns-topic';
22
+ dependencies: SNSSQSConsumerDependencies;
23
+ creationConfig: SNSSQSCreationConfig;
24
+ locatorConfig?: never;
25
+ subscriptionConfig?: SqsSubscriptionOptions;
26
+ } | {
27
+ sourceType: 'sns-topic';
28
+ dependencies: SNSSQSConsumerDependencies;
29
+ creationConfig?: never;
30
+ locatorConfig: SNSSQSQueueLocatorType;
31
+ subscriptionConfig?: SqsSubscriptionOptions;
32
+ };
33
+ /** Minimal lifecycle slice we need from the underlying message-queue-toolkit consumer. */
34
+ export interface InternalConsumerHandle {
35
+ init(): Promise<void>;
36
+ start(): Promise<void>;
37
+ close(abort?: boolean): Promise<void>;
38
+ }
39
+ /**
40
+ * Shared lifecycle (start/stop with idempotency + concurrent-call protection)
41
+ * and consumer construction logic for SQS-based triggers. Subclasses provide
42
+ * the concrete handler configuration via {@link buildHandlers}.
43
+ */
44
+ export declare abstract class AbstractSqsTrigger<TMessage extends object, TContext> implements InvalidationTrigger {
45
+ private internalConsumer?;
46
+ private startPromise?;
47
+ protected abstract readonly source: SqsTriggerSource;
48
+ protected abstract readonly messageType: string;
49
+ protected abstract readonly channel: string;
50
+ /** Build the handler configuration for the underlying consumer. */
51
+ protected abstract buildHandlers(): MessageHandlerConfig<TMessage, TContext, undefined>[];
52
+ /** Construct the per-trigger execution context that handlers receive. */
53
+ protected abstract buildContext(): TContext;
54
+ start(): Promise<void>;
55
+ stop(): Promise<void>;
56
+ private createConsumer;
57
+ }
58
+ /**
59
+ * Derive a human-readable channel name from any {@link SqsTriggerSource} for
60
+ * use in error messages and logging.
61
+ */
62
+ export declare function deriveTriggerChannelName(source: SqsTriggerSource): string;
@@ -0,0 +1,104 @@
1
+ import { AbstractSnsSqsConsumer, } from '@message-queue-toolkit/sns';
2
+ import { AbstractSqsConsumer, } from '@message-queue-toolkit/sqs';
3
+ /**
4
+ * Concrete subclasses of `AbstractSnsSqsConsumer` / `AbstractSqsConsumer` are
5
+ * needed because the upstream classes are abstract. They add no behaviour;
6
+ * they just expose the constructor.
7
+ */
8
+ class SqsQueueTriggerConsumer extends AbstractSqsConsumer {
9
+ constructor(dependencies, options, context) {
10
+ super(dependencies, options, context);
11
+ }
12
+ }
13
+ class SnsTopicTriggerConsumer extends AbstractSnsSqsConsumer {
14
+ constructor(dependencies, options, context) {
15
+ super(dependencies, options, context);
16
+ }
17
+ }
18
+ /**
19
+ * Shared lifecycle (start/stop with idempotency + concurrent-call protection)
20
+ * and consumer construction logic for SQS-based triggers. Subclasses provide
21
+ * the concrete handler configuration via {@link buildHandlers}.
22
+ */
23
+ export class AbstractSqsTrigger {
24
+ internalConsumer;
25
+ startPromise;
26
+ async start() {
27
+ if (this.startPromise)
28
+ return this.startPromise;
29
+ if (this.internalConsumer)
30
+ return;
31
+ this.startPromise = (async () => {
32
+ const consumer = this.createConsumer();
33
+ try {
34
+ await consumer.init();
35
+ await consumer.start();
36
+ this.internalConsumer = consumer;
37
+ }
38
+ finally {
39
+ this.startPromise = undefined;
40
+ }
41
+ })();
42
+ return this.startPromise;
43
+ }
44
+ async stop() {
45
+ // Wait for any in-flight start to settle so we don't leak a consumer.
46
+ if (this.startPromise) {
47
+ await this.startPromise.catch(() => undefined);
48
+ }
49
+ const consumer = this.internalConsumer;
50
+ if (!consumer)
51
+ return;
52
+ this.internalConsumer = undefined;
53
+ await consumer.close();
54
+ }
55
+ createConsumer() {
56
+ const handlers = this.buildHandlers();
57
+ const context = this.buildContext();
58
+ const messageTypeResolver = { literal: this.messageType };
59
+ if (this.source.sourceType === 'sqs-queue') {
60
+ const base = {
61
+ handlers,
62
+ messageTypeResolver,
63
+ };
64
+ const options = this.source.creationConfig
65
+ ? { ...base, creationConfig: this.source.creationConfig }
66
+ : { ...base, locatorConfig: this.source.locatorConfig };
67
+ return new SqsQueueTriggerConsumer(this.source.dependencies, options, context);
68
+ }
69
+ const base = {
70
+ handlers,
71
+ messageTypeResolver,
72
+ subscriptionConfig: this.source.subscriptionConfig ?? { updateAttributesIfExists: false },
73
+ };
74
+ const options = this.source.creationConfig
75
+ ? { ...base, creationConfig: this.source.creationConfig }
76
+ : { ...base, locatorConfig: this.source.locatorConfig };
77
+ return new SnsTopicTriggerConsumer(this.source.dependencies, options, context);
78
+ }
79
+ }
80
+ /**
81
+ * Derive a human-readable channel name from any {@link SqsTriggerSource} for
82
+ * use in error messages and logging.
83
+ */
84
+ export function deriveTriggerChannelName(source) {
85
+ if (source.sourceType === 'sqs-queue') {
86
+ if (source.creationConfig?.queue?.QueueName)
87
+ return source.creationConfig.queue.QueueName;
88
+ if (source.locatorConfig?.queueName)
89
+ return source.locatorConfig.queueName;
90
+ if (source.locatorConfig?.queueUrl)
91
+ return source.locatorConfig.queueUrl;
92
+ return 'sqs-invalidation-trigger';
93
+ }
94
+ if (source.creationConfig?.topic?.Name)
95
+ return source.creationConfig.topic.Name;
96
+ if (source.locatorConfig?.topicName)
97
+ return source.locatorConfig.topicName;
98
+ if (source.locatorConfig?.topicArn)
99
+ return source.locatorConfig.topicArn;
100
+ if (source.locatorConfig?.queueUrl)
101
+ return source.locatorConfig.queueUrl;
102
+ return 'sns-invalidation-trigger';
103
+ }
104
+ //# sourceMappingURL=AbstractSqsTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractSqsTrigger.js","sourceRoot":"","sources":["../../../lib/triggers/AbstractSqsTrigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type MessageHandlerConfig } from '@message-queue-toolkit/core';
2
+ import type { GroupNotificationPublisher } from 'layered-loader';
3
+ import type { ZodSchema } from 'zod';
4
+ import { AbstractSqsTrigger, type SqsTriggerSource } from './AbstractSqsTrigger.js';
5
+ import type { GroupInvalidationAction, InvalidationResolver, TriggerErrorHandler } from './types.js';
6
+ export type SqsGroupTriggerSourceConfig = SqsTriggerSource;
7
+ export type SqsGroupInvalidationTriggerParams<TMessage extends object> = {
8
+ messageSchema: ZodSchema<TMessage>;
9
+ resolver: InvalidationResolver<TMessage, GroupInvalidationAction>;
10
+ /**
11
+ * The group notification publisher that propagates invalidation.
12
+ *
13
+ * Pass a publisher whose server UUID is distinct from any Loader's
14
+ * notification pair — otherwise the local pair's consumer treats trigger
15
+ * messages as self-emitted and drops them, leaving the local cache stale.
16
+ */
17
+ publisher: GroupNotificationPublisher<unknown>;
18
+ errorHandler?: TriggerErrorHandler;
19
+ channel?: string;
20
+ } & SqsGroupTriggerSourceConfig;
21
+ type GroupTriggerContext<TMessage> = {
22
+ resolver: InvalidationResolver<TMessage, GroupInvalidationAction>;
23
+ publisher: GroupNotificationPublisher<unknown>;
24
+ channel: string;
25
+ errorHandler: TriggerErrorHandler | undefined;
26
+ };
27
+ export declare class SqsGroupInvalidationTrigger<TMessage extends object> extends AbstractSqsTrigger<TMessage, GroupTriggerContext<TMessage>> {
28
+ protected readonly source: SqsTriggerSource;
29
+ protected readonly messageType = "layered-loader.group-invalidation-trigger";
30
+ protected readonly channel: string;
31
+ private readonly messageSchema;
32
+ private readonly resolver;
33
+ private readonly publisher;
34
+ private readonly errorHandler;
35
+ constructor(params: SqsGroupInvalidationTriggerParams<TMessage>);
36
+ protected buildContext(): GroupTriggerContext<TMessage>;
37
+ protected buildHandlers(): MessageHandlerConfig<TMessage, GroupTriggerContext<TMessage>, undefined>[];
38
+ }
39
+ export {};
@@ -0,0 +1,46 @@
1
+ import { MessageHandlerConfigBuilder } from '@message-queue-toolkit/core';
2
+ import { AbstractSqsTrigger, deriveTriggerChannelName, } from './AbstractSqsTrigger.js';
3
+ import { runGroupPipeline } from './dispatch.js';
4
+ const GROUP_TRIGGER_MESSAGE_TYPE = 'layered-loader.group-invalidation-trigger';
5
+ export class SqsGroupInvalidationTrigger extends AbstractSqsTrigger {
6
+ source;
7
+ messageType = GROUP_TRIGGER_MESSAGE_TYPE;
8
+ channel;
9
+ messageSchema;
10
+ resolver;
11
+ publisher;
12
+ errorHandler;
13
+ constructor(params) {
14
+ super();
15
+ const { messageSchema, resolver, publisher, errorHandler, channel, ...source } = params;
16
+ this.source = source;
17
+ this.messageSchema = messageSchema;
18
+ this.resolver = resolver;
19
+ this.publisher = publisher;
20
+ this.errorHandler = errorHandler;
21
+ this.channel = channel ?? deriveTriggerChannelName(this.source);
22
+ }
23
+ buildContext() {
24
+ return {
25
+ resolver: this.resolver,
26
+ publisher: this.publisher,
27
+ channel: this.channel,
28
+ errorHandler: this.errorHandler,
29
+ };
30
+ }
31
+ buildHandlers() {
32
+ return new MessageHandlerConfigBuilder()
33
+ .addConfig(this.messageSchema, async (message, ctx) => {
34
+ try {
35
+ await runGroupPipeline(message, ctx.resolver, ctx.publisher);
36
+ return { result: 'success' };
37
+ }
38
+ catch (err) {
39
+ ctx.errorHandler?.(err, ctx.channel);
40
+ throw err;
41
+ }
42
+ }, { messageType: GROUP_TRIGGER_MESSAGE_TYPE })
43
+ .build();
44
+ }
45
+ }
46
+ //# sourceMappingURL=SqsGroupInvalidationTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqsGroupInvalidationTrigger.js","sourceRoot":"","sources":["../../../lib/triggers/SqsGroupInvalidationTrigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AAGpG,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAOhD,MAAM,0BAA0B,GAAG,2CAA2C,CAAA;AA0B9E,MAAM,OAAO,2BAAqD,SAAQ,kBAGzE;IACoB,MAAM,CAAkB;IACxB,WAAW,GAAG,0BAA0B,CAAA;IACxC,OAAO,CAAQ;IAEjB,aAAa,CAAqB;IAClC,QAAQ,CAAyD;IACjE,SAAS,CAAqC;IAC9C,YAAY,CAAiC;IAE9D,YAAY,MAAmD;QAC7D,KAAK,EAAE,CAAA;QACP,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAA;QACvF,IAAI,CAAC,MAAM,GAAG,MAA0B,CAAA;QACxC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC;IAES,YAAY;QACpB,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAA;IACH,CAAC;IAES,aAAa;QAKrB,OAAO,IAAI,2BAA2B,EAA2C;aAC9E,SAAS,CACR,IAAI,CAAC,aAAa,EAClB,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;YACrB,IAAI,CAAC;gBACH,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;gBAC5D,OAAO,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAA;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC7C,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC,EACD,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAC5C;aACA,KAAK,EAAE,CAAA;IACZ,CAAC;CACF"}
@@ -0,0 +1,56 @@
1
+ import { type MessageHandlerConfig } from '@message-queue-toolkit/core';
2
+ import type { NotificationPublisher } from 'layered-loader';
3
+ import type { ZodSchema } from 'zod';
4
+ import { AbstractSqsTrigger, type SqsTriggerSource } from './AbstractSqsTrigger.js';
5
+ import type { InvalidationAction, InvalidationResolver, TriggerErrorHandler } from './types.js';
6
+ export type SqsTriggerSourceConfig = SqsTriggerSource;
7
+ export type SqsInvalidationTriggerParams<TMessage extends object> = {
8
+ /**
9
+ * Schema validating each message body delivered by the upstream transport.
10
+ * The resolver receives the validated `TMessage`. Use `z.unknown()` (or a
11
+ * permissive object schema) to accept arbitrary payloads.
12
+ */
13
+ messageSchema: ZodSchema<TMessage>;
14
+ resolver: InvalidationResolver<TMessage, InvalidationAction>;
15
+ /**
16
+ * The notification publisher that propagates invalidation across the cache
17
+ * cluster.
18
+ *
19
+ * **Important**: a trigger publishes invalidations on behalf of an external
20
+ * domain event, not on behalf of any local Loader. Pass a publisher that has
21
+ * its own server UUID (distinct from any Loader's notification pair),
22
+ * otherwise the local pair's consumer will treat the trigger's messages as
23
+ * self-emitted and drop them — leaving the local in-memory cache stale.
24
+ *
25
+ * Construct one with:
26
+ * ```
27
+ * const triggerPublisher = new SqsNotificationPublisher({
28
+ * serverUuid: randomUUID(),
29
+ * dependencies, locatorConfig: { topicName: 'app-invalidations' },
30
+ * })
31
+ * ```
32
+ */
33
+ publisher: NotificationPublisher<unknown>;
34
+ errorHandler?: TriggerErrorHandler;
35
+ /** Logical channel name passed to {@link errorHandler}. Defaults to a derived value. */
36
+ channel?: string;
37
+ } & SqsTriggerSourceConfig;
38
+ type FlatTriggerContext<TMessage> = {
39
+ resolver: InvalidationResolver<TMessage, InvalidationAction>;
40
+ publisher: NotificationPublisher<unknown>;
41
+ channel: string;
42
+ errorHandler: TriggerErrorHandler | undefined;
43
+ };
44
+ export declare class SqsInvalidationTrigger<TMessage extends object> extends AbstractSqsTrigger<TMessage, FlatTriggerContext<TMessage>> {
45
+ protected readonly source: SqsTriggerSource;
46
+ protected readonly messageType = "layered-loader.invalidation-trigger";
47
+ protected readonly channel: string;
48
+ private readonly messageSchema;
49
+ private readonly resolver;
50
+ private readonly publisher;
51
+ private readonly errorHandler;
52
+ constructor(params: SqsInvalidationTriggerParams<TMessage>);
53
+ protected buildContext(): FlatTriggerContext<TMessage>;
54
+ protected buildHandlers(): MessageHandlerConfig<TMessage, FlatTriggerContext<TMessage>, undefined>[];
55
+ }
56
+ export {};
@@ -0,0 +1,47 @@
1
+ import { MessageHandlerConfigBuilder } from '@message-queue-toolkit/core';
2
+ import { AbstractSqsTrigger, deriveTriggerChannelName, } from './AbstractSqsTrigger.js';
3
+ import { runFlatPipeline } from './dispatch.js';
4
+ const TRIGGER_MESSAGE_TYPE = 'layered-loader.invalidation-trigger';
5
+ export class SqsInvalidationTrigger extends AbstractSqsTrigger {
6
+ source;
7
+ messageType = TRIGGER_MESSAGE_TYPE;
8
+ channel;
9
+ messageSchema;
10
+ resolver;
11
+ publisher;
12
+ errorHandler;
13
+ constructor(params) {
14
+ super();
15
+ const { messageSchema, resolver, publisher, errorHandler, channel, ...source } = params;
16
+ this.source = source;
17
+ this.messageSchema = messageSchema;
18
+ this.resolver = resolver;
19
+ this.publisher = publisher;
20
+ this.errorHandler = errorHandler;
21
+ this.channel = channel ?? deriveTriggerChannelName(this.source);
22
+ }
23
+ buildContext() {
24
+ return {
25
+ resolver: this.resolver,
26
+ publisher: this.publisher,
27
+ channel: this.channel,
28
+ errorHandler: this.errorHandler,
29
+ };
30
+ }
31
+ buildHandlers() {
32
+ return new MessageHandlerConfigBuilder()
33
+ .addConfig(this.messageSchema, async (message, ctx) => {
34
+ try {
35
+ await runFlatPipeline(message, ctx.resolver, ctx.publisher);
36
+ return { result: 'success' };
37
+ }
38
+ catch (err) {
39
+ ctx.errorHandler?.(err, ctx.channel);
40
+ // Re-throw so message-queue-toolkit's standard retry/DLQ flow takes over.
41
+ throw err;
42
+ }
43
+ }, { messageType: TRIGGER_MESSAGE_TYPE })
44
+ .build();
45
+ }
46
+ }
47
+ //# sourceMappingURL=SqsInvalidationTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqsInvalidationTrigger.js","sourceRoot":"","sources":["../../../lib/triggers/SqsInvalidationTrigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AAGpG,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAO/C,MAAM,oBAAoB,GAAG,qCAAqC,CAAA;AA2ClE,MAAM,OAAO,sBAAgD,SAAQ,kBAGpE;IACoB,MAAM,CAAkB;IACxB,WAAW,GAAG,oBAAoB,CAAA;IAClC,OAAO,CAAQ;IAEjB,aAAa,CAAqB;IAClC,QAAQ,CAAoD;IAC5D,SAAS,CAAgC;IACzC,YAAY,CAAiC;IAE9D,YAAY,MAA8C;QACxD,KAAK,EAAE,CAAA;QACP,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAA;QACvF,IAAI,CAAC,MAAM,GAAG,MAA0B,CAAA;QACxC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC;IAES,YAAY;QACpB,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAA;IACH,CAAC;IAES,aAAa;QAKrB,OAAO,IAAI,2BAA2B,EAA0C;aAC7E,SAAS,CACR,IAAI,CAAC,aAAa,EAClB,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;YACrB,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;gBAC3D,OAAO,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAA;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC7C,0EAA0E;gBAC1E,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC,EACD,EAAE,WAAW,EAAE,oBAAoB,EAAE,CACtC;aACA,KAAK,EAAE,CAAA;IACZ,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { GroupNotificationPublisher, NotificationPublisher } from 'layered-loader';
2
+ import type { GroupInvalidationAction, InvalidationAction, InvalidationResolver } from './types.js';
3
+ /**
4
+ * Apply a resolved {@link InvalidationAction} to a flat
5
+ * {@link NotificationPublisher}.
6
+ */
7
+ export declare function applyFlatAction(action: InvalidationAction, publisher: NotificationPublisher<unknown>): Promise<void>;
8
+ /**
9
+ * Apply a resolved {@link GroupInvalidationAction} to a
10
+ * {@link GroupNotificationPublisher}.
11
+ */
12
+ export declare function applyGroupAction(action: GroupInvalidationAction, publisher: GroupNotificationPublisher<unknown>): Promise<void>;
13
+ /**
14
+ * Run the resolver and apply each emitted action sequentially. Errors
15
+ * propagate to the caller, allowing the transport adapter to decide whether
16
+ * to retry the source message.
17
+ */
18
+ export declare function runFlatPipeline<TMessage>(message: TMessage, resolver: InvalidationResolver<TMessage, InvalidationAction>, publisher: NotificationPublisher<unknown>): Promise<void>;
19
+ export declare function runGroupPipeline<TMessage>(message: TMessage, resolver: InvalidationResolver<TMessage, GroupInvalidationAction>, publisher: GroupNotificationPublisher<unknown>): Promise<void>;