@clipboard-health/notifications 0.5.0 → 0.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/package.json +5 -5
- package/src/lib/chunkRecipients.d.ts +2 -2
- package/src/lib/chunkRecipients.js +5 -5
- package/src/lib/chunkRecipients.js.map +1 -1
- 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/internal/createTriggerTraceOptions.js +4 -1
- package/src/lib/internal/createTriggerTraceOptions.js.map +1 -1
- package/src/lib/internal/toInlineIdentifyUserRequest.d.ts +3 -0
- package/src/lib/internal/toInlineIdentifyUserRequest.js +12 -0
- package/src/lib/internal/toInlineIdentifyUserRequest.js.map +1 -0
- package/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.d.ts +3 -0
- package/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.js +18 -0
- package/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.js.map +1 -0
- package/src/lib/internal/toTenantSetRequest.d.ts +3 -0
- package/src/lib/internal/toTenantSetRequest.js +9 -0
- package/src/lib/internal/toTenantSetRequest.js.map +1 -0
- package/src/lib/internal/toTriggerBody.d.ts +3 -0
- package/src/lib/internal/toTriggerBody.js +21 -0
- package/src/lib/internal/toTriggerBody.js.map +1 -0
- package/src/lib/notificationClient.d.ts +2 -2
- package/src/lib/notificationClient.js +25 -38
- 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/src/lib/internal/toKnockBody.d.ts +0 -3
- package/src/lib/internal/toKnockBody.js +0 -35
- package/src/lib/internal/toKnockBody.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.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"bugs": "https://github.com/ClipboardHealth/core-utils/issues",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@clipboard-health/phone-number": "0.
|
|
8
|
-
"@clipboard-health/util-ts": "3.
|
|
7
|
+
"@clipboard-health/phone-number": "0.5.0",
|
|
8
|
+
"@clipboard-health/util-ts": "3.14.0",
|
|
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.
|
|
14
|
+
"@clipboard-health/testing-core": "0.23.0"
|
|
15
15
|
},
|
|
16
16
|
"keywords": [],
|
|
17
17
|
"license": "MIT",
|
|
@@ -4,15 +4,15 @@ exports.chunkRecipients = chunkRecipients;
|
|
|
4
4
|
const util_ts_1 = require("@clipboard-health/util-ts");
|
|
5
5
|
const notificationClient_1 = require("./notificationClient");
|
|
6
6
|
function chunkRecipients(params) {
|
|
7
|
-
const {
|
|
8
|
-
if (
|
|
9
|
-
return [{ idempotencyKey,
|
|
7
|
+
const { recipients, idempotencyKey } = params;
|
|
8
|
+
if (recipients.length === 0) {
|
|
9
|
+
return [{ idempotencyKey, recipients: [] }];
|
|
10
10
|
}
|
|
11
|
-
const idChunks = (0, util_ts_1.chunk)(
|
|
11
|
+
const idChunks = (0, util_ts_1.chunk)(recipients, notificationClient_1.MAXIMUM_RECIPIENTS_COUNT);
|
|
12
12
|
const singleChunk = idChunks.length === 1;
|
|
13
13
|
return idChunks.map((ids, index) => ({
|
|
14
14
|
idempotencyKey: singleChunk ? idempotencyKey : `${idempotencyKey}-chunk-${index + 1}`,
|
|
15
|
-
|
|
15
|
+
recipients: ids,
|
|
16
16
|
}));
|
|
17
17
|
}
|
|
18
18
|
//# sourceMappingURL=chunkRecipients.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkRecipients.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/chunkRecipients.ts"],"names":[],"mappings":";;AAIA,0CAgBC;AApBD,uDAAkD;AAElD,6DAAgE;AAEhE,SAAgB,eAAe,CAAC,MAG/B;IACC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"chunkRecipients.js","sourceRoot":"","sources":["../../../../../packages/notifications/src/lib/chunkRecipients.ts"],"names":[],"mappings":";;AAIA,0CAgBC;AApBD,uDAAkD;AAElD,6DAAgE;AAEhE,SAAgB,eAAe,CAAC,MAG/B;IACC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAE9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,eAAK,EAAC,UAAU,EAAE,6CAAwB,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,UAAU,KAAK,GAAG,CAAC,EAAE;QACrF,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -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,7 +5,10 @@ function createTriggerTraceOptions(params) {
|
|
|
5
5
|
const { key, attempt, destination } = params;
|
|
6
6
|
return {
|
|
7
7
|
resource: `notification.${key}`,
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Don't include high cardinality tags like expiresAt and idempotencyKey to reduce Datadog
|
|
10
|
+
* costs.
|
|
11
|
+
*/
|
|
9
12
|
tags: {
|
|
10
13
|
"span.kind": "producer",
|
|
11
14
|
component: "customer-notifications",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createTriggerTraceOptions.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/createTriggerTraceOptions.ts"],"names":[],"mappings":";;AAGA,
|
|
1
|
+
{"version":3,"file":"createTriggerTraceOptions.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/createTriggerTraceOptions.ts"],"names":[],"mappings":";;AAGA,8DAkBC;AAlBD,SAAgB,yBAAyB,CAAC,MAAyB;IACjE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAE7C,OAAO;QACL,QAAQ,EAAE,gBAAgB,GAAG,EAAE;QAC/B;;;WAGG;QACH,IAAI,EAAE;YACJ,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,wBAAwB;YACnC,kBAAkB,EAAE,WAAW;YAC/B,qBAAqB,EAAE,SAAS;YAChC,uBAAuB,EAAE,WAAW;YACpC,sBAAsB,EAAE,OAAO,CAAC,QAAQ,EAAE;SAC3C;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toInlineIdentifyUserRequest = toInlineIdentifyUserRequest;
|
|
4
|
+
const toInlineIdentifyUserRequestWithoutUserId_1 = require("./toInlineIdentifyUserRequestWithoutUserId");
|
|
5
|
+
function toInlineIdentifyUserRequest(recipient) {
|
|
6
|
+
const { userId, ...rest } = recipient;
|
|
7
|
+
return {
|
|
8
|
+
...(0, toInlineIdentifyUserRequestWithoutUserId_1.toInlineIdentifyUserRequestWithoutUserId)(rest),
|
|
9
|
+
id: userId,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=toInlineIdentifyUserRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toInlineIdentifyUserRequest.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/toInlineIdentifyUserRequest.ts"],"names":[],"mappings":";;AAKA,kEASC;AAXD,yGAAsG;AAEtG,SAAgB,2BAA2B,CACzC,SAAoC;IAEpC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;IAEtC,OAAO;QACL,GAAG,IAAA,mFAAwC,EAAC,IAAI,CAAC;QACjD,EAAE,EAAE,MAAM;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type Knock } from "@knocklabs/node";
|
|
2
|
+
import type { InlineIdentifyUserRequest } from "../types";
|
|
3
|
+
export declare function toInlineIdentifyUserRequestWithoutUserId(recipient: Omit<InlineIdentifyUserRequest, "userId">): Omit<Knock.Users.InlineIdentifyUserRequest, "id">;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toInlineIdentifyUserRequestWithoutUserId = toInlineIdentifyUserRequestWithoutUserId;
|
|
4
|
+
const formatPhoneNumber_1 = require("./formatPhoneNumber");
|
|
5
|
+
function toInlineIdentifyUserRequestWithoutUserId(recipient) {
|
|
6
|
+
const { channelData, createdAt, email, name, phoneNumber, timeZone, customProperties, ...rest } = recipient;
|
|
7
|
+
return {
|
|
8
|
+
...rest,
|
|
9
|
+
...customProperties,
|
|
10
|
+
...(channelData ? { channel_data: channelData } : {}),
|
|
11
|
+
...(createdAt ? { created_at: createdAt.toISOString() } : {}),
|
|
12
|
+
...(email ? { email } : {}),
|
|
13
|
+
...(name ? { name } : {}),
|
|
14
|
+
...(phoneNumber ? { phone_number: (0, formatPhoneNumber_1.formatPhoneNumber)({ phoneNumber }) } : {}),
|
|
15
|
+
...(timeZone ? { timezone: timeZone } : {}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=toInlineIdentifyUserRequestWithoutUserId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toInlineIdentifyUserRequestWithoutUserId.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/toInlineIdentifyUserRequestWithoutUserId.ts"],"names":[],"mappings":";;AAKA,4FAgBC;AAlBD,2DAAwD;AAExD,SAAgB,wCAAwC,CACtD,SAAoD;IAEpD,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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toTenantSetRequest = toTenantSetRequest;
|
|
4
|
+
const toInlineIdentifyUserRequestWithoutUserId_1 = require("./toInlineIdentifyUserRequestWithoutUserId");
|
|
5
|
+
function toTenantSetRequest(request) {
|
|
6
|
+
// Use the same type as user inline identify so provider field names are consistent.
|
|
7
|
+
return (0, toInlineIdentifyUserRequestWithoutUserId_1.toInlineIdentifyUserRequestWithoutUserId)(request);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=toTenantSetRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toTenantSetRequest.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/toTenantSetRequest.ts"],"names":[],"mappings":";;AAKA,gDAKC;AAPD,yGAAsG;AAEtG,SAAgB,kBAAkB,CAChC,OAAoD;IAEpD,oFAAoF;IACpF,OAAO,IAAA,mFAAwC,EAAC,OAAO,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toTriggerBody = toTriggerBody;
|
|
4
|
+
const toInlineIdentifyUserRequest_1 = require("./toInlineIdentifyUserRequest");
|
|
5
|
+
function toTriggerBody(body) {
|
|
6
|
+
const { actor, cancellationKey, recipients, workplaceId, ...rest } = body;
|
|
7
|
+
return {
|
|
8
|
+
...(actor ? { actor: toRecipient(actor) } : {}),
|
|
9
|
+
...(cancellationKey ? { cancellation_key: cancellationKey } : {}),
|
|
10
|
+
...(workplaceId ? { tenant: workplaceId } : {}),
|
|
11
|
+
recipients: recipients.map(toRecipient),
|
|
12
|
+
...rest,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function toRecipient(recipient) {
|
|
16
|
+
if (typeof recipient === "string") {
|
|
17
|
+
return recipient;
|
|
18
|
+
}
|
|
19
|
+
return (0, toInlineIdentifyUserRequest_1.toInlineIdentifyUserRequest)(recipient);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=toTriggerBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toTriggerBody.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/toTriggerBody.ts"],"names":[],"mappings":";;AAKA,sCAUC;AAZD,+EAA4E;AAE5E,SAAgB,aAAa,CAAC,IAAiB;IAC7C,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAE1E,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC;QACvC,GAAG,IAAI;KACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,SAA2B;IAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAA,yDAA2B,EAAC,SAAS,CAAC,CAAC;AAChD,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
|
*
|
|
@@ -97,7 +97,7 @@ export declare class NotificationClient {
|
|
|
97
97
|
*/
|
|
98
98
|
signUserToken(params: SignUserTokenRequest): Promise<ServiceResult<SignUserTokenResponse>>;
|
|
99
99
|
/**
|
|
100
|
-
* Updates or creates a workplace (tenant) in
|
|
100
|
+
* Updates or creates a workplace (tenant) in our provider.
|
|
101
101
|
*
|
|
102
102
|
* @returns Promise resolving to either an error or successful response.
|
|
103
103
|
*/
|
|
@@ -1,17 +1,14 @@
|
|
|
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
|
-
const formatPhoneNumber_1 = require("./internal/formatPhoneNumber");
|
|
12
8
|
const idempotentKnock_1 = require("./internal/idempotentKnock");
|
|
13
9
|
const redact_1 = require("./internal/redact");
|
|
14
|
-
const
|
|
10
|
+
const toTenantSetRequest_1 = require("./internal/toTenantSetRequest");
|
|
11
|
+
const toTriggerBody_1 = require("./internal/toTriggerBody");
|
|
15
12
|
const LOG_PARAMS = {
|
|
16
13
|
trigger: {
|
|
17
14
|
traceName: "notifications.trigger",
|
|
@@ -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, toTriggerBody_1.toTriggerBody)(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);
|
|
@@ -242,7 +227,7 @@ class NotificationClient {
|
|
|
242
227
|
}
|
|
243
228
|
}
|
|
244
229
|
/**
|
|
245
|
-
* Updates or creates a workplace (tenant) in
|
|
230
|
+
* Updates or creates a workplace (tenant) in our provider.
|
|
246
231
|
*
|
|
247
232
|
* @returns Promise resolving to either an error or successful response.
|
|
248
233
|
*/
|
|
@@ -251,17 +236,7 @@ class NotificationClient {
|
|
|
251
236
|
const logParams = { ...LOG_PARAMS.upsertWorkplace, workplaceId, ...body };
|
|
252
237
|
try {
|
|
253
238
|
this.logger.info(`${logParams.traceName} request`, logParams);
|
|
254
|
-
|
|
255
|
-
const knockBody = {
|
|
256
|
-
...(body.createdAt ? { created_at: body.createdAt.toISOString() } : {}),
|
|
257
|
-
...(body.email ? { email: body.email } : {}),
|
|
258
|
-
...(body.name ? { name: body.name } : {}),
|
|
259
|
-
...(body.phoneNumber
|
|
260
|
-
? { phone_number: (0, formatPhoneNumber_1.formatPhoneNumber)({ phoneNumber: body.phoneNumber }) }
|
|
261
|
-
: {}),
|
|
262
|
-
...(body.timeZone ? { timezone: body.timeZone } : {}),
|
|
263
|
-
};
|
|
264
|
-
const response = await this.provider.tenants.set(workplaceId, knockBody);
|
|
239
|
+
const response = await this.provider.tenants.set(workplaceId, (0, toTenantSetRequest_1.toTenantSetRequest)(body));
|
|
265
240
|
this.logger.info(`${logParams.traceName} response`, {
|
|
266
241
|
...logParams,
|
|
267
242
|
response: { workplaceId: response.id, name: response.name },
|
|
@@ -309,6 +284,18 @@ class NotificationClient {
|
|
|
309
284
|
logParams,
|
|
310
285
|
});
|
|
311
286
|
}
|
|
287
|
+
if (body.recipients.length > exports.MAXIMUM_RECIPIENTS_COUNT) {
|
|
288
|
+
const recipientsCount = body.recipients.length;
|
|
289
|
+
return this.createAndLogError({
|
|
290
|
+
notificationError: {
|
|
291
|
+
code: exports.ERROR_CODES.recipientCountAboveMaximum,
|
|
292
|
+
message: `Got ${recipientsCount} recipients; must be <= ${exports.MAXIMUM_RECIPIENTS_COUNT}.`,
|
|
293
|
+
},
|
|
294
|
+
span,
|
|
295
|
+
logParams,
|
|
296
|
+
metadata: { recipientsCount },
|
|
297
|
+
});
|
|
298
|
+
}
|
|
312
299
|
const now = new Date();
|
|
313
300
|
if (now > expiresAt) {
|
|
314
301
|
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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toKnockBody = toKnockBody;
|
|
4
|
-
const formatPhoneNumber_1 = require("./formatPhoneNumber");
|
|
5
|
-
function toKnockBody(body) {
|
|
6
|
-
const { actor, cancellationKey, recipients, workplaceId, ...rest } = body;
|
|
7
|
-
return {
|
|
8
|
-
...(actor ? { actor: toKnockRecipient(actor) } : {}),
|
|
9
|
-
...(cancellationKey ? { cancellation_key: cancellationKey } : {}),
|
|
10
|
-
...(workplaceId ? { tenant: workplaceId } : {}),
|
|
11
|
-
recipients: recipients.map(toKnockRecipient),
|
|
12
|
-
...rest,
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
function toKnockRecipient(recipient) {
|
|
16
|
-
if (typeof recipient === "string") {
|
|
17
|
-
return recipient;
|
|
18
|
-
}
|
|
19
|
-
return toKnockInlineIdentifyUserRequest(recipient);
|
|
20
|
-
}
|
|
21
|
-
function toKnockInlineIdentifyUserRequest(recipient) {
|
|
22
|
-
const { channelData, createdAt, email, name, phoneNumber, timeZone, userId, customProperties, ...rest } = recipient;
|
|
23
|
-
return {
|
|
24
|
-
...customProperties,
|
|
25
|
-
id: userId,
|
|
26
|
-
...(channelData ? { channel_data: channelData } : {}),
|
|
27
|
-
...(createdAt ? { created_at: createdAt.toISOString() } : {}),
|
|
28
|
-
...(email ? { email } : {}),
|
|
29
|
-
...(name ? { name } : {}),
|
|
30
|
-
...(phoneNumber ? { phone_number: (0, formatPhoneNumber_1.formatPhoneNumber)({ phoneNumber }) } : {}),
|
|
31
|
-
...(timeZone ? { timezone: timeZone } : {}),
|
|
32
|
-
...rest,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=toKnockBody.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toKnockBody.js","sourceRoot":"","sources":["../../../../../../packages/notifications/src/lib/internal/toKnockBody.ts"],"names":[],"mappings":";;AAKA,kCAUC;AAZD,2DAAwD;AAExD,SAAgB,WAAW,CAAC,IAAiB;IAC3C,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAE1E,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC5C,GAAG,IAAI;KACR,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,SAA2B;IACnD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,gCAAgC,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,gCAAgC,CACvC,SAAoC;IAEpC,MAAM,EACJ,WAAW,EACX,SAAS,EACT,KAAK,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,MAAM,EACN,gBAAgB,EAChB,GAAG,IAAI,EACR,GAAG,SAAS,CAAC;IAEd,OAAO;QACL,GAAG,gBAAgB;QACnB,EAAE,EAAE,MAAM;QACV,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;QAC3C,GAAG,IAAI;KACR,CAAC;AACJ,CAAC"}
|