@clipboard-health/notifications 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/lib/createIdempotencyKey.d.ts +6 -4
- package/src/lib/createIdempotencyKey.js +11 -9
- package/src/lib/createIdempotencyKey.js.map +1 -1
- package/src/lib/notificationClient.d.ts +1 -1
- package/src/lib/notificationClient.js +21 -24
- package/src/lib/notificationClient.js.map +1 -1
- package/src/lib/types.d.ts +7 -4
- package/src/lib/internal/createChunkedIdempotencyKey.d.ts +0 -18
- package/src/lib/internal/createChunkedIdempotencyKey.js +0 -30
- package/src/lib/internal/createChunkedIdempotencyKey.js.map +0 -1
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": "0.5.
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"bugs": "https://github.com/ClipboardHealth/core-utils/issues",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@clipboard-health/phone-number": "0.4.
|
|
8
|
-
"@clipboard-health/util-ts": "3.13.
|
|
7
|
+
"@clipboard-health/phone-number": "0.4.1",
|
|
8
|
+
"@clipboard-health/util-ts": "3.13.1",
|
|
9
9
|
"@knocklabs/node": "1.16.0",
|
|
10
|
-
"
|
|
10
|
+
"fast-json-stable-stringify": "2.1.0",
|
|
11
11
|
"tslib": "2.8.1"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
|
-
"@clipboard-health/testing-core": "0.22.
|
|
14
|
+
"@clipboard-health/testing-core": "0.22.1"
|
|
15
15
|
},
|
|
16
16
|
"keywords": [],
|
|
17
17
|
"license": "MIT",
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
export declare const MAX_IDEMPOTENCY_KEY_LENGTH = 255;
|
|
1
2
|
/**
|
|
2
3
|
* Creates a deterministic hash for use as an idempotency key.
|
|
3
4
|
*
|
|
4
|
-
* The function
|
|
5
|
-
* truncates the result to MAX_IDEMPOTENCY_KEY_LENGTH
|
|
5
|
+
* The function normalizes `value` (using a stable JSON.stringify for non-string values), generates
|
|
6
|
+
* a SHA-256 hash, prepends the workflow key, and truncates the result to MAX_IDEMPOTENCY_KEY_LENGTH
|
|
7
|
+
* maximum.
|
|
6
8
|
*
|
|
7
9
|
* @param params.key - Workflow key to prepend to the hash.
|
|
8
|
-
* @param params.
|
|
10
|
+
* @param params.value - Value to hash (string, string[], object, etc.).
|
|
9
11
|
*
|
|
10
12
|
* @returns A hash string prefixed with the workflow key.
|
|
11
13
|
*/
|
|
12
14
|
export declare function createIdempotencyKey(params: {
|
|
13
15
|
key: string;
|
|
14
|
-
|
|
16
|
+
value: unknown;
|
|
15
17
|
}): string;
|
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_IDEMPOTENCY_KEY_LENGTH = void 0;
|
|
3
4
|
exports.createIdempotencyKey = createIdempotencyKey;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
4
6
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
const
|
|
7
|
+
const fast_json_stable_stringify_1 = tslib_1.__importDefault(require("fast-json-stable-stringify"));
|
|
8
|
+
exports.MAX_IDEMPOTENCY_KEY_LENGTH = 255;
|
|
6
9
|
/**
|
|
7
10
|
* Creates a deterministic hash for use as an idempotency key.
|
|
8
11
|
*
|
|
9
|
-
* The function
|
|
10
|
-
* truncates the result to MAX_IDEMPOTENCY_KEY_LENGTH
|
|
12
|
+
* The function normalizes `value` (using a stable JSON.stringify for non-string values), generates
|
|
13
|
+
* a SHA-256 hash, prepends the workflow key, and truncates the result to MAX_IDEMPOTENCY_KEY_LENGTH
|
|
14
|
+
* maximum.
|
|
11
15
|
*
|
|
12
16
|
* @param params.key - Workflow key to prepend to the hash.
|
|
13
|
-
* @param params.
|
|
17
|
+
* @param params.value - Value to hash (string, string[], object, etc.).
|
|
14
18
|
*
|
|
15
19
|
* @returns A hash string prefixed with the workflow key.
|
|
16
20
|
*/
|
|
17
21
|
function createIdempotencyKey(params) {
|
|
18
|
-
const { key,
|
|
22
|
+
const { key, value } = params;
|
|
19
23
|
const hash = (0, node_crypto_1.createHash)("sha256")
|
|
20
|
-
|
|
21
|
-
.update(JSON.stringify([...valuesToHash].sort()))
|
|
24
|
+
.update(typeof value === "string" ? value : (0, fast_json_stable_stringify_1.default)(value))
|
|
22
25
|
.digest("hex");
|
|
23
|
-
|
|
24
|
-
return result.slice(0, createChunkedIdempotencyKey_1.MAX_IDEMPOTENCY_KEY_LENGTH);
|
|
26
|
+
return `${key}:${hash}`.slice(0, exports.MAX_IDEMPOTENCY_KEY_LENGTH);
|
|
25
27
|
}
|
|
26
28
|
//# sourceMappingURL=createIdempotencyKey.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createIdempotencyKey.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/createIdempotencyKey.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"createIdempotencyKey.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/createIdempotencyKey.ts"],"names":[],"mappings":";;;AAkBA,oDAQC;;AA1BD,6CAAyC;AAEzC,oGAAmD;AAEtC,QAAA,0BAA0B,GAAG,GAAG,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,SAAgB,oBAAoB,CAAC,MAAuC;IAC1E,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAE9B,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,oCAAS,EAAC,KAAK,CAAC,CAAC;SAC5D,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjB,OAAO,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,kCAA0B,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -5,6 +5,7 @@ export declare const MAXIMUM_RECIPIENTS_COUNT = 1000;
|
|
|
5
5
|
export declare const ERROR_CODES: {
|
|
6
6
|
readonly expired: "expired";
|
|
7
7
|
readonly recipientCountBelowMinimum: "recipientCountBelowMinimum";
|
|
8
|
+
readonly recipientCountAboveMaximum: "recipientCountAboveMaximum";
|
|
8
9
|
readonly missingSigningKey: "missingSigningKey";
|
|
9
10
|
readonly unknown: "unknown";
|
|
10
11
|
};
|
|
@@ -32,7 +33,6 @@ export declare class NotificationClient {
|
|
|
32
33
|
* - Stale notifications prevention through expiresAt.
|
|
33
34
|
* - Logging with sensitive data redaction.
|
|
34
35
|
* - Distributed tracing with notification metadata.
|
|
35
|
-
* - Chunking to prevent exceeding maximum recipient count.
|
|
36
36
|
* - Idempotency to prevent duplicate notifications.
|
|
37
37
|
* - Comprehensive error handling and logging.
|
|
38
38
|
*
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NotificationClient = exports.ERROR_CODES = exports.MAXIMUM_RECIPIENTS_COUNT = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
4
|
const util_ts_1 = require("@clipboard-health/util-ts");
|
|
6
5
|
const node_1 = require("@knocklabs/node");
|
|
7
|
-
const p_limit_1 = tslib_1.__importDefault(require("p-limit"));
|
|
8
|
-
const createChunkedIdempotencyKey_1 = require("./internal/createChunkedIdempotencyKey");
|
|
9
6
|
const createTriggerLogParams_1 = require("./internal/createTriggerLogParams");
|
|
10
7
|
const createTriggerTraceOptions_1 = require("./internal/createTriggerTraceOptions");
|
|
11
8
|
const formatPhoneNumber_1 = require("./internal/formatPhoneNumber");
|
|
@@ -34,6 +31,7 @@ exports.MAXIMUM_RECIPIENTS_COUNT = 1000;
|
|
|
34
31
|
exports.ERROR_CODES = {
|
|
35
32
|
expired: "expired",
|
|
36
33
|
recipientCountBelowMinimum: "recipientCountBelowMinimum",
|
|
34
|
+
recipientCountAboveMaximum: "recipientCountAboveMaximum",
|
|
37
35
|
missingSigningKey: "missingSigningKey",
|
|
38
36
|
unknown: "unknown",
|
|
39
37
|
};
|
|
@@ -67,7 +65,6 @@ class NotificationClient {
|
|
|
67
65
|
* - Stale notifications prevention through expiresAt.
|
|
68
66
|
* - Logging with sensitive data redaction.
|
|
69
67
|
* - Distributed tracing with notification metadata.
|
|
70
|
-
* - Chunking to prevent exceeding maximum recipient count.
|
|
71
68
|
* - Idempotency to prevent duplicate notifications.
|
|
72
69
|
* - Comprehensive error handling and logging.
|
|
73
70
|
*
|
|
@@ -124,26 +121,14 @@ class NotificationClient {
|
|
|
124
121
|
return validated;
|
|
125
122
|
}
|
|
126
123
|
try {
|
|
127
|
-
const { key, body, idempotencyKey
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
totalChunks: chunks.length,
|
|
136
|
-
});
|
|
137
|
-
return await limit(async () => {
|
|
138
|
-
this.logTriggerRequest({ logParams, body: chunkedBody, keysToRedact });
|
|
139
|
-
const response = await this.provider.workflows.trigger(key, (0, toKnockBody_1.toKnockBody)(chunkedBody), { idempotencyKey: chunkedKey });
|
|
140
|
-
const id = response.workflow_run_id;
|
|
141
|
-
this.logTriggerResponse({ span, response, id, logParams });
|
|
142
|
-
return id;
|
|
143
|
-
});
|
|
144
|
-
}));
|
|
145
|
-
// workflowRunIds[0] is safe because recipients are validated to be > 0
|
|
146
|
-
return (0, util_ts_1.success)({ id: workflowRunIds[0], ids: workflowRunIds });
|
|
124
|
+
const { key, body, idempotencyKey, keysToRedact = [] } = validated.value;
|
|
125
|
+
this.logTriggerRequest({ logParams, body, keysToRedact });
|
|
126
|
+
const response = await this.provider.workflows.trigger(key, (0, toKnockBody_1.toKnockBody)(body), {
|
|
127
|
+
idempotencyKey,
|
|
128
|
+
});
|
|
129
|
+
const id = response.workflow_run_id;
|
|
130
|
+
this.logTriggerResponse({ span, response, id, logParams });
|
|
131
|
+
return (0, util_ts_1.success)({ id });
|
|
147
132
|
}
|
|
148
133
|
catch (maybeError) {
|
|
149
134
|
const error = (0, util_ts_1.toError)(maybeError);
|
|
@@ -309,6 +294,18 @@ class NotificationClient {
|
|
|
309
294
|
logParams,
|
|
310
295
|
});
|
|
311
296
|
}
|
|
297
|
+
if (body.recipients.length > exports.MAXIMUM_RECIPIENTS_COUNT) {
|
|
298
|
+
const recipientsCount = body.recipients.length;
|
|
299
|
+
return this.createAndLogError({
|
|
300
|
+
notificationError: {
|
|
301
|
+
code: exports.ERROR_CODES.recipientCountAboveMaximum,
|
|
302
|
+
message: `Got ${recipientsCount} recipients; must be <= ${exports.MAXIMUM_RECIPIENTS_COUNT}.`,
|
|
303
|
+
},
|
|
304
|
+
span,
|
|
305
|
+
logParams,
|
|
306
|
+
metadata: { recipientsCount },
|
|
307
|
+
});
|
|
308
|
+
}
|
|
312
309
|
const now = new Date();
|
|
313
310
|
if (now > expiresAt) {
|
|
314
311
|
return this.createAndLogError({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notificationClient.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/notificationClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notificationClient.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/notificationClient.ts"],"names":[],"mappings":"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"}
|
package/src/lib/types.d.ts
CHANGED
|
@@ -129,7 +129,12 @@ export interface TriggerRequest {
|
|
|
129
129
|
body: TriggerBody;
|
|
130
130
|
/**
|
|
131
131
|
* Key to prevent duplicate requests if provider supports it. It's important it is deterministic
|
|
132
|
-
* ({@link createIdempotencyKey}) and remains the same across
|
|
132
|
+
* ({@link createIdempotencyKey}) and remains the same across retry logic.
|
|
133
|
+
*
|
|
134
|
+
* If you retry a request with the same idempotency key within 24 hours from the original request,
|
|
135
|
+
* we will return the same response as the original request. Idempotent requests are expected to
|
|
136
|
+
* be identical. To prevent accidental misuse, the client throws an error when incoming parameters
|
|
137
|
+
* don't match those from the original request.
|
|
133
138
|
*
|
|
134
139
|
* Ensure your idempotency key doesn't prevent recipients from receiving notifications. For
|
|
135
140
|
* example, if you use the workflow key and the recipient's ID as the idempotency key, but it's
|
|
@@ -156,10 +161,8 @@ export interface TriggerRequest {
|
|
|
156
161
|
* Response from triggering a notification.
|
|
157
162
|
*/
|
|
158
163
|
export interface TriggerResponse {
|
|
159
|
-
/** Third-party provider's unique identifier
|
|
164
|
+
/** Third-party provider's unique identifier. */
|
|
160
165
|
id: string;
|
|
161
|
-
/** Array of all workflow run IDs (one per chunk). */
|
|
162
|
-
ids: string[];
|
|
163
166
|
}
|
|
164
167
|
/**
|
|
165
168
|
* Request parameters for appending a push token.
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export declare const MAX_IDEMPOTENCY_KEY_LENGTH = 255;
|
|
2
|
-
/**
|
|
3
|
-
* Creates a chunked idempotency key by appending a chunk suffix.
|
|
4
|
-
*
|
|
5
|
-
* If the idempotency key with the chunk suffix exceeds MAX_IDEMPOTENCY_KEY_LENGTH characters, it
|
|
6
|
-
* truncates the base key to fit within the limit.
|
|
7
|
-
*
|
|
8
|
-
* @param params.baseKey - The base idempotency key
|
|
9
|
-
* @param params.chunkIndex - Zero-based chunk index
|
|
10
|
-
* @param params.totalChunks - Total number of chunks
|
|
11
|
-
*
|
|
12
|
-
* @returns An idempotency key with chunk information, max MAX_IDEMPOTENCY_KEY_LENGTH characters
|
|
13
|
-
*/
|
|
14
|
-
export declare function createChunkedIdempotencyKey(params: {
|
|
15
|
-
baseKey: string;
|
|
16
|
-
chunkIndex: number;
|
|
17
|
-
totalChunks: number;
|
|
18
|
-
}): string;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MAX_IDEMPOTENCY_KEY_LENGTH = void 0;
|
|
4
|
-
exports.createChunkedIdempotencyKey = createChunkedIdempotencyKey;
|
|
5
|
-
exports.MAX_IDEMPOTENCY_KEY_LENGTH = 255;
|
|
6
|
-
/**
|
|
7
|
-
* Creates a chunked idempotency key by appending a chunk suffix.
|
|
8
|
-
*
|
|
9
|
-
* If the idempotency key with the chunk suffix exceeds MAX_IDEMPOTENCY_KEY_LENGTH characters, it
|
|
10
|
-
* truncates the base key to fit within the limit.
|
|
11
|
-
*
|
|
12
|
-
* @param params.baseKey - The base idempotency key
|
|
13
|
-
* @param params.chunkIndex - Zero-based chunk index
|
|
14
|
-
* @param params.totalChunks - Total number of chunks
|
|
15
|
-
*
|
|
16
|
-
* @returns An idempotency key with chunk information, max MAX_IDEMPOTENCY_KEY_LENGTH characters
|
|
17
|
-
*/
|
|
18
|
-
function createChunkedIdempotencyKey(params) {
|
|
19
|
-
const { baseKey, chunkIndex, totalChunks } = params;
|
|
20
|
-
if (totalChunks === 1) {
|
|
21
|
-
return baseKey.slice(0, exports.MAX_IDEMPOTENCY_KEY_LENGTH);
|
|
22
|
-
}
|
|
23
|
-
const chunkSuffix = `-chunk-${chunkIndex + 1}`;
|
|
24
|
-
const maxBaseKeyLength = exports.MAX_IDEMPOTENCY_KEY_LENGTH - chunkSuffix.length;
|
|
25
|
-
const fullKey = `${baseKey}${chunkSuffix}`;
|
|
26
|
-
return fullKey.length <= exports.MAX_IDEMPOTENCY_KEY_LENGTH
|
|
27
|
-
? fullKey
|
|
28
|
-
: `${baseKey.slice(0, maxBaseKeyLength)}${chunkSuffix}`;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=createChunkedIdempotencyKey.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createChunkedIdempotencyKey.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/createChunkedIdempotencyKey.ts"],"names":[],"mappings":";;;AAcA,kEAkBC;AAhCY,QAAA,0BAA0B,GAAG,GAAG,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,SAAgB,2BAA2B,CAAC,MAI3C;IACC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEpD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,kCAA0B,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,UAAU,GAAG,CAAC,EAAE,CAAC;IAC/C,MAAM,gBAAgB,GAAG,kCAA0B,GAAG,WAAW,CAAC,MAAM,CAAC;IACzE,MAAM,OAAO,GAAG,GAAG,OAAO,GAAG,WAAW,EAAE,CAAC;IAE3C,OAAO,OAAO,CAAC,MAAM,IAAI,kCAA0B;QACjD,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,WAAW,EAAE,CAAC;AAC5D,CAAC"}
|