@dudousxd/nestjs-notifications-webhook 0.3.0 → 0.4.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.
@@ -8,6 +8,14 @@ export interface WebhookChannelOptions {
8
8
  url?: string;
9
9
  /** Default headers merged into every request. */
10
10
  headers?: Record<string, string>;
11
+ /**
12
+ * HMAC-SHA256 secret. When set, the request is signed: the header (default
13
+ * `X-Signature-256`) is set to `sha256=<hex digest of the raw JSON body>`, so the receiver
14
+ * can verify authenticity. Per-tenant secrets work via `resolveOptions`.
15
+ */
16
+ secret?: string;
17
+ /** Header name for the signature. Default `X-Signature-256`. */
18
+ signatureHeader?: string;
11
19
  }
12
20
  /**
13
21
  * Implement this on a notification to define its webhook payload. Returning a plain
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.channel.d.ts","sourceRoot":"","sources":["../src/webhook.channel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EAEpB,KAAK,UAAU,EACf,KAAK,YAAY,EAIlB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,yFAAyF;AACzF,eAAO,MAAM,OAAO,6DAA2B,CAAC;AAEhD,wDAAwD;AACxD,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7E;AAED,0EAA0E;AAC1E,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,qBAAqB,CAAC;AAE/E;;;;GAIG;AACH,qBACa,cAAe,YAAW,aAAa;IAKhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAGxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAPlC,QAAQ,CAAC,OAAO,aAAa;gBAIV,OAAO,EAAE,qBAAqB,EAG9B,cAAc,CAAC,EAAE,sBAAsB,YAAA;IAGpD,IAAI,CACR,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC;YA8BF,IAAI;CAuBnB"}
1
+ {"version":3,"file":"webhook.channel.d.ts","sourceRoot":"","sources":["../src/webhook.channel.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EAEpB,KAAK,UAAU,EACf,KAAK,YAAY,EAIlB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD,yFAAyF;AACzF,eAAO,MAAM,OAAO,6DAA2B,CAAC;AAEhD,wDAAwD;AACxD,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7E;AAED,0EAA0E;AAC1E,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,qBAAqB,CAAC;AAE/E;;;;GAIG;AACH,qBACa,cAAe,YAAW,aAAa;IAKhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAGxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAPlC,QAAQ,CAAC,OAAO,aAAa;gBAIV,OAAO,EAAE,qBAAqB,EAG9B,cAAc,CAAC,EAAE,sBAAsB,YAAA;IAGpD,IAAI,CACR,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC;YA8BF,IAAI;CA6BnB"}
@@ -13,10 +13,12 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.WebhookChannel = exports.Webhook = void 0;
16
+ const node_crypto_1 = require("node:crypto");
16
17
  const nestjs_notifications_core_1 = require("@dudousxd/nestjs-notifications-core");
17
18
  const common_1 = require("@nestjs/common");
18
19
  const tokens_1 = require("./tokens");
19
20
  const webhook_message_1 = require("./webhook-message");
21
+ const DEFAULT_SIGNATURE_HEADER = 'X-Signature-256';
20
22
  /** Channel handle: use as `@Webhook()` on a payload method, or as a token in `via()`. */
21
23
  exports.Webhook = (0, nestjs_notifications_core_1.createChannel)('webhook');
22
24
  /**
@@ -52,15 +54,20 @@ let WebhookChannel = class WebhookChannel {
52
54
  await this.post(options, url, request.method, request.body, request.headers);
53
55
  }
54
56
  async post(options, url, method, body, messageHeaders) {
57
+ const payload = JSON.stringify(body);
55
58
  const headers = {
56
59
  ...options.headers,
57
60
  ...messageHeaders,
58
61
  'Content-Type': 'application/json',
59
62
  };
63
+ if (options.secret) {
64
+ const signature = (0, node_crypto_1.createHmac)('sha256', options.secret).update(payload).digest('hex');
65
+ headers[options.signatureHeader ?? DEFAULT_SIGNATURE_HEADER] = `sha256=${signature}`;
66
+ }
60
67
  const response = await fetch(url, {
61
68
  method,
62
69
  headers,
63
- body: JSON.stringify(body),
70
+ body: payload,
64
71
  });
65
72
  if (!response.ok) {
66
73
  throw new Error(`Webhook request to ${url} failed with status ${response.status}.`);
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.channel.js","sourceRoot":"","sources":["../src/webhook.channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhook.channel.js","sourceRoot":"","sources":["../src/webhook.channel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAAyC;AACzC,mFAS6C;AAC7C,2CAA8D;AAC9D,qCAAqE;AACrE,uDAAmD;AAGnD,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AAEnD,yFAAyF;AAC5E,QAAA,OAAO,GAAG,IAAA,yCAAa,EAAC,SAAS,CAAC,CAAC;AA8BhD;;;;GAIG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAc;IAKN;IAGA;IAPV,OAAO,GAAG,SAAS,CAAC;IAE7B,YAEmB,OAA8B,EAG9B,cAAuC;QAHvC,YAAO,GAAP,OAAO,CAAuB;QAG9B,mBAAc,GAAd,cAAc,CAAyB;IACvD,CAAC;IAEJ,KAAK,CAAC,IAAI,CACR,UAAsB,EACtB,YAA0B,EAC1B,OAAyB;QAEzB,MAAM,OAAO,GACX,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAE9F,MAAM,OAAO,GAAG,IAAA,sCAAU,EAAC,YAAY,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,GACP,YAAY,CAAC,WAA6C,CAAC,gBAAgB;gBAC5E,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC;YAChC,MAAM,IAAI,qDAAyB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAA6C,CAAC;QAC/E,MAAM,OAAO,GACX,MAAM,YAAY,gCAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,gCAAc,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAEpC,MAAM,KAAK,GAAG,IAAA,oCAAQ,EAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC;QAE1F,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,oFAAoF;gBAClF,2EAA2E,CAC9E,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,CAAC;IAEO,KAAK,CAAC,IAAI,CAChB,OAA8B,EAC9B,GAAW,EACX,MAAqB,EACrB,IAA6B,EAC7B,cAAsC;QAEtC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,GAAG,OAAO,CAAC,OAAO;YAClB,GAAG,cAAc;YACjB,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,IAAA,wBAAU,EAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrF,OAAO,CAAC,OAAO,CAAC,eAAe,IAAI,wBAAwB,CAAC,GAAG,UAAU,SAAS,EAAE,CAAC;QACvF,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,uBAAuB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;CACF,CAAA;AA1EY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,wBAAe,CAAC,CAAA;IAEvB,WAAA,IAAA,iBAAQ,GAAE,CAAA;IACV,WAAA,IAAA,eAAM,EAAC,iCAAwB,CAAC,CAAA;;GAPxB,cAAc,CA0E1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-notifications-webhook",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Webhook channel for nestjs-notifications — deliver notifications by POSTing JSON to an HTTP endpoint",
5
5
  "license": "MIT",
6
6
  "author": "Davide Carvalho",
@@ -20,10 +20,10 @@
20
20
  "@nestjs/common": "^10.0.0 || ^11.0.0"
21
21
  },
22
22
  "devDependencies": {
23
- "@nestjs/common": "^11.0.0",
24
- "reflect-metadata": "^0.2.2",
25
- "typescript": "^5.7.2",
26
- "@dudousxd/nestjs-notifications-core": "^0.4.0"
23
+ "@nestjs/common": "11.1.26",
24
+ "reflect-metadata": "0.2.2",
25
+ "typescript": "5.9.3",
26
+ "@dudousxd/nestjs-notifications-core": "^0.5.0"
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsc -p tsconfig.json",