@robono/server 0.4.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/dist/webhooks.js CHANGED
@@ -1,10 +1,31 @@
1
1
  import { createHmac, timingSafeEqual } from "node:crypto";
2
2
  import { RobonoWebhookError } from "./errors.js";
3
+ const webhookEventNames = new Set([
4
+ "connection.status_changed",
5
+ "connection.profile_updated",
6
+ "message.created",
7
+ "message.delivered",
8
+ "message.heard",
9
+ "message.reaction_updated",
10
+ "bridge.connection_requested",
11
+ "bridge.connection_status_changed",
12
+ "bridge.connection_updated",
13
+ "bridge.message_created",
14
+ "bridge.message_status_changed",
15
+ "bridge.guardian_message_created",
16
+ "bridge.guardian_message_status_changed",
17
+ "transform.completed",
18
+ "transform.failed",
19
+ "diagnostic.push_requested",
20
+ ]);
3
21
  export async function verifyRobonoWebhook(rawBody, headers, webhookSecret, options = {}) {
4
22
  const timestamp = header(headers, "robono-webhook-timestamp");
5
23
  const signatureHeader = header(headers, "robono-webhook-signature");
6
24
  const headerEventId = header(headers, "robono-webhook-id");
7
25
  const requestId = header(headers, "robono-request-id");
26
+ if (!webhookSecret?.trim()) {
27
+ throw new RobonoWebhookError("The Robono webhook secret is missing.", "missing_webhook_secret");
28
+ }
8
29
  if (!timestamp || !signatureHeader) {
9
30
  throw new RobonoWebhookError("The Robono webhook signature headers are missing.", "missing_webhook_signature");
10
31
  }
@@ -35,13 +56,21 @@ export async function verifyRobonoWebhook(rawBody, headers, webhookSecret, optio
35
56
  if (!event || typeof event !== "object" || typeof event.event !== "string") {
36
57
  throw new RobonoWebhookError("The Robono webhook event is missing.", "invalid_webhook_event");
37
58
  }
59
+ if (!webhookEventNames.has(event.event)) {
60
+ throw new RobonoWebhookError(`The Robono webhook event "${event.event}" is not supported.`, "unsupported_webhook_event");
61
+ }
38
62
  const eventId = event.event_id || headerEventId;
39
63
  if (!eventId) {
40
64
  throw new RobonoWebhookError("The Robono webhook event ID is missing.", "missing_webhook_event_id");
41
65
  }
42
- const duplicate = options.hasProcessedEvent
43
- ? await options.hasProcessedEvent(eventId)
44
- : false;
66
+ if (event.event_id && headerEventId && event.event_id !== headerEventId) {
67
+ throw new RobonoWebhookError("The Robono webhook event ID does not match its header.", "webhook_event_id_mismatch");
68
+ }
69
+ const duplicate = options.claimEvent
70
+ ? !(await options.claimEvent(eventId))
71
+ : options.hasProcessedEvent
72
+ ? await options.hasProcessedEvent(eventId)
73
+ : false;
45
74
  return {
46
75
  event,
47
76
  eventId,
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robono/server",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Provider-neutral server SDK for the Robono Bridge API.",
5
5
  "keywords": [
6
6
  "robono",
@@ -11,11 +11,6 @@
11
11
  "typescript"
12
12
  ],
13
13
  "homepage": "https://robono.com/docs#start",
14
- "repository": {
15
- "type": "git",
16
- "url": "git+https://github.com/IMLX16/Robono.git",
17
- "directory": "packages/server"
18
- },
19
14
  "bugs": {
20
15
  "url": "https://robono.com/contact"
21
16
  },
@@ -33,7 +28,8 @@
33
28
  }
34
29
  },
35
30
  "bin": {
36
- "robono-sandbox-test": "dist/sandbox-test.js"
31
+ "robono-sandbox-test": "dist/sandbox-test.js",
32
+ "robono-adapter-test": "dist/adapter-smoke-test.js"
37
33
  },
38
34
  "files": [
39
35
  "dist",