@clipboard-health/notifications 2.5.21 → 2.6.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/README.md +206 -2
- package/package.json +5 -5
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/internal/chunkRecipients.d.ts +13 -9
- package/src/lib/internal/chunkRecipients.js +12 -8
- package/src/lib/internal/chunkRecipients.js.map +1 -1
- package/src/lib/internal/createTriggerLogParams.d.ts +7 -3
- package/src/lib/internal/createTriggerLogParams.js.map +1 -1
- package/src/lib/internal/toInlineIdentifyUserRequest.d.ts +1 -1
- package/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.d.ts +3 -1
- package/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.js.map +1 -1
- package/src/lib/notificationClient.d.ts +21 -2
- package/src/lib/notificationClient.js +137 -4
- package/src/lib/notificationClient.js.map +1 -1
- package/src/lib/toTriggerChunkedRequest.d.ts +8 -0
- package/src/lib/toTriggerChunkedRequest.js +31 -0
- package/src/lib/toTriggerChunkedRequest.js.map +1 -0
- package/src/lib/types.d.ts +67 -11
package/README.md
CHANGED
|
@@ -4,12 +4,191 @@ Send notifications through third-party providers.
|
|
|
4
4
|
|
|
5
5
|
## Table of contents <!-- omit from toc -->
|
|
6
6
|
|
|
7
|
+
- [`triggerChunked`](#triggerchunked)
|
|
8
|
+
- [`trigger`](#trigger)
|
|
7
9
|
- [Local development commands](#local-development-commands)
|
|
8
10
|
|
|
9
11
|
<embedex source="packages/notifications/examples/usage.md">
|
|
10
12
|
|
|
13
|
+
## `triggerChunked`
|
|
14
|
+
|
|
15
|
+
`triggerChunked` stores the full, immutable trigger request at job enqueue time, eliminating issues with stale data, chunking requests to stay under provider limits, and idempotency key conflicts that can occur if the request is updated at job execution time.
|
|
16
|
+
|
|
17
|
+
1. Search your service for `triggerNotification.constants.ts`, `triggerNotification.job.ts` and `notifications.service.ts`. If they don't exist, create them:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
// triggerNotification.constants.ts
|
|
21
|
+
export const TRIGGER_NOTIFICATION_JOB_NAME = "TriggerNotificationJob";
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
// triggerNotification.job.ts
|
|
26
|
+
import { type BaseHandler } from "@clipboard-health/background-jobs-adapter";
|
|
27
|
+
import {
|
|
28
|
+
type SerializableTriggerChunkedRequest,
|
|
29
|
+
toTriggerChunkedRequest,
|
|
30
|
+
} from "@clipboard-health/notifications";
|
|
31
|
+
import { isFailure } from "@clipboard-health/util-ts";
|
|
32
|
+
|
|
33
|
+
import { type NotificationsService } from "./notifications.service";
|
|
34
|
+
import { CBHLogger } from "./setup";
|
|
35
|
+
import { TRIGGER_NOTIFICATION_JOB_NAME } from "./triggerNotification.constants";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* For mongo-jobs, implement HandlerInterface<SerializableTriggerChunkedRequest>.
|
|
39
|
+
* For background-jobs-postgres, implement Handler<SerializableTriggerChunkedRequest>.
|
|
40
|
+
*/
|
|
41
|
+
export class TriggerNotificationJob implements BaseHandler<SerializableTriggerChunkedRequest> {
|
|
42
|
+
public name = TRIGGER_NOTIFICATION_JOB_NAME;
|
|
43
|
+
private readonly logger = new CBHLogger({
|
|
44
|
+
defaultMeta: {
|
|
45
|
+
logContext: TRIGGER_NOTIFICATION_JOB_NAME,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
public constructor(private readonly service: NotificationsService) {}
|
|
50
|
+
|
|
51
|
+
public async perform(
|
|
52
|
+
data: SerializableTriggerChunkedRequest,
|
|
53
|
+
job: { _id: string; attemptsCount: number; uniqueKey?: string },
|
|
54
|
+
) {
|
|
55
|
+
const metadata = {
|
|
56
|
+
// Include the job's attempts count for debugging, this is called `retryAttempts` in `background-jobs-postgres`.
|
|
57
|
+
attempt: job.attemptsCount + 1,
|
|
58
|
+
jobId: job._id,
|
|
59
|
+
recipientCount: data.body.recipients.length,
|
|
60
|
+
workflowKey: data.workflowKey,
|
|
61
|
+
};
|
|
62
|
+
this.logger.info("Processing", metadata);
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
const request = toTriggerChunkedRequest(data, {
|
|
66
|
+
attempt: metadata.attempt,
|
|
67
|
+
idempotencyKey: job.uniqueKey ?? metadata.jobId,
|
|
68
|
+
});
|
|
69
|
+
const result = await this.service.triggerChunked(request);
|
|
70
|
+
|
|
71
|
+
if (isFailure(result)) {
|
|
72
|
+
throw result.error;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
this.logger.info("Success", { ...metadata, response: result.value });
|
|
76
|
+
} catch (error) {
|
|
77
|
+
this.logger.error("Failure", { ...metadata, error });
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
// notifications.service.ts
|
|
86
|
+
import { NotificationClient } from "@clipboard-health/notifications";
|
|
87
|
+
|
|
88
|
+
import { CBHLogger, toLogger, tracer } from "./setup";
|
|
89
|
+
|
|
90
|
+
export class NotificationsService {
|
|
91
|
+
private readonly client: NotificationClient;
|
|
92
|
+
|
|
93
|
+
constructor() {
|
|
94
|
+
this.client = new NotificationClient({
|
|
95
|
+
apiKey: "YOUR_KNOCK_API_KEY",
|
|
96
|
+
logger: toLogger(new CBHLogger()),
|
|
97
|
+
tracer,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async triggerChunked(
|
|
102
|
+
params: Parameters<NotificationClient["triggerChunked"]>[0],
|
|
103
|
+
): ReturnType<NotificationClient["triggerChunked"]> {
|
|
104
|
+
return await this.client.triggerChunked(params);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
2. Search the service for a constant that stores workflow keys. If there isn't one, create it:
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
/* eslint sort-keys: "error" */
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Alphabetical list of workflow keys.
|
|
116
|
+
*/
|
|
117
|
+
export const WORKFLOW_KEYS = {
|
|
118
|
+
eventStartingReminder: "event-starting-reminder",
|
|
119
|
+
} as const;
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
3. Build your `SerializableTriggerChunkedRequest` and enqueue your job:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import { type BackgroundJobsAdapter } from "@clipboard-health/background-jobs-adapter";
|
|
126
|
+
import { type SerializableTriggerChunkedRequest } from "@clipboard-health/notifications";
|
|
127
|
+
|
|
128
|
+
import { BackgroundJobsService } from "./setup";
|
|
129
|
+
import { TRIGGER_NOTIFICATION_JOB_NAME } from "./triggerNotification.constants";
|
|
130
|
+
import { WORKFLOW_KEYS } from "./workflowKeys";
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Enqueue a notification job in the same database transaction as the changes it's notifying about.
|
|
134
|
+
* The `session` option is called `transaction` in `background-jobs-postgres`.
|
|
135
|
+
*/
|
|
136
|
+
async function enqueueTriggerNotificationJob(adapter: BackgroundJobsAdapter) {
|
|
137
|
+
// Assume this comes from a database and are used as template variables...
|
|
138
|
+
const notificationData = {
|
|
139
|
+
favoriteColor: "blue",
|
|
140
|
+
// Use @clipboard-health/date-time's formatShortDateTime in your service for consistency.
|
|
141
|
+
favoriteAt: new Date().toISOString(),
|
|
142
|
+
secret: "2",
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const jobData: SerializableTriggerChunkedRequest = {
|
|
146
|
+
// Important: Read the TypeDoc documentation for additional context.
|
|
147
|
+
body: {
|
|
148
|
+
recipients: ["userId-1", "userId-2"],
|
|
149
|
+
data: notificationData,
|
|
150
|
+
},
|
|
151
|
+
// Helpful when controlling notifications with feature flags.
|
|
152
|
+
dryRun: false,
|
|
153
|
+
// Set expiresAt at enqueue-time so it remains stable across job retries. Use date-fns in your
|
|
154
|
+
// service instead of this manual calculation.
|
|
155
|
+
expiresAt: new Date(Date.now() + 60 * 60_000).toISOString(),
|
|
156
|
+
// Keys to redact from logs
|
|
157
|
+
keysToRedact: ["secret"],
|
|
158
|
+
workflowKey: WORKFLOW_KEYS.eventStartingReminder,
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// Option 1 (default): Automatically use background job ID as idempotency key.
|
|
162
|
+
await adapter.enqueue(TRIGGER_NOTIFICATION_JOB_NAME, jobData, { session: "..." });
|
|
163
|
+
|
|
164
|
+
// Option 2 (advanced): Provide custom idempotency key to job and notification libraries for more
|
|
165
|
+
// control. You'd use this to provide enqueue-time deduplication. For example, if you enqueue when
|
|
166
|
+
// a user clicks a button and only want them to receive one notification.
|
|
167
|
+
await adapter.enqueue(TRIGGER_NOTIFICATION_JOB_NAME, jobData, {
|
|
168
|
+
// Called `idempotencyKey` in `background-jobs-postgres`.
|
|
169
|
+
unique: `meeting-123-reminder`,
|
|
170
|
+
session: "...",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// eslint-disable-next-line unicorn/prefer-top-level-await
|
|
175
|
+
void enqueueTriggerNotificationJob(
|
|
176
|
+
// Use your instance of `@clipboard-health/mongo-jobs` or `@clipboard-health/background-jobs-postgres` here.
|
|
177
|
+
new BackgroundJobsService(),
|
|
178
|
+
);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
</embedex>
|
|
182
|
+
|
|
183
|
+
## `trigger`
|
|
184
|
+
|
|
185
|
+
> [!WARNING]
|
|
186
|
+
> Deprecated. See `triggerChunked`.
|
|
187
|
+
|
|
11
188
|
1. Search your service for a `NotificationJobEnqueuer` instance. If there isn't one, create and export it:
|
|
12
189
|
|
|
190
|
+
<embedex source="packages/notifications/examples/notificationJobEnqueuer.ts">
|
|
191
|
+
|
|
13
192
|
```ts
|
|
14
193
|
import { NotificationJobEnqueuer } from "@clipboard-health/notifications";
|
|
15
194
|
|
|
@@ -22,8 +201,12 @@ Send notifications through third-party providers.
|
|
|
22
201
|
});
|
|
23
202
|
```
|
|
24
203
|
|
|
204
|
+
</embedex>
|
|
205
|
+
|
|
25
206
|
2. Add types and the job name to the module's logic directory if it exists, else module root. You MUST create and use the `...DataJob` and `...DataEnqueue` types:
|
|
26
207
|
|
|
208
|
+
<embedex source="packages/notifications/examples/exampleNotification.constants.ts">
|
|
209
|
+
|
|
27
210
|
```ts
|
|
28
211
|
import { type NotificationData } from "@clipboard-health/notifications";
|
|
29
212
|
|
|
@@ -39,8 +222,12 @@ Send notifications through third-party providers.
|
|
|
39
222
|
export const EXAMPLE_NOTIFICATION_JOB_NAME = "ExampleNotificationJob";
|
|
40
223
|
```
|
|
41
224
|
|
|
225
|
+
</embedex>
|
|
226
|
+
|
|
42
227
|
3. Implement a minimal job in the module's logic/job directory if it exists, else module root. The job calls off to a NestJS service for any business logic and to send the notification:
|
|
43
228
|
|
|
229
|
+
<embedex source="packages/notifications/examples/exampleNotification.job.ts">
|
|
230
|
+
|
|
44
231
|
```ts
|
|
45
232
|
import { type BaseHandler } from "@clipboard-health/background-jobs-adapter";
|
|
46
233
|
import { isFailure } from "@clipboard-health/util-ts";
|
|
@@ -91,16 +278,29 @@ Send notifications through third-party providers.
|
|
|
91
278
|
}
|
|
92
279
|
```
|
|
93
280
|
|
|
94
|
-
|
|
281
|
+
</embedex>
|
|
282
|
+
|
|
283
|
+
4. Search the service for a constant that stores workflow keys. If there isn't one, create and export it:
|
|
284
|
+
|
|
285
|
+
<embedex source="packages/notifications/examples/workflowKeys.ts">
|
|
95
286
|
|
|
96
287
|
```ts
|
|
288
|
+
/* eslint sort-keys: "error" */
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Alphabetical list of workflow keys.
|
|
292
|
+
*/
|
|
97
293
|
export const WORKFLOW_KEYS = {
|
|
98
294
|
eventStartingReminder: "event-starting-reminder",
|
|
99
295
|
} as const;
|
|
100
296
|
```
|
|
101
297
|
|
|
298
|
+
</embedex>
|
|
299
|
+
|
|
102
300
|
5. Enqueue the job:
|
|
103
301
|
|
|
302
|
+
<embedex source="packages/notifications/examples/enqueueNotificationJob.ts">
|
|
303
|
+
|
|
104
304
|
```ts
|
|
105
305
|
import {
|
|
106
306
|
EXAMPLE_NOTIFICATION_JOB_NAME,
|
|
@@ -141,8 +341,12 @@ Send notifications through third-party providers.
|
|
|
141
341
|
void enqueueNotificationJob();
|
|
142
342
|
```
|
|
143
343
|
|
|
344
|
+
</embedex>
|
|
345
|
+
|
|
144
346
|
6. Create the NestJS service in the module's logic directory if it exists, else module root. Trigger the NotificationClient:
|
|
145
347
|
|
|
348
|
+
<embedex source="packages/notifications/examples/exampleNotification.service.ts">
|
|
349
|
+
|
|
146
350
|
```ts
|
|
147
351
|
import { type NotificationClient } from "@clipboard-health/notifications";
|
|
148
352
|
|
|
@@ -177,7 +381,7 @@ Send notifications through third-party providers.
|
|
|
177
381
|
}
|
|
178
382
|
```
|
|
179
383
|
|
|
180
|
-
</embedex>
|
|
384
|
+
</embedex>
|
|
181
385
|
|
|
182
386
|
## Local development commands
|
|
183
387
|
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipboard-health/notifications",
|
|
3
3
|
"description": "Send notifications through third-party providers.",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.6.0",
|
|
5
5
|
"bugs": "https://github.com/ClipboardHealth/core-utils/issues",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@clipboard-health/background-jobs-adapter": "1.
|
|
8
|
-
"@clipboard-health/phone-number": "1.
|
|
9
|
-
"@clipboard-health/util-ts": "4.
|
|
7
|
+
"@clipboard-health/background-jobs-adapter": "1.6.0",
|
|
8
|
+
"@clipboard-health/phone-number": "1.6.0",
|
|
9
|
+
"@clipboard-health/util-ts": "4.6.0",
|
|
10
10
|
"@knocklabs/node": "1.24.0",
|
|
11
11
|
"tslib": "2.8.1"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
|
-
"@clipboard-health/testing-core": "1.
|
|
14
|
+
"@clipboard-health/testing-core": "1.6.0",
|
|
15
15
|
"type-fest": "5.3.1"
|
|
16
16
|
},
|
|
17
17
|
"keywords": [],
|
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
tslib_1.__exportStar(require("./lib/errorsInResult"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./lib/notificationClient"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./lib/notificationJobEnqueuer"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./lib/toTriggerChunkedRequest"), exports);
|
|
7
8
|
tslib_1.__exportStar(require("./lib/triggerIdempotencyKey"), exports);
|
|
8
9
|
tslib_1.__exportStar(require("./lib/types"), exports);
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/notifications/src/index.ts"],"names":[],"mappings":";;;AAAA,+DAAqC;AACrC,mEAAyC;AACzC,wEAA8C;AAC9C,sEAA4C;AAC5C,sDAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/notifications/src/index.ts"],"names":[],"mappings":";;;AAAA,+DAAqC;AACrC,mEAAyC;AACzC,wEAA8C;AAC9C,wEAA8C;AAC9C,sEAA4C;AAC5C,sDAA4B"}
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
2
|
+
* Maximum number of recipients allowed per trigger request.
|
|
3
|
+
*/
|
|
4
|
+
export declare const MAXIMUM_RECIPIENTS_COUNT = 1000;
|
|
5
|
+
/**
|
|
6
|
+
* Chunks recipients into groups that don't exceed the maximum recipients count, assigning a unique
|
|
7
|
+
* chunk number to each group.
|
|
4
8
|
*
|
|
5
|
-
* This function is used to split large recipient lists into smaller batches that
|
|
6
|
-
*
|
|
7
|
-
* starting from 1.
|
|
9
|
+
* This function is used to split large recipient lists into smaller batches that comply with
|
|
10
|
+
* notification provider limits. Each chunk is numbered sequentially starting from 1.
|
|
8
11
|
*
|
|
9
12
|
* @param params - The chunking parameters
|
|
10
|
-
* @param params.recipients - Array of recipient
|
|
13
|
+
* @param params.recipients - Array of recipient requests to chunk (can be user IDs or inline
|
|
14
|
+
* identify requests)
|
|
11
15
|
* @returns Array of chunks, each containing a chunk number and recipients array
|
|
12
16
|
*/
|
|
13
|
-
export declare function chunkRecipients(params: {
|
|
14
|
-
recipients:
|
|
17
|
+
export declare function chunkRecipients<T>(params: {
|
|
18
|
+
recipients: T[];
|
|
15
19
|
}): Array<{
|
|
16
20
|
number: number;
|
|
17
|
-
recipients:
|
|
21
|
+
recipients: T[];
|
|
18
22
|
}>;
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAXIMUM_RECIPIENTS_COUNT = void 0;
|
|
3
4
|
exports.chunkRecipients = chunkRecipients;
|
|
4
5
|
const util_ts_1 = require("@clipboard-health/util-ts");
|
|
5
|
-
const notificationClient_1 = require("../notificationClient");
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
|
|
7
|
+
* Maximum number of recipients allowed per trigger request.
|
|
8
|
+
*/
|
|
9
|
+
exports.MAXIMUM_RECIPIENTS_COUNT = 1000;
|
|
10
|
+
/**
|
|
11
|
+
* Chunks recipients into groups that don't exceed the maximum recipients count, assigning a unique
|
|
12
|
+
* chunk number to each group.
|
|
9
13
|
*
|
|
10
|
-
* This function is used to split large recipient lists into smaller batches that
|
|
11
|
-
*
|
|
12
|
-
* starting from 1.
|
|
14
|
+
* This function is used to split large recipient lists into smaller batches that comply with
|
|
15
|
+
* notification provider limits. Each chunk is numbered sequentially starting from 1.
|
|
13
16
|
*
|
|
14
17
|
* @param params - The chunking parameters
|
|
15
|
-
* @param params.recipients - Array of recipient
|
|
18
|
+
* @param params.recipients - Array of recipient requests to chunk (can be user IDs or inline
|
|
19
|
+
* identify requests)
|
|
16
20
|
* @returns Array of chunks, each containing a chunk number and recipients array
|
|
17
21
|
*/
|
|
18
22
|
function chunkRecipients(params) {
|
|
@@ -20,7 +24,7 @@ function chunkRecipients(params) {
|
|
|
20
24
|
if (recipients.length === 0) {
|
|
21
25
|
return [{ number: 1, recipients: [] }];
|
|
22
26
|
}
|
|
23
|
-
return (0, util_ts_1.chunk)(recipients,
|
|
27
|
+
return (0, util_ts_1.chunk)(recipients, exports.MAXIMUM_RECIPIENTS_COUNT).map((recipientsChunk, index) => ({
|
|
24
28
|
number: index + 1,
|
|
25
29
|
recipients: recipientsChunk,
|
|
26
30
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkRecipients.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/chunkRecipients.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunkRecipients.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/chunkRecipients.ts"],"names":[],"mappings":";;;AAmBA,0CAaC;AAhCD,uDAAkD;AAElD;;GAEG;AACU,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,SAAgB,eAAe,CAAI,MAElC;IACC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAE9B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,IAAA,eAAK,EAAC,UAAU,EAAE,gCAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAClF,MAAM,EAAE,KAAK,GAAG,CAAC;QACjB,UAAU,EAAE,eAAe;KAC5B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
import type { LogParams, TriggerRequest } from "../types";
|
|
2
|
-
export type TriggerLogContext = LogParams & Pick<TriggerRequest, "attempt" | "dryRun" | "
|
|
3
|
-
|
|
1
|
+
import type { LogParams, TriggerChunkedRequest, TriggerRequest } from "../types";
|
|
2
|
+
export type TriggerLogContext = LogParams & Pick<TriggerRequest, "attempt" | "dryRun" | "workflowKey"> & {
|
|
3
|
+
idempotencyKey: string;
|
|
4
|
+
};
|
|
5
|
+
type TriggerLogParamsInput = (TriggerRequest | TriggerChunkedRequest) & LogParams;
|
|
6
|
+
export declare function createTriggerLogParams(params: TriggerLogParamsInput): TriggerLogContext;
|
|
7
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createTriggerLogParams.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/createTriggerLogParams.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"createTriggerLogParams.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/createTriggerLogParams.ts"],"names":[],"mappings":";;AASA,wDAWC;AAXD,SAAgB,sBAAsB,CAAC,MAA6B;IAClE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAEhG,OAAO;QACL,OAAO;QACP,WAAW;QACX,MAAM;QACN,cAAc;QACd,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type Knock } from "@knocklabs/node";
|
|
2
|
-
import {
|
|
2
|
+
import type { InlineIdentifyUserRequest } from "../types";
|
|
3
3
|
export declare function toInlineIdentifyUserRequest(recipient: InlineIdentifyUserRequest): Knock.Users.InlineIdentifyUserRequest;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { type Knock } from "@knocklabs/node";
|
|
2
2
|
import type { InlineIdentifyUserRequest } from "../types";
|
|
3
|
-
|
|
3
|
+
type RecipientWithoutUserId = Omit<InlineIdentifyUserRequest, "userId">;
|
|
4
|
+
export declare function toInlineIdentifyUserRequestWithoutUserId(recipient: RecipientWithoutUserId): Omit<Knock.Users.InlineIdentifyUserRequest, "id">;
|
|
5
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toInlineIdentifyUserRequestWithoutUserId.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"toInlineIdentifyUserRequestWithoutUserId.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.ts"],"names":[],"mappings":";;AAOA,4FAgBC;AApBD,2DAAwD;AAIxD,SAAgB,wCAAwC,CACtD,SAAiC;IAEjC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAC7F,SAAS,CAAC;IAEZ,OAAO;QACL,GAAG,IAAI;QACP,GAAG,gBAAgB;QACnB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAA,qCAAiB,EAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type LogFunction, type ServiceResult } from "@clipboard-health/util-ts";
|
|
2
|
-
import type
|
|
3
|
-
export declare const MAXIMUM_RECIPIENTS_COUNT = 1000;
|
|
2
|
+
import { type AppendPushTokenRequest, type AppendPushTokenResponse, type LogParams, type NotificationClientParams, type SignUserTokenRequest, type SignUserTokenResponse, type Span, type TriggerChunkedRequest, type TriggerChunkedResponse, type TriggerRequest, type TriggerResponse, type UpsertUserPreferencesRequest, type UpsertUserPreferencesResponse, type UpsertWorkplaceRequest, type UpsertWorkplaceResponse } from "./types";
|
|
4
3
|
export declare const ERROR_CODES: {
|
|
5
4
|
readonly expired: "expired";
|
|
5
|
+
readonly invalidExpiresAt: "invalidExpiresAt";
|
|
6
6
|
readonly invalidIdempotencyKey: "invalidIdempotencyKey";
|
|
7
7
|
readonly recipientCountBelowMinimum: "recipientCountBelowMinimum";
|
|
8
8
|
readonly recipientCountAboveMaximum: "recipientCountAboveMaximum";
|
|
@@ -78,6 +78,24 @@ export declare class NotificationClient {
|
|
|
78
78
|
* </embedex>
|
|
79
79
|
*/
|
|
80
80
|
trigger(params: TriggerRequest): Promise<ServiceResult<TriggerResponse>>;
|
|
81
|
+
/**
|
|
82
|
+
* Triggers a notification with automatic chunking for large recipient lists.
|
|
83
|
+
*
|
|
84
|
+
* This method handles:
|
|
85
|
+
* - Automatic chunking of recipients into groups of MAXIMUM_RECIPIENTS_COUNT.
|
|
86
|
+
* - Idempotency using `${idempotencyKey}-${chunkNumber}` for each chunk.
|
|
87
|
+
* - Stale notifications prevention through expiresAt.
|
|
88
|
+
* - Logging with sensitive data redaction.
|
|
89
|
+
* - Distributed tracing with notification metadata.
|
|
90
|
+
*
|
|
91
|
+
* Use this method from background jobs where you want to:
|
|
92
|
+
* - Store the full serializable request at enqueue time (no stale data issues).
|
|
93
|
+
* - Use the background job ID as the idempotency key base.
|
|
94
|
+
* - Not worry about recipient count limits.
|
|
95
|
+
*
|
|
96
|
+
* @returns Promise resolving to either an error or successful response with all chunk results.
|
|
97
|
+
*/
|
|
98
|
+
triggerChunked(params: TriggerChunkedRequest): Promise<ServiceResult<TriggerChunkedResponse>>;
|
|
81
99
|
/**
|
|
82
100
|
* Append to a user's push tokens.
|
|
83
101
|
*
|
|
@@ -112,6 +130,7 @@ export declare class NotificationClient {
|
|
|
112
130
|
metadata?: Record<string, unknown>;
|
|
113
131
|
}): ServiceResult<never>;
|
|
114
132
|
private validateTriggerRequest;
|
|
133
|
+
private validateTriggerChunkedRequest;
|
|
115
134
|
private getExistingTokens;
|
|
116
135
|
private logTriggerRequest;
|
|
117
136
|
private logTriggerResponse;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NotificationClient = exports.ERROR_CODES =
|
|
3
|
+
exports.NotificationClient = exports.ERROR_CODES = void 0;
|
|
4
4
|
const util_ts_1 = require("@clipboard-health/util-ts");
|
|
5
5
|
const node_1 = require("@knocklabs/node");
|
|
6
|
+
const chunkRecipients_1 = require("./internal/chunkRecipients");
|
|
6
7
|
const createTriggerLogParams_1 = require("./internal/createTriggerLogParams");
|
|
7
8
|
const createTriggerTraceOptions_1 = require("./internal/createTriggerTraceOptions");
|
|
8
9
|
const idempotentKnock_1 = require("./internal/idempotentKnock");
|
|
@@ -17,6 +18,10 @@ const LOG_PARAMS = {
|
|
|
17
18
|
traceName: "notifications.trigger",
|
|
18
19
|
destination: "knock.workflows.trigger",
|
|
19
20
|
},
|
|
21
|
+
triggerChunked: {
|
|
22
|
+
traceName: "notifications.triggerChunked",
|
|
23
|
+
destination: "knock.workflows.trigger",
|
|
24
|
+
},
|
|
20
25
|
appendPushToken: {
|
|
21
26
|
traceName: "notifications.appendPushToken",
|
|
22
27
|
destination: "knock.users.setChannelData",
|
|
@@ -34,9 +39,9 @@ const LOG_PARAMS = {
|
|
|
34
39
|
destination: "knock.users.setPreferences",
|
|
35
40
|
},
|
|
36
41
|
};
|
|
37
|
-
exports.MAXIMUM_RECIPIENTS_COUNT = 1000;
|
|
38
42
|
exports.ERROR_CODES = {
|
|
39
43
|
expired: "expired",
|
|
44
|
+
invalidExpiresAt: "invalidExpiresAt",
|
|
40
45
|
invalidIdempotencyKey: "invalidIdempotencyKey",
|
|
41
46
|
recipientCountBelowMinimum: "recipientCountBelowMinimum",
|
|
42
47
|
recipientCountAboveMaximum: "recipientCountAboveMaximum",
|
|
@@ -156,6 +161,98 @@ class NotificationClient {
|
|
|
156
161
|
}
|
|
157
162
|
});
|
|
158
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Triggers a notification with automatic chunking for large recipient lists.
|
|
166
|
+
*
|
|
167
|
+
* This method handles:
|
|
168
|
+
* - Automatic chunking of recipients into groups of MAXIMUM_RECIPIENTS_COUNT.
|
|
169
|
+
* - Idempotency using `${idempotencyKey}-${chunkNumber}` for each chunk.
|
|
170
|
+
* - Stale notifications prevention through expiresAt.
|
|
171
|
+
* - Logging with sensitive data redaction.
|
|
172
|
+
* - Distributed tracing with notification metadata.
|
|
173
|
+
*
|
|
174
|
+
* Use this method from background jobs where you want to:
|
|
175
|
+
* - Store the full serializable request at enqueue time (no stale data issues).
|
|
176
|
+
* - Use the background job ID as the idempotency key base.
|
|
177
|
+
* - Not worry about recipient count limits.
|
|
178
|
+
*
|
|
179
|
+
* @returns Promise resolving to either an error or successful response with all chunk results.
|
|
180
|
+
*/
|
|
181
|
+
async triggerChunked(params) {
|
|
182
|
+
const logParams = (0, createTriggerLogParams_1.createTriggerLogParams)({ ...params, ...LOG_PARAMS.triggerChunked });
|
|
183
|
+
return await this.tracer.trace(logParams.traceName, (0, createTriggerTraceOptions_1.createTriggerTraceOptions)(logParams), async (span) => {
|
|
184
|
+
const { body, expiresAt, idempotencyKey, keysToRedact = [], workflowKey } = params;
|
|
185
|
+
const { workplaceId } = body;
|
|
186
|
+
const validated = this.validateTriggerChunkedRequest({
|
|
187
|
+
body,
|
|
188
|
+
expiresAt,
|
|
189
|
+
span,
|
|
190
|
+
logParams,
|
|
191
|
+
});
|
|
192
|
+
if ((0, util_ts_1.isFailure)(validated)) {
|
|
193
|
+
return validated;
|
|
194
|
+
}
|
|
195
|
+
this.logTriggerRequest({ logParams, body, keysToRedact });
|
|
196
|
+
if (params.dryRun) {
|
|
197
|
+
this.logTriggerResponse({ span, response: { dryRun: true }, id: "dry-run", logParams });
|
|
198
|
+
return (0, util_ts_1.success)({ responses: [{ chunkNumber: 1, id: "dry-run" }] });
|
|
199
|
+
}
|
|
200
|
+
const chunks = (0, chunkRecipients_1.chunkRecipients)({ recipients: body.recipients });
|
|
201
|
+
const responses = [];
|
|
202
|
+
// Sequential execution is intentional - we want to fail fast on error and track progress
|
|
203
|
+
for (const recipientChunk of chunks) {
|
|
204
|
+
try {
|
|
205
|
+
const chunkIdempotencyKey = `${idempotencyKey}-${recipientChunk.number}`;
|
|
206
|
+
const chunkBody = {
|
|
207
|
+
...body,
|
|
208
|
+
recipients: recipientChunk.recipients,
|
|
209
|
+
};
|
|
210
|
+
const triggerBody = (0, toTriggerBody_1.toTriggerBody)(chunkBody);
|
|
211
|
+
// eslint-disable-next-line no-await-in-loop
|
|
212
|
+
const response = await this.provider.workflows.trigger(workflowKey, triggerBody, {
|
|
213
|
+
idempotencyKey: chunkIdempotencyKey,
|
|
214
|
+
});
|
|
215
|
+
const id = response.workflow_run_id;
|
|
216
|
+
this.logger.info(`${logParams.traceName} chunk response`, {
|
|
217
|
+
...logParams,
|
|
218
|
+
chunkNumber: recipientChunk.number,
|
|
219
|
+
totalChunks: chunks.length,
|
|
220
|
+
id,
|
|
221
|
+
});
|
|
222
|
+
responses.push({ chunkNumber: recipientChunk.number, id });
|
|
223
|
+
}
|
|
224
|
+
catch (maybeError) {
|
|
225
|
+
const error = (0, util_ts_1.toError)(maybeError);
|
|
226
|
+
return this.createAndLogError({
|
|
227
|
+
notificationError: {
|
|
228
|
+
code: exports.ERROR_CODES.unknown,
|
|
229
|
+
message: `Chunk ${recipientChunk.number}/${chunks.length} failed: ${error.message}`,
|
|
230
|
+
},
|
|
231
|
+
span,
|
|
232
|
+
logFunction: this.logger.error,
|
|
233
|
+
logParams,
|
|
234
|
+
metadata: {
|
|
235
|
+
error,
|
|
236
|
+
chunkNumber: recipientChunk.number,
|
|
237
|
+
totalChunks: chunks.length,
|
|
238
|
+
completedChunks: responses.length,
|
|
239
|
+
expiresAt: expiresAt.toISOString(),
|
|
240
|
+
workplaceId,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
span?.addTags({
|
|
246
|
+
"response.chunks": responses.length,
|
|
247
|
+
success: true,
|
|
248
|
+
});
|
|
249
|
+
this.logger.info(`${logParams.traceName} response`, {
|
|
250
|
+
...logParams,
|
|
251
|
+
responses,
|
|
252
|
+
});
|
|
253
|
+
return (0, util_ts_1.success)({ responses });
|
|
254
|
+
});
|
|
255
|
+
}
|
|
159
256
|
/**
|
|
160
257
|
* Append to a user's push tokens.
|
|
161
258
|
*
|
|
@@ -326,12 +423,12 @@ class NotificationClient {
|
|
|
326
423
|
logParams,
|
|
327
424
|
});
|
|
328
425
|
}
|
|
329
|
-
if (body.recipients.length >
|
|
426
|
+
if (body.recipients.length > chunkRecipients_1.MAXIMUM_RECIPIENTS_COUNT) {
|
|
330
427
|
const recipientsCount = body.recipients.length;
|
|
331
428
|
return this.createAndLogError({
|
|
332
429
|
notificationError: {
|
|
333
430
|
code: exports.ERROR_CODES.recipientCountAboveMaximum,
|
|
334
|
-
message: `Got ${recipientsCount} recipients; must be <= ${
|
|
431
|
+
message: `Got ${recipientsCount} recipients; must be <= ${chunkRecipients_1.MAXIMUM_RECIPIENTS_COUNT}.`,
|
|
335
432
|
},
|
|
336
433
|
span,
|
|
337
434
|
logParams,
|
|
@@ -363,6 +460,42 @@ class NotificationClient {
|
|
|
363
460
|
}
|
|
364
461
|
return (0, util_ts_1.success)({ ...params, idempotencyKeyParams });
|
|
365
462
|
}
|
|
463
|
+
validateTriggerChunkedRequest(params) {
|
|
464
|
+
const { body, expiresAt, span, logParams } = params;
|
|
465
|
+
if (body.recipients.length <= 0) {
|
|
466
|
+
return this.createAndLogError({
|
|
467
|
+
notificationError: {
|
|
468
|
+
code: exports.ERROR_CODES.recipientCountBelowMinimum,
|
|
469
|
+
message: `Got ${body.recipients.length} recipients; must be > 0.`,
|
|
470
|
+
},
|
|
471
|
+
span,
|
|
472
|
+
logParams,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
if (Number.isNaN(expiresAt.getTime())) {
|
|
476
|
+
return this.createAndLogError({
|
|
477
|
+
notificationError: {
|
|
478
|
+
code: exports.ERROR_CODES.invalidExpiresAt,
|
|
479
|
+
message: `Invalid expiresAt: ${String(expiresAt)}`,
|
|
480
|
+
},
|
|
481
|
+
span,
|
|
482
|
+
logParams,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
const now = new Date();
|
|
486
|
+
if (now > expiresAt) {
|
|
487
|
+
return this.createAndLogError({
|
|
488
|
+
notificationError: {
|
|
489
|
+
code: exports.ERROR_CODES.expired,
|
|
490
|
+
message: `Got ${now.toISOString()}; notification expires at ${expiresAt.toISOString()}.`,
|
|
491
|
+
},
|
|
492
|
+
span,
|
|
493
|
+
logParams,
|
|
494
|
+
metadata: { currentTime: now.toISOString(), expiresAt: expiresAt.toISOString() },
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
return (0, util_ts_1.success)({ expiresAt });
|
|
498
|
+
}
|
|
366
499
|
async getExistingTokens(params) {
|
|
367
500
|
const { userId, channelId, logParams } = params;
|
|
368
501
|
// If existing tokens, use them; otherwise, start with empty array
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notificationClient.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/notificationClient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"notificationClient.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/notificationClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type SerializableTriggerChunkedRequest, type TriggerChunkedRequest } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Converts a serializable request to a TriggerChunkedRequest.
|
|
4
|
+
*/
|
|
5
|
+
export declare function toTriggerChunkedRequest(request: SerializableTriggerChunkedRequest, params: {
|
|
6
|
+
attempt: number;
|
|
7
|
+
idempotencyKey: string;
|
|
8
|
+
}): TriggerChunkedRequest;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toTriggerChunkedRequest = toTriggerChunkedRequest;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a serializable request to a TriggerChunkedRequest.
|
|
6
|
+
*/
|
|
7
|
+
function toTriggerChunkedRequest(request, params) {
|
|
8
|
+
const { body, expiresAt, ...rest } = request;
|
|
9
|
+
const { actor, recipients, ...bodyRest } = body;
|
|
10
|
+
return {
|
|
11
|
+
...rest,
|
|
12
|
+
attempt: params.attempt,
|
|
13
|
+
body: {
|
|
14
|
+
...bodyRest,
|
|
15
|
+
...(actor && { actor: toRecipientRequest(actor) }),
|
|
16
|
+
recipients: recipients.map(toRecipientRequest),
|
|
17
|
+
},
|
|
18
|
+
expiresAt: new Date(expiresAt),
|
|
19
|
+
idempotencyKey: params.idempotencyKey,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function toRecipientRequest(recipient) {
|
|
23
|
+
if (typeof recipient === "string") {
|
|
24
|
+
return recipient;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
...recipient,
|
|
28
|
+
createdAt: recipient.createdAt ? new Date(recipient.createdAt) : undefined,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=toTriggerChunkedRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toTriggerChunkedRequest.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/toTriggerChunkedRequest.ts"],"names":[],"mappings":";;AAUA,0DAkBC;AArBD;;GAEG;AACH,SAAgB,uBAAuB,CACrC,OAA0C,EAC1C,MAAmD;IAEnD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;IAEhD,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE;YACJ,GAAG,QAAQ;YACX,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC;SAC/C;QACD,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC;QAC9B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAuC;IACjE,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,GAAG,SAAS;QACZ,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;KAC3E,CAAC;AACJ,CAAC"}
|
package/src/lib/types.d.ts
CHANGED
|
@@ -126,12 +126,7 @@ export interface TriggerRequest {
|
|
|
126
126
|
attempt: number;
|
|
127
127
|
/** Trigger payload. */
|
|
128
128
|
body: TriggerBody;
|
|
129
|
-
/**
|
|
130
|
-
* If true, the notification will not be sent, but the request will be validated and logged.
|
|
131
|
-
* Helpful when controlling notifications with feature flags.
|
|
132
|
-
*
|
|
133
|
-
* @default false
|
|
134
|
-
*/
|
|
129
|
+
/** If true, the notification will not be sent, but the request will be validated and logged. */
|
|
135
130
|
dryRun?: boolean;
|
|
136
131
|
/**
|
|
137
132
|
* `expiresAt` prevents stale notifications across retries by dropping the request when `now >
|
|
@@ -147,11 +142,7 @@ export interface TriggerRequest {
|
|
|
147
142
|
* @see {@link TriggerIdempotencyKey}
|
|
148
143
|
*/
|
|
149
144
|
idempotencyKey: TriggerIdempotencyKey;
|
|
150
|
-
/**
|
|
151
|
-
* Array of data keys to redact in logs for privacy.
|
|
152
|
-
*
|
|
153
|
-
* @default []
|
|
154
|
-
*/
|
|
145
|
+
/** Array of data keys to redact in logs for privacy. */
|
|
155
146
|
keysToRedact?: string[];
|
|
156
147
|
/** Workflow key. */
|
|
157
148
|
workflowKey: string;
|
|
@@ -292,3 +283,68 @@ export interface UpsertUserPreferencesRequest {
|
|
|
292
283
|
export interface UpsertUserPreferencesResponse {
|
|
293
284
|
userId: string;
|
|
294
285
|
}
|
|
286
|
+
/**
|
|
287
|
+
* Serializable version of InlineIdentifyUserRequest for background job payloads.
|
|
288
|
+
* The only change is `createdAt` is an ISO string instead of a Date.
|
|
289
|
+
*/
|
|
290
|
+
export interface SerializableInlineIdentifyUserRequest extends Omit<InlineIdentifyUserRequest, "createdAt"> {
|
|
291
|
+
/**
|
|
292
|
+
* The user's creation date as an ISO string.
|
|
293
|
+
*/
|
|
294
|
+
createdAt?: string;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Serializable recipient request for background job payloads.
|
|
298
|
+
*/
|
|
299
|
+
export type SerializableRecipientRequest = string | SerializableInlineIdentifyUserRequest;
|
|
300
|
+
/**
|
|
301
|
+
* Serializable TriggerBody for background job payloads.
|
|
302
|
+
* Recipients and actor use serializable types.
|
|
303
|
+
*/
|
|
304
|
+
export interface SerializableTriggerBody extends Omit<TriggerBody, "recipients" | "actor"> {
|
|
305
|
+
/**
|
|
306
|
+
* The recipients to trigger the workflow for.
|
|
307
|
+
*/
|
|
308
|
+
recipients: SerializableRecipientRequest[];
|
|
309
|
+
/**
|
|
310
|
+
* The trigger actor.
|
|
311
|
+
*/
|
|
312
|
+
actor?: SerializableRecipientRequest;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Request parameters for triggerChunked.
|
|
316
|
+
*
|
|
317
|
+
* Extends SerializableTriggerChunkedRequest with job-provided fields.
|
|
318
|
+
*/
|
|
319
|
+
export interface TriggerChunkedRequest extends Omit<TriggerRequest, "idempotencyKey"> {
|
|
320
|
+
/**
|
|
321
|
+
* Idempotency key base, typically the background job ID. Each chunk uses
|
|
322
|
+
* `${idempotencyKey}-${chunkNumber}`.
|
|
323
|
+
*/
|
|
324
|
+
idempotencyKey: string;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Response from triggerChunked.
|
|
328
|
+
*/
|
|
329
|
+
export interface TriggerChunkedResponse {
|
|
330
|
+
/** Results for each chunk. */
|
|
331
|
+
responses: Array<TriggerResponse & {
|
|
332
|
+
chunkNumber: number;
|
|
333
|
+
}>;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Serializable TriggerRequest for background job payloads.
|
|
337
|
+
*
|
|
338
|
+
* This is what gets enqueued in the background job. The job provides `attempt` and
|
|
339
|
+
* `idempotencyKey` at execution time, and `expiresAt` is an ISO string.
|
|
340
|
+
*/
|
|
341
|
+
export interface SerializableTriggerChunkedRequest extends Omit<TriggerChunkedRequest, "idempotencyKey" | "attempt" | "expiresAt" | "body"> {
|
|
342
|
+
/** Trigger payload. */
|
|
343
|
+
body: SerializableTriggerBody;
|
|
344
|
+
/**
|
|
345
|
+
* `expiresAt` as an ISO string. Set at enqueue-time so it remains stable across job retries.
|
|
346
|
+
*
|
|
347
|
+
* @see {@link TriggerRequest.expiresAt}
|
|
348
|
+
*/
|
|
349
|
+
expiresAt: string;
|
|
350
|
+
}
|