@usequeek/app-sdk 0.4.0 → 0.5.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,8 +1,15 @@
1
- import { Hono } from "hono";
1
+ import { decodeBody, readHeader, toResponse, } from "./delivery.js";
2
2
  import { MAX_TIMESTAMP_SKEW_SECONDS, verifyQueekSignature, WEBHOOK_ID_HEADER, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_TIMESTAMP_HEADER, } from "./signatures.js";
3
3
  /**
4
- * Receiver for Queek topic deliveries (`DeliverWebhookJob` in
5
- * queek_backend, one signed POST per installation endpoint).
4
+ * Framework-agnostic receiver for Queek topic deliveries
5
+ * (`DeliverWebhookJob` in queek_backend, one signed POST per installation
6
+ * endpoint) in three thin layers: layer 1
7
+ * `handleWebhookDelivery(input, options)` takes plain data (untouched body
8
+ * bytes + headers) and returns a plain `{ status, body }` result — zero
9
+ * request/response types, so whatever request object each framework
10
+ * supports works; layer 2 `handleWebhookRequest(request, options)` adapts
11
+ * the Web standard onto layer 1; layer 3 (`@usequeek/app-sdk/hono`)
12
+ * adapts Hono onto layer 2.
6
13
  *
7
14
  * Delivery envelope: `{ id, topic, api_version: "v1", created_at, data }`
8
15
  * with `X-Queek-Topic` echoing `topic`. Verification uses the
@@ -51,75 +58,90 @@ async function defaultResolveSecret(store, rawBody, headers, envelope) {
51
58
  }
52
59
  return null;
53
60
  }
54
- export function createWebhookHandler(options) {
55
- const app = new Hono();
61
+ /**
62
+ * Layer 1: handle one signed Queek topic delivery from plain data — no
63
+ * `Request`, no framework. Same options, same behaviour, same
64
+ * errors/status codes at every layer.
65
+ */
66
+ export async function handleWebhookDelivery(input, options) {
56
67
  const maxSkew = options.maxSkewSeconds ?? MAX_TIMESTAMP_SKEW_SECONDS;
57
- app.post("/", async (c) => {
58
- const rawBody = await c.req.text();
59
- const id = c.req.header(WEBHOOK_ID_HEADER);
60
- const timestamp = c.req.header(WEBHOOK_TIMESTAMP_HEADER);
61
- const signatureHeader = c.req.header(WEBHOOK_SIGNATURE_HEADER);
62
- if (!id || !timestamp || !signatureHeader) {
63
- return c.json({ ok: false, error: "missing signature headers" }, 401);
64
- }
65
- let envelope = null;
66
- try {
67
- const parsed = JSON.parse(rawBody);
68
- if (typeof parsed === "object" && parsed !== null)
69
- envelope = parsed;
70
- }
71
- catch {
72
- return c.json({ ok: false, error: "invalid_json" }, 400);
73
- }
74
- if (!envelope || typeof envelope.topic !== "string") {
75
- return c.json({ ok: false, error: "invalid_envelope" }, 400);
76
- }
77
- const headers = { id, timestamp, signatureHeader };
78
- const resolution = options.resolveSecret
79
- ? await options.resolveSecret(envelope, rawBody, headers)
80
- : await defaultResolveSecret(options.store, rawBody, headers, envelope);
81
- if (!resolution) {
82
- return c.json({ ok: false, error: "unknown_installation" }, 401);
83
- }
84
- // Freshness is enforced HERE, once, against the resolved secret — the
85
- // lookup above deliberately skips it so a stale delivery cannot be
86
- // misattributed before it is rejected.
87
- const now = options.nowSeconds ?? Math.floor(Date.now() / 1000);
88
- const ts = Number(timestamp);
89
- if (!Number.isFinite(ts) || Math.abs(now - ts) > maxSkew) {
90
- return c.json({ ok: false, error: "stale timestamp" }, 401);
91
- }
92
- // Freshness was enforced above; this re-checks the MAC only, so a
93
- // custom resolver cannot claim an installation without its secret.
94
- if (!verifyQueekSignature({ ...headers, body: rawBody, secret: resolution.secret }, { skipFreshnessCheck: true })) {
95
- return c.json({ ok: false, error: "signature mismatch" }, 401);
96
- }
97
- const installation = await options.store.getInstallation(resolution.installationId);
98
- if (!installation) {
99
- return c.json({ ok: false, error: "unknown_installation" }, 401);
100
- }
101
- // Atomic claim on the HEADER id: exactly one concurrent same-id
102
- // delivery runs the handler; the rest answer deduped.
103
- if (!(await options.store.claimWebhookId(id))) {
104
- return c.json({ ok: true, deduped: true });
105
- }
106
- const topic = c.req.header(QUEEK_TOPIC_HEADER) ?? envelope.topic;
107
- const handler = options.handlers[topic];
108
- if (!handler) {
109
- // No handler for this topic is NOT a failure: answering non-2xx would
110
- // retry for hours something the app will never handle. The claim
111
- // stands as the seen-record.
112
- return c.json({ ok: true, unhandled: true });
113
- }
114
- try {
115
- await handler(envelope, { installation, topic, eventId: id });
116
- }
117
- catch {
118
- await options.store.releaseWebhookId(id);
119
- return c.json({ ok: false, error: "handler_failed" }, 500);
120
- }
121
- return c.json({ ok: true });
122
- });
123
- return app;
68
+ const rawBody = decodeBody(input.rawBody);
69
+ const id = readHeader(input.headers, WEBHOOK_ID_HEADER);
70
+ const timestamp = readHeader(input.headers, WEBHOOK_TIMESTAMP_HEADER);
71
+ const signatureHeader = readHeader(input.headers, WEBHOOK_SIGNATURE_HEADER);
72
+ if (!id || !timestamp || !signatureHeader) {
73
+ return { status: 401, body: { ok: false, error: "missing signature headers" } };
74
+ }
75
+ let envelope = null;
76
+ try {
77
+ const parsed = JSON.parse(rawBody);
78
+ if (typeof parsed === "object" && parsed !== null)
79
+ envelope = parsed;
80
+ }
81
+ catch {
82
+ return { status: 400, body: { ok: false, error: "invalid_json" } };
83
+ }
84
+ if (!envelope || typeof envelope.topic !== "string") {
85
+ return { status: 400, body: { ok: false, error: "invalid_envelope" } };
86
+ }
87
+ const headers = { id, timestamp, signatureHeader };
88
+ const resolution = options.resolveSecret
89
+ ? await options.resolveSecret(envelope, rawBody, headers)
90
+ : await defaultResolveSecret(options.store, rawBody, headers, envelope);
91
+ if (!resolution) {
92
+ return { status: 401, body: { ok: false, error: "unknown_installation" } };
93
+ }
94
+ // Freshness is enforced HERE, once, against the resolved secret — the
95
+ // lookup above deliberately skips it so a stale delivery cannot be
96
+ // misattributed before it is rejected.
97
+ const now = options.nowSeconds ?? Math.floor(Date.now() / 1000);
98
+ const ts = Number(timestamp);
99
+ if (!Number.isFinite(ts) || Math.abs(now - ts) > maxSkew) {
100
+ return { status: 401, body: { ok: false, error: "stale timestamp" } };
101
+ }
102
+ // Freshness was enforced above; this re-checks the MAC only, so a
103
+ // custom resolver cannot claim an installation without its secret.
104
+ if (!verifyQueekSignature({ ...headers, body: rawBody, secret: resolution.secret }, { skipFreshnessCheck: true })) {
105
+ return { status: 401, body: { ok: false, error: "signature mismatch" } };
106
+ }
107
+ const installation = await options.store.getInstallation(resolution.installationId);
108
+ if (!installation) {
109
+ return { status: 401, body: { ok: false, error: "unknown_installation" } };
110
+ }
111
+ // Atomic claim on the HEADER id: exactly one concurrent same-id
112
+ // delivery runs the handler; the rest answer deduped.
113
+ if (!(await options.store.claimWebhookId(id))) {
114
+ return { status: 200, body: { ok: true, deduped: true } };
115
+ }
116
+ const topic = readHeader(input.headers, QUEEK_TOPIC_HEADER) ?? envelope.topic;
117
+ const handler = options.handlers[topic];
118
+ if (!handler) {
119
+ // No handler for this topic is NOT a failure: answering non-2xx would
120
+ // retry for hours something the app will never handle. The claim
121
+ // stands as the seen-record.
122
+ return { status: 200, body: { ok: true, unhandled: true } };
123
+ }
124
+ try {
125
+ await handler(envelope, { installation, topic, eventId: id });
126
+ }
127
+ catch {
128
+ await options.store.releaseWebhookId(id);
129
+ return { status: 500, body: { ok: false, error: "handler_failed" } };
130
+ }
131
+ return { status: 200, body: { ok: true } };
132
+ }
133
+ /**
134
+ * Layer 2: the Web-standard wrapper, built ONLY on layer 1 — reads
135
+ * `await request.arrayBuffer()` + headers, calls the core, builds the
136
+ * `Response`. Only `POST` is served; anything else answers 405.
137
+ */
138
+ export async function handleWebhookRequest(request, options) {
139
+ if (request.method.toUpperCase() !== "POST") {
140
+ return toResponse({ status: 405, body: { ok: false, error: "method_not_allowed" } });
141
+ }
142
+ return toResponse(await handleWebhookDelivery({
143
+ rawBody: new Uint8Array(await request.arrayBuffer()),
144
+ headers: request.headers,
145
+ }, options));
124
146
  }
125
147
  //# sourceMappingURL=webhooks.js.map
@@ -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": "@usequeek/app-sdk",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "SDK for Queek installable apps: webhook signature verification, install handlers, typed Merchant API client, webhook dispatch, encrypted installation store.",
@@ -22,6 +22,10 @@
22
22
  "./server": {
23
23
  "types": "./dist/server.d.ts",
24
24
  "default": "./dist/server.js"
25
+ },
26
+ "./hono": {
27
+ "types": "./dist/hono.d.ts",
28
+ "default": "./dist/hono.js"
25
29
  }
26
30
  },
27
31
  "files": [
@@ -44,6 +48,11 @@
44
48
  "peerDependencies": {
45
49
  "hono": "^4"
46
50
  },
51
+ "peerDependenciesMeta": {
52
+ "hono": {
53
+ "optional": true
54
+ }
55
+ },
47
56
  "devDependencies": {
48
57
  "@biomejs/biome": "2.5.14",
49
58
  "@types/node": "22.20.4",