@objectstack/plugin-webhooks 7.5.0 → 7.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/.turbo/turbo-build.log +20 -32
- package/CHANGELOG.md +49 -0
- package/dist/chunk-HWFTXTTI.js +138 -0
- package/dist/chunk-HWFTXTTI.js.map +1 -0
- package/dist/chunk-KPKLAXNA.cjs +138 -0
- package/dist/chunk-KPKLAXNA.cjs.map +1 -0
- package/dist/index.cjs +62 -616
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -325
- package/dist/index.d.ts +41 -325
- package/dist/index.js +52 -606
- package/dist/index.js.map +1 -1
- package/dist/schema.cjs +2 -6
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +5 -4764
- package/dist/schema.d.ts +5 -4764
- package/dist/schema.js +3 -7
- package/package.json +4 -11
- package/src/auto-enqueuer.test.ts +83 -116
- package/src/auto-enqueuer.ts +38 -27
- package/src/index.ts +13 -40
- package/src/schema.ts +11 -16
- package/src/webhook-outbox-plugin.ts +80 -296
- package/tsup.config.ts +1 -1
- package/dist/chunk-7HS5DLU2.js +0 -319
- package/dist/chunk-7HS5DLU2.js.map +0 -1
- package/dist/chunk-HF7CCDPB.cjs +0 -256
- package/dist/chunk-HF7CCDPB.cjs.map +0 -1
- package/dist/chunk-KNGLLSSP.js +0 -256
- package/dist/chunk-KNGLLSSP.js.map +0 -1
- package/dist/chunk-TDSI7UHY.cjs +0 -319
- package/dist/chunk-TDSI7UHY.cjs.map +0 -1
- package/dist/outbox-CIn7LSyB.d.cts +0 -155
- package/dist/outbox-CIn7LSyB.d.ts +0 -155
- package/dist/sql-outbox.cjs +0 -8
- package/dist/sql-outbox.cjs.map +0 -1
- package/dist/sql-outbox.d.cts +0 -55
- package/dist/sql-outbox.d.ts +0 -55
- package/dist/sql-outbox.js +0 -8
- package/dist/sql-outbox.js.map +0 -1
- package/src/dispatcher.test.ts +0 -324
- package/src/dispatcher.ts +0 -218
- package/src/http-sender.ts +0 -187
- package/src/memory-outbox.test.ts +0 -86
- package/src/memory-outbox.ts +0 -155
- package/src/outbox.ts +0 -175
- package/src/partition.ts +0 -19
- package/src/retention.test.ts +0 -116
- package/src/retention.ts +0 -144
- package/src/sql-outbox.test.ts +0 -490
- package/src/sql-outbox.ts +0 -343
- package/src/sys-webhook-delivery.object.ts +0 -224
package/dist/chunk-TDSI7UHY.cjs
DELETED
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/sys-webhook.object.ts
|
|
2
|
-
var _data = require('@objectstack/spec/data');
|
|
3
|
-
var SysWebhook = _data.ObjectSchema.create({
|
|
4
|
-
name: "sys_webhook",
|
|
5
|
-
label: "Webhook",
|
|
6
|
-
pluralLabel: "Webhooks",
|
|
7
|
-
icon: "webhook",
|
|
8
|
-
isSystem: true,
|
|
9
|
-
managedBy: "config",
|
|
10
|
-
// Authoring a webhook from the UI requires a structured form for the
|
|
11
|
-
// headers / auth / retry / payload blocks — the generic JSON textarea
|
|
12
|
-
// is acceptable as a v1 until a dedicated builder lands. Re-enable
|
|
13
|
-
// create/edit/delete so admins can at least toggle `active` and edit
|
|
14
|
-
// simple URL/method fields without round-tripping through code.
|
|
15
|
-
userActions: { create: true, edit: true, delete: true, import: false },
|
|
16
|
-
description: "Outbound HTTP webhook subscription. Authored via defineWebhook() in code or the Studio editor; executed by the HTTP connector plugin.",
|
|
17
|
-
displayNameField: "name",
|
|
18
|
-
titleFormat: "{label}",
|
|
19
|
-
compactLayout: ["name", "object_name", "url", "active", "updated_at"],
|
|
20
|
-
listViews: {
|
|
21
|
-
active: {
|
|
22
|
-
type: "grid",
|
|
23
|
-
name: "active",
|
|
24
|
-
label: "Active",
|
|
25
|
-
data: { provider: "object", object: "sys_webhook" },
|
|
26
|
-
columns: ["label", "object_name", "url", "method", "active", "updated_at"],
|
|
27
|
-
filter: [{ field: "active", operator: "equals", value: true }],
|
|
28
|
-
sort: [{ field: "label", order: "asc" }],
|
|
29
|
-
pagination: { pageSize: 50 }
|
|
30
|
-
},
|
|
31
|
-
inactive: {
|
|
32
|
-
type: "grid",
|
|
33
|
-
name: "inactive",
|
|
34
|
-
label: "Inactive",
|
|
35
|
-
data: { provider: "object", object: "sys_webhook" },
|
|
36
|
-
columns: ["label", "object_name", "url", "method", "active", "updated_at"],
|
|
37
|
-
filter: [{ field: "active", operator: "equals", value: false }],
|
|
38
|
-
sort: [{ field: "label", order: "asc" }],
|
|
39
|
-
pagination: { pageSize: 50 }
|
|
40
|
-
},
|
|
41
|
-
by_object: {
|
|
42
|
-
type: "grid",
|
|
43
|
-
name: "by_object",
|
|
44
|
-
label: "By Object",
|
|
45
|
-
data: { provider: "object", object: "sys_webhook" },
|
|
46
|
-
columns: ["object_name", "label", "url", "active", "updated_at"],
|
|
47
|
-
sort: [{ field: "object_name", order: "asc" }, { field: "label", order: "asc" }],
|
|
48
|
-
grouping: { fields: [{ field: "object_name", order: "asc", collapsed: false }] },
|
|
49
|
-
pagination: { pageSize: 100 }
|
|
50
|
-
},
|
|
51
|
-
all_webhooks: {
|
|
52
|
-
type: "grid",
|
|
53
|
-
name: "all_webhooks",
|
|
54
|
-
label: "All",
|
|
55
|
-
data: { provider: "object", object: "sys_webhook" },
|
|
56
|
-
columns: ["label", "object_name", "url", "method", "active", "updated_at"],
|
|
57
|
-
sort: [{ field: "label", order: "asc" }],
|
|
58
|
-
pagination: { pageSize: 50 }
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
fields: {
|
|
62
|
-
id: _data.Field.text({ label: "Webhook ID", required: true, readonly: true, group: "System" }),
|
|
63
|
-
name: _data.Field.text({
|
|
64
|
-
label: "Name",
|
|
65
|
-
required: true,
|
|
66
|
-
maxLength: 100,
|
|
67
|
-
description: "Unique snake_case name \u2014 referenced in logs and audit",
|
|
68
|
-
group: "Definition"
|
|
69
|
-
}),
|
|
70
|
-
label: _data.Field.text({
|
|
71
|
-
label: "Display Label",
|
|
72
|
-
required: false,
|
|
73
|
-
maxLength: 200,
|
|
74
|
-
group: "Definition"
|
|
75
|
-
}),
|
|
76
|
-
object_name: _data.Field.text({
|
|
77
|
-
label: "Object",
|
|
78
|
-
required: false,
|
|
79
|
-
maxLength: 100,
|
|
80
|
-
description: "Short object name whose events fire this webhook (blank = manual / API-triggered)",
|
|
81
|
-
group: "Definition"
|
|
82
|
-
}),
|
|
83
|
-
triggers: _data.Field.text({
|
|
84
|
-
label: "Triggers",
|
|
85
|
-
required: false,
|
|
86
|
-
maxLength: 200,
|
|
87
|
-
description: "Comma-separated event list: create,update,delete,undelete,api",
|
|
88
|
-
group: "Definition"
|
|
89
|
-
}),
|
|
90
|
-
url: _data.Field.text({
|
|
91
|
-
label: "Target URL",
|
|
92
|
-
required: true,
|
|
93
|
-
maxLength: 2048,
|
|
94
|
-
description: "External endpoint that receives the POST",
|
|
95
|
-
group: "Definition"
|
|
96
|
-
}),
|
|
97
|
-
method: _data.Field.text({
|
|
98
|
-
label: "HTTP Method",
|
|
99
|
-
required: true,
|
|
100
|
-
defaultValue: "POST",
|
|
101
|
-
maxLength: 10,
|
|
102
|
-
description: "GET / POST / PUT / PATCH / DELETE",
|
|
103
|
-
group: "Definition"
|
|
104
|
-
}),
|
|
105
|
-
description: _data.Field.textarea({ label: "Description", required: false, group: "Definition" }),
|
|
106
|
-
active: _data.Field.boolean({
|
|
107
|
-
label: "Active",
|
|
108
|
-
required: true,
|
|
109
|
-
defaultValue: true,
|
|
110
|
-
description: "Inactive webhooks are skipped by the dispatcher",
|
|
111
|
-
group: "Definition"
|
|
112
|
-
}),
|
|
113
|
-
definition_json: _data.Field.textarea({
|
|
114
|
-
label: "Definition",
|
|
115
|
-
required: true,
|
|
116
|
-
description: "Serialised Webhook JSON (see @objectstack/spec/automation/webhook) \u2014 full headers/auth/retry/payload config",
|
|
117
|
-
group: "Definition"
|
|
118
|
-
}),
|
|
119
|
-
created_at: _data.Field.datetime({
|
|
120
|
-
label: "Created At",
|
|
121
|
-
required: true,
|
|
122
|
-
defaultValue: "NOW()",
|
|
123
|
-
readonly: true,
|
|
124
|
-
group: "System"
|
|
125
|
-
}),
|
|
126
|
-
updated_at: _data.Field.datetime({ label: "Updated At", required: false, group: "System" })
|
|
127
|
-
},
|
|
128
|
-
indexes: [
|
|
129
|
-
{ fields: ["name"], unique: true },
|
|
130
|
-
{ fields: ["object_name"] },
|
|
131
|
-
{ fields: ["active", "object_name"] }
|
|
132
|
-
]
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
// src/sys-webhook-delivery.object.ts
|
|
136
|
-
|
|
137
|
-
var SysWebhookDelivery = _data.ObjectSchema.create({
|
|
138
|
-
name: "sys_webhook_delivery",
|
|
139
|
-
label: "Webhook Delivery",
|
|
140
|
-
pluralLabel: "Webhook Deliveries",
|
|
141
|
-
icon: "package",
|
|
142
|
-
isSystem: true,
|
|
143
|
-
managedBy: "config",
|
|
144
|
-
userActions: { create: false, edit: false, delete: false, import: false },
|
|
145
|
-
description: "Durable outbox row for one webhook attempt. Managed by @objectstack/plugin-webhooks; do not write directly.",
|
|
146
|
-
displayNameField: "id",
|
|
147
|
-
titleFormat: "{event_type} \u2192 {url}",
|
|
148
|
-
compactLayout: ["event_type", "url", "status", "attempts", "next_retry_at"],
|
|
149
|
-
actions: [
|
|
150
|
-
{
|
|
151
|
-
name: "redeliver",
|
|
152
|
-
label: "Redeliver",
|
|
153
|
-
icon: "refresh-cw",
|
|
154
|
-
variant: "secondary",
|
|
155
|
-
locations: ["list_item", "record_header"],
|
|
156
|
-
type: "api",
|
|
157
|
-
target: "/api/v1/webhooks/redeliver",
|
|
158
|
-
method: "POST",
|
|
159
|
-
recordIdParam: "deliveryId",
|
|
160
|
-
confirmText: "Replay this delivery? The receiver will get the original payload again \u2014 they must be idempotent on the X-Objectstack-Delivery header.",
|
|
161
|
-
successMessage: "Queued for redelivery",
|
|
162
|
-
refreshAfter: true,
|
|
163
|
-
// Only terminal rows are safe to replay. Pending / in_flight rows
|
|
164
|
-
// are either already queued or actively being sent — replaying
|
|
165
|
-
// would double-deliver.
|
|
166
|
-
disabled: "!(status in ['success', 'failed', 'dead'])"
|
|
167
|
-
}
|
|
168
|
-
],
|
|
169
|
-
listViews: {
|
|
170
|
-
recent: {
|
|
171
|
-
type: "grid",
|
|
172
|
-
name: "recent",
|
|
173
|
-
label: "Recent",
|
|
174
|
-
data: { provider: "object", object: "sys_webhook_delivery" },
|
|
175
|
-
columns: ["event_type", "url", "status", "attempts", "response_code", "updated_at"],
|
|
176
|
-
sort: [{ field: "updated_at", order: "desc" }],
|
|
177
|
-
pagination: { pageSize: 50 }
|
|
178
|
-
},
|
|
179
|
-
failures: {
|
|
180
|
-
type: "grid",
|
|
181
|
-
name: "failures",
|
|
182
|
-
label: "Failures",
|
|
183
|
-
data: { provider: "object", object: "sys_webhook_delivery" },
|
|
184
|
-
columns: ["event_type", "url", "status", "attempts", "response_code", "error", "updated_at"],
|
|
185
|
-
filter: [{ field: "status", operator: "in", value: ["failed", "dead"] }],
|
|
186
|
-
sort: [{ field: "updated_at", order: "desc" }],
|
|
187
|
-
pagination: { pageSize: 50 }
|
|
188
|
-
},
|
|
189
|
-
in_flight: {
|
|
190
|
-
type: "grid",
|
|
191
|
-
name: "in_flight",
|
|
192
|
-
label: "In Flight",
|
|
193
|
-
data: { provider: "object", object: "sys_webhook_delivery" },
|
|
194
|
-
columns: ["event_type", "url", "attempts", "claimed_by", "claimed_at"],
|
|
195
|
-
filter: [{ field: "status", operator: "equals", value: "in_flight" }],
|
|
196
|
-
sort: [{ field: "claimed_at", order: "desc" }],
|
|
197
|
-
pagination: { pageSize: 50 }
|
|
198
|
-
},
|
|
199
|
-
pending: {
|
|
200
|
-
type: "grid",
|
|
201
|
-
name: "pending",
|
|
202
|
-
label: "Pending",
|
|
203
|
-
data: { provider: "object", object: "sys_webhook_delivery" },
|
|
204
|
-
columns: ["event_type", "url", "attempts", "next_retry_at", "updated_at"],
|
|
205
|
-
filter: [{ field: "status", operator: "equals", value: "pending" }],
|
|
206
|
-
sort: [{ field: "next_retry_at", order: "asc" }],
|
|
207
|
-
pagination: { pageSize: 50 }
|
|
208
|
-
},
|
|
209
|
-
by_status: {
|
|
210
|
-
type: "grid",
|
|
211
|
-
name: "by_status",
|
|
212
|
-
label: "By Status",
|
|
213
|
-
data: { provider: "object", object: "sys_webhook_delivery" },
|
|
214
|
-
columns: ["status", "event_type", "url", "attempts", "updated_at"],
|
|
215
|
-
sort: [{ field: "status", order: "asc" }, { field: "updated_at", order: "desc" }],
|
|
216
|
-
grouping: { fields: [{ field: "status", order: "asc", collapsed: false }] },
|
|
217
|
-
pagination: { pageSize: 100 }
|
|
218
|
-
},
|
|
219
|
-
by_webhook: {
|
|
220
|
-
type: "grid",
|
|
221
|
-
name: "by_webhook",
|
|
222
|
-
label: "By Webhook",
|
|
223
|
-
data: { provider: "object", object: "sys_webhook_delivery" },
|
|
224
|
-
columns: ["webhook_id", "event_type", "status", "attempts", "updated_at"],
|
|
225
|
-
sort: [{ field: "webhook_id", order: "asc" }, { field: "updated_at", order: "desc" }],
|
|
226
|
-
grouping: { fields: [{ field: "webhook_id", order: "asc", collapsed: true }] },
|
|
227
|
-
pagination: { pageSize: 100 }
|
|
228
|
-
},
|
|
229
|
-
all_deliveries: {
|
|
230
|
-
type: "grid",
|
|
231
|
-
name: "all_deliveries",
|
|
232
|
-
label: "All",
|
|
233
|
-
data: { provider: "object", object: "sys_webhook_delivery" },
|
|
234
|
-
columns: ["event_type", "url", "status", "attempts", "response_code", "updated_at"],
|
|
235
|
-
sort: [{ field: "updated_at", order: "desc" }],
|
|
236
|
-
pagination: { pageSize: 100 }
|
|
237
|
-
}
|
|
238
|
-
},
|
|
239
|
-
fields: {
|
|
240
|
-
id: _data.Field.text({
|
|
241
|
-
label: "Delivery ID",
|
|
242
|
-
required: true,
|
|
243
|
-
maxLength: 64,
|
|
244
|
-
description: "UUID \u2014 also doubles as the receiver-side idempotency key"
|
|
245
|
-
}),
|
|
246
|
-
webhook_id: _data.Field.text({
|
|
247
|
-
label: "Webhook ID",
|
|
248
|
-
required: true,
|
|
249
|
-
maxLength: 64,
|
|
250
|
-
description: "FK to sys_webhook.id (loosely coupled \u2014 denormalised URL/secret on row)"
|
|
251
|
-
}),
|
|
252
|
-
event_id: _data.Field.text({
|
|
253
|
-
label: "Event ID",
|
|
254
|
-
required: true,
|
|
255
|
-
maxLength: 128,
|
|
256
|
-
description: "Source event id; UNIQUE(event_id, webhook_id) for dedup"
|
|
257
|
-
}),
|
|
258
|
-
event_type: _data.Field.text({
|
|
259
|
-
label: "Event Type",
|
|
260
|
-
required: true,
|
|
261
|
-
maxLength: 128,
|
|
262
|
-
description: "e.g. data.record.created"
|
|
263
|
-
}),
|
|
264
|
-
url: _data.Field.text({
|
|
265
|
-
label: "Target URL",
|
|
266
|
-
required: true,
|
|
267
|
-
maxLength: 2048,
|
|
268
|
-
description: "Snapshotted at enqueue so config edits do not rewrite live rows"
|
|
269
|
-
}),
|
|
270
|
-
method: _data.Field.text({ label: "Method", required: false, maxLength: 10 }),
|
|
271
|
-
headers_json: _data.Field.textarea({ label: "Headers JSON", required: false }),
|
|
272
|
-
secret: _data.Field.text({ label: "HMAC Secret", required: false, maxLength: 256 }),
|
|
273
|
-
timeout_ms: _data.Field.number({ label: "Timeout (ms)", required: false }),
|
|
274
|
-
payload_json: _data.Field.textarea({ label: "Payload JSON", required: true }),
|
|
275
|
-
partition_key: _data.Field.number({
|
|
276
|
-
label: "Partition",
|
|
277
|
-
required: true,
|
|
278
|
-
description: "hash(webhook_id) mod partitionCount \u2014 precomputed for cheap WHERE"
|
|
279
|
-
}),
|
|
280
|
-
status: _data.Field.text({
|
|
281
|
-
label: "Status",
|
|
282
|
-
required: true,
|
|
283
|
-
defaultValue: "pending",
|
|
284
|
-
maxLength: 16,
|
|
285
|
-
description: "pending | in_flight | success | failed | dead"
|
|
286
|
-
}),
|
|
287
|
-
attempts: _data.Field.number({
|
|
288
|
-
label: "Attempts",
|
|
289
|
-
required: true,
|
|
290
|
-
defaultValue: 0,
|
|
291
|
-
description: "Number of POST attempts made so far"
|
|
292
|
-
}),
|
|
293
|
-
claimed_by: _data.Field.text({ label: "Claimed By", required: false, maxLength: 128 }),
|
|
294
|
-
claimed_at: _data.Field.number({ label: "Claimed At (ms)", required: false }),
|
|
295
|
-
next_retry_at: _data.Field.number({ label: "Next Retry At (ms)", required: false }),
|
|
296
|
-
last_attempted_at: _data.Field.number({ label: "Last Attempted At (ms)", required: false }),
|
|
297
|
-
response_code: _data.Field.number({ label: "HTTP Status", required: false }),
|
|
298
|
-
response_body: _data.Field.textarea({ label: "Response Body (capped)", required: false }),
|
|
299
|
-
error: _data.Field.textarea({ label: "Error", required: false }),
|
|
300
|
-
created_at: _data.Field.number({ label: "Created At (ms)", required: true }),
|
|
301
|
-
updated_at: _data.Field.number({ label: "Updated At (ms)", required: true })
|
|
302
|
-
},
|
|
303
|
-
indexes: [
|
|
304
|
-
{ fields: ["event_id", "webhook_id"], unique: true },
|
|
305
|
-
// Hot path: claim query
|
|
306
|
-
{ fields: ["status", "partition_key", "next_retry_at"] },
|
|
307
|
-
// Reaper: scan stale in_flight rows by claimed_at
|
|
308
|
-
{ fields: ["status", "claimed_at"] },
|
|
309
|
-
{ fields: ["webhook_id"] }
|
|
310
|
-
]
|
|
311
|
-
});
|
|
312
|
-
var SYS_WEBHOOK_DELIVERY = "sys_webhook_delivery";
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
exports.SysWebhook = SysWebhook; exports.SysWebhookDelivery = SysWebhookDelivery; exports.SYS_WEBHOOK_DELIVERY = SYS_WEBHOOK_DELIVERY;
|
|
319
|
-
//# sourceMappingURL=chunk-TDSI7UHY.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/framework/framework/packages/plugins/plugin-webhooks/dist/chunk-TDSI7UHY.cjs","../src/sys-webhook.object.ts","../src/sys-webhook-delivery.object.ts"],"names":["ObjectSchema","Field"],"mappings":"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","file":"/home/runner/work/framework/framework/packages/plugins/plugin-webhooks/dist/chunk-TDSI7UHY.cjs","sourcesContent":[null,"// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_webhook — Outbound HTTP integration configuration (runtime).\n *\n * Persists a single {@link Webhook} envelope per row so administrators\n * can author, enable/disable, and edit webhook subscriptions from the\n * Studio UI without code changes. The canonical Zod schema for the\n * `definition_json` envelope lives at `@objectstack/spec/automation/webhook`.\n *\n * One row per `name`. The automation runtime\n * (`@objectstack/service-automation`, built-in `http_request` node) loads\n * active rows on boot + on `sys_webhook:changed` events, registers\n * `afterInsert` / `afterUpdate` / `afterDelete` listeners for the\n * targeted object, and dispatches outbound HTTP calls when matching\n * record events fire.\n *\n * Ownership (ADR-0029 K2.a): this object is **owned by\n * `@objectstack/plugin-webhooks`** — the plugin that consumes these rows —\n * alongside its sibling `sys_webhook_delivery`. It used to live in the\n * `@objectstack/platform-objects` monolith and be imported here; the\n * definition now lives with its owner so the plugin ships both data and\n * behavior as one unit.\n *\n * Platform-wide on purpose: every project (standalone, single-tenant,\n * cloud) can integrate with external systems (Slack, Stripe, internal\n * services) the same way.\n *\n * @namespace sys\n */\nexport const SysWebhook = ObjectSchema.create({\n name: 'sys_webhook',\n label: 'Webhook',\n pluralLabel: 'Webhooks',\n icon: 'webhook',\n isSystem: true,\n managedBy: 'config',\n // Authoring a webhook from the UI requires a structured form for the\n // headers / auth / retry / payload blocks — the generic JSON textarea\n // is acceptable as a v1 until a dedicated builder lands. Re-enable\n // create/edit/delete so admins can at least toggle `active` and edit\n // simple URL/method fields without round-tripping through code.\n userActions: { create: true, edit: true, delete: true, import: false },\n description: 'Outbound HTTP webhook subscription. Authored via defineWebhook() in code or the Studio editor; executed by the HTTP connector plugin.',\n displayNameField: 'name',\n titleFormat: '{label}',\n compactLayout: ['name', 'object_name', 'url', 'active', 'updated_at'],\n\n listViews: {\n active: {\n type: 'grid',\n name: 'active',\n label: 'Active',\n data: { provider: 'object', object: 'sys_webhook' },\n columns: ['label', 'object_name', 'url', 'method', 'active', 'updated_at'],\n filter: [{ field: 'active', operator: 'equals', value: true }],\n sort: [{ field: 'label', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n inactive: {\n type: 'grid',\n name: 'inactive',\n label: 'Inactive',\n data: { provider: 'object', object: 'sys_webhook' },\n columns: ['label', 'object_name', 'url', 'method', 'active', 'updated_at'],\n filter: [{ field: 'active', operator: 'equals', value: false }],\n sort: [{ field: 'label', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n by_object: {\n type: 'grid',\n name: 'by_object',\n label: 'By Object',\n data: { provider: 'object', object: 'sys_webhook' },\n columns: ['object_name', 'label', 'url', 'active', 'updated_at'],\n sort: [{ field: 'object_name', order: 'asc' }, { field: 'label', order: 'asc' }],\n grouping: { fields: [{ field: 'object_name', order: 'asc', collapsed: false }] },\n pagination: { pageSize: 100 },\n },\n all_webhooks: {\n type: 'grid',\n name: 'all_webhooks',\n label: 'All',\n data: { provider: 'object', object: 'sys_webhook' },\n columns: ['label', 'object_name', 'url', 'method', 'active', 'updated_at'],\n sort: [{ field: 'label', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n },\n\n fields: {\n id: Field.text({ label: 'Webhook ID', required: true, readonly: true, group: 'System' }),\n\n name: Field.text({\n label: 'Name',\n required: true,\n maxLength: 100,\n description: 'Unique snake_case name — referenced in logs and audit',\n group: 'Definition',\n }),\n\n label: Field.text({\n label: 'Display Label',\n required: false,\n maxLength: 200,\n group: 'Definition',\n }),\n\n object_name: Field.text({\n label: 'Object',\n required: false,\n maxLength: 100,\n description: 'Short object name whose events fire this webhook (blank = manual / API-triggered)',\n group: 'Definition',\n }),\n\n triggers: Field.text({\n label: 'Triggers',\n required: false,\n maxLength: 200,\n description: 'Comma-separated event list: create,update,delete,undelete,api',\n group: 'Definition',\n }),\n\n url: Field.text({\n label: 'Target URL',\n required: true,\n maxLength: 2048,\n description: 'External endpoint that receives the POST',\n group: 'Definition',\n }),\n\n method: Field.text({\n label: 'HTTP Method',\n required: true,\n defaultValue: 'POST',\n maxLength: 10,\n description: 'GET / POST / PUT / PATCH / DELETE',\n group: 'Definition',\n }),\n\n description: Field.textarea({ label: 'Description', required: false, group: 'Definition' }),\n\n active: Field.boolean({\n label: 'Active',\n required: true,\n defaultValue: true,\n description: 'Inactive webhooks are skipped by the dispatcher',\n group: 'Definition',\n }),\n\n definition_json: Field.textarea({\n label: 'Definition',\n required: true,\n description: 'Serialised Webhook JSON (see @objectstack/spec/automation/webhook) — full headers/auth/retry/payload config',\n group: 'Definition',\n }),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'System',\n }),\n\n updated_at: Field.datetime({ label: 'Updated At', required: false, group: 'System' }),\n },\n\n indexes: [\n { fields: ['name'], unique: true },\n { fields: ['object_name'] },\n { fields: ['active', 'object_name'] },\n ],\n});\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { Field, ObjectSchema } from '@objectstack/spec/data';\n\n/**\n * sys_webhook_delivery — Durable outbox row for one HTTP attempt.\n *\n * Schema is owned by `@objectstack/plugin-webhooks`. Add it to your stack\n * via:\n *\n * import { SysWebhookDelivery } from '@objectstack/plugin-webhooks/schema';\n * defineStack({ objects: [SysWebhookDelivery, ...], plugins: [...] });\n *\n * Designed for the SqlWebhookOutbox claim algorithm:\n *\n * 1. Producers INSERT pending rows (dedup'd by (event_id, webhook_id)).\n * 2. The dispatcher's per-partition lock-holder runs:\n * SELECT id WHERE status='pending' AND partition_key=? AND (next_retry_at <= now OR null)\n * UPDATE SET status='in_flight' WHERE id IN (...) AND status='pending' ← atomic claim\n * POST to target URL\n * UPDATE SET status=success/pending/dead, attempts=attempts+1, ...\n *\n * `partition_key` is precomputed on enqueue (hash(webhook_id) mod N) so the\n * dispatcher can filter cheaply without DB-side hash functions.\n *\n * Indexes are tuned for the hot path: `(status, partition_key, next_retry_at)`\n * is the claim query; `(event_id, webhook_id)` is the dedup uniqueness.\n *\n * @namespace sys\n */\nexport const SysWebhookDelivery = ObjectSchema.create({\n name: 'sys_webhook_delivery',\n label: 'Webhook Delivery',\n pluralLabel: 'Webhook Deliveries',\n icon: 'package',\n isSystem: true,\n managedBy: 'config',\n userActions: { create: false, edit: false, delete: false, import: false },\n description:\n 'Durable outbox row for one webhook attempt. Managed by @objectstack/plugin-webhooks; do not write directly.',\n displayNameField: 'id',\n titleFormat: '{event_type} → {url}',\n compactLayout: ['event_type', 'url', 'status', 'attempts', 'next_retry_at'],\n\n actions: [\n {\n name: 'redeliver',\n label: 'Redeliver',\n icon: 'refresh-cw',\n variant: 'secondary',\n locations: ['list_item', 'record_header'],\n type: 'api',\n target: '/api/v1/webhooks/redeliver',\n method: 'POST',\n recordIdParam: 'deliveryId',\n confirmText:\n 'Replay this delivery? The receiver will get the original payload again — they must be idempotent on the X-Objectstack-Delivery header.',\n successMessage: 'Queued for redelivery',\n refreshAfter: true,\n // Only terminal rows are safe to replay. Pending / in_flight rows\n // are either already queued or actively being sent — replaying\n // would double-deliver.\n disabled: \"!(status in ['success', 'failed', 'dead'])\",\n },\n ],\n\n listViews: {\n recent: {\n type: 'grid',\n name: 'recent',\n label: 'Recent',\n data: { provider: 'object', object: 'sys_webhook_delivery' },\n columns: ['event_type', 'url', 'status', 'attempts', 'response_code', 'updated_at'],\n sort: [{ field: 'updated_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n failures: {\n type: 'grid',\n name: 'failures',\n label: 'Failures',\n data: { provider: 'object', object: 'sys_webhook_delivery' },\n columns: ['event_type', 'url', 'status', 'attempts', 'response_code', 'error', 'updated_at'],\n filter: [{ field: 'status', operator: 'in', value: ['failed', 'dead'] }],\n sort: [{ field: 'updated_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n in_flight: {\n type: 'grid',\n name: 'in_flight',\n label: 'In Flight',\n data: { provider: 'object', object: 'sys_webhook_delivery' },\n columns: ['event_type', 'url', 'attempts', 'claimed_by', 'claimed_at'],\n filter: [{ field: 'status', operator: 'equals', value: 'in_flight' }],\n sort: [{ field: 'claimed_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n pending: {\n type: 'grid',\n name: 'pending',\n label: 'Pending',\n data: { provider: 'object', object: 'sys_webhook_delivery' },\n columns: ['event_type', 'url', 'attempts', 'next_retry_at', 'updated_at'],\n filter: [{ field: 'status', operator: 'equals', value: 'pending' }],\n sort: [{ field: 'next_retry_at', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n by_status: {\n type: 'grid',\n name: 'by_status',\n label: 'By Status',\n data: { provider: 'object', object: 'sys_webhook_delivery' },\n columns: ['status', 'event_type', 'url', 'attempts', 'updated_at'],\n sort: [{ field: 'status', order: 'asc' }, { field: 'updated_at', order: 'desc' }],\n grouping: { fields: [{ field: 'status', order: 'asc', collapsed: false }] },\n pagination: { pageSize: 100 },\n },\n by_webhook: {\n type: 'grid',\n name: 'by_webhook',\n label: 'By Webhook',\n data: { provider: 'object', object: 'sys_webhook_delivery' },\n columns: ['webhook_id', 'event_type', 'status', 'attempts', 'updated_at'],\n sort: [{ field: 'webhook_id', order: 'asc' }, { field: 'updated_at', order: 'desc' }],\n grouping: { fields: [{ field: 'webhook_id', order: 'asc', collapsed: true }] },\n pagination: { pageSize: 100 },\n },\n all_deliveries: {\n type: 'grid',\n name: 'all_deliveries',\n label: 'All',\n data: { provider: 'object', object: 'sys_webhook_delivery' },\n columns: ['event_type', 'url', 'status', 'attempts', 'response_code', 'updated_at'],\n sort: [{ field: 'updated_at', order: 'desc' }],\n pagination: { pageSize: 100 },\n },\n },\n\n fields: {\n id: Field.text({\n label: 'Delivery ID',\n required: true,\n maxLength: 64,\n description: 'UUID — also doubles as the receiver-side idempotency key',\n }),\n\n webhook_id: Field.text({\n label: 'Webhook ID',\n required: true,\n maxLength: 64,\n description: 'FK to sys_webhook.id (loosely coupled — denormalised URL/secret on row)',\n }),\n\n event_id: Field.text({\n label: 'Event ID',\n required: true,\n maxLength: 128,\n description: 'Source event id; UNIQUE(event_id, webhook_id) for dedup',\n }),\n\n event_type: Field.text({\n label: 'Event Type',\n required: true,\n maxLength: 128,\n description: 'e.g. data.record.created',\n }),\n\n url: Field.text({\n label: 'Target URL',\n required: true,\n maxLength: 2048,\n description: 'Snapshotted at enqueue so config edits do not rewrite live rows',\n }),\n\n method: Field.text({ label: 'Method', required: false, maxLength: 10 }),\n headers_json: Field.textarea({ label: 'Headers JSON', required: false }),\n secret: Field.text({ label: 'HMAC Secret', required: false, maxLength: 256 }),\n timeout_ms: Field.number({ label: 'Timeout (ms)', required: false }),\n payload_json: Field.textarea({ label: 'Payload JSON', required: true }),\n\n partition_key: Field.number({\n label: 'Partition',\n required: true,\n description: 'hash(webhook_id) mod partitionCount — precomputed for cheap WHERE',\n }),\n\n status: Field.text({\n label: 'Status',\n required: true,\n defaultValue: 'pending',\n maxLength: 16,\n description: 'pending | in_flight | success | failed | dead',\n }),\n\n attempts: Field.number({\n label: 'Attempts',\n required: true,\n defaultValue: 0,\n description: 'Number of POST attempts made so far',\n }),\n\n claimed_by: Field.text({ label: 'Claimed By', required: false, maxLength: 128 }),\n claimed_at: Field.number({ label: 'Claimed At (ms)', required: false }),\n next_retry_at: Field.number({ label: 'Next Retry At (ms)', required: false }),\n last_attempted_at: Field.number({ label: 'Last Attempted At (ms)', required: false }),\n response_code: Field.number({ label: 'HTTP Status', required: false }),\n response_body: Field.textarea({ label: 'Response Body (capped)', required: false }),\n error: Field.textarea({ label: 'Error', required: false }),\n\n created_at: Field.number({ label: 'Created At (ms)', required: true }),\n updated_at: Field.number({ label: 'Updated At (ms)', required: true }),\n },\n\n indexes: [\n { fields: ['event_id', 'webhook_id'], unique: true },\n // Hot path: claim query\n { fields: ['status', 'partition_key', 'next_retry_at'] },\n // Reaper: scan stale in_flight rows by claimed_at\n { fields: ['status', 'claimed_at'] },\n { fields: ['webhook_id'] },\n ],\n});\n\n/** Canonical object name — exported so SqlWebhookOutbox callers can override if needed. */\nexport const SYS_WEBHOOK_DELIVERY = 'sys_webhook_delivery' as const;\n"]}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Webhook outbox contracts.
|
|
3
|
-
*
|
|
4
|
-
* The outbox stores webhook delivery rows that must be POSTed exactly once
|
|
5
|
-
* (modulo at-least-once + receiver-side idempotency). Implementations are
|
|
6
|
-
* pluggable so the same dispatcher can run against an in-memory test store
|
|
7
|
-
* or a SQL-backed production table.
|
|
8
|
-
*
|
|
9
|
-
* See `content/docs/concepts/webhook-delivery.mdx` §3.2 for the full schema.
|
|
10
|
-
*/
|
|
11
|
-
type DeliveryStatus = 'pending' | 'in_flight' | 'success' | 'failed' | 'dead';
|
|
12
|
-
interface WebhookDelivery {
|
|
13
|
-
/** UUID — also doubles as the receiver-side idempotency key. */
|
|
14
|
-
id: string;
|
|
15
|
-
/** FK to sys_webhook.id — opaque to the dispatcher; only used for hashing. */
|
|
16
|
-
webhookId: string;
|
|
17
|
-
/** Origin event id. UNIQUE(event_id, webhook_id) prevents double-enqueue. */
|
|
18
|
-
eventId: string;
|
|
19
|
-
/** Origin event type, e.g. `data.record.created`. */
|
|
20
|
-
eventType: string;
|
|
21
|
-
/** Destination URL (snapshotted on enqueue — config edits don't rewrite live rows). */
|
|
22
|
-
url: string;
|
|
23
|
-
/** HTTP method — defaults to POST. */
|
|
24
|
-
method?: string;
|
|
25
|
-
/** Custom headers configured on the sink. */
|
|
26
|
-
headers?: Record<string, string>;
|
|
27
|
-
/** HMAC-SHA256 secret. If present, signature is added. */
|
|
28
|
-
secret?: string;
|
|
29
|
-
/** Per-request timeout in ms. */
|
|
30
|
-
timeoutMs?: number;
|
|
31
|
-
/** JSON-serialisable body. */
|
|
32
|
-
payload: unknown;
|
|
33
|
-
/** Lifecycle state. */
|
|
34
|
-
status: DeliveryStatus;
|
|
35
|
-
/** Number of POST attempts made so far (0 before first attempt). */
|
|
36
|
-
attempts: number;
|
|
37
|
-
/** Node id currently working on this row, when `status = in_flight`. */
|
|
38
|
-
claimedBy?: string;
|
|
39
|
-
/** Wall-clock ms when the row was claimed. */
|
|
40
|
-
claimedAt?: number;
|
|
41
|
-
/** Earliest ms at which this row becomes eligible for the next attempt. */
|
|
42
|
-
nextRetryAt?: number;
|
|
43
|
-
/** Wall-clock ms of the last attempt (success or fail). */
|
|
44
|
-
lastAttemptedAt?: number;
|
|
45
|
-
/** HTTP status code from the most recent attempt. */
|
|
46
|
-
responseCode?: number;
|
|
47
|
-
/** Truncated response body for diagnostics. */
|
|
48
|
-
responseBody?: string;
|
|
49
|
-
/** Last transport / timeout error message. */
|
|
50
|
-
error?: string;
|
|
51
|
-
createdAt: number;
|
|
52
|
-
updatedAt: number;
|
|
53
|
-
}
|
|
54
|
-
interface EnqueueInput {
|
|
55
|
-
webhookId: string;
|
|
56
|
-
eventId: string;
|
|
57
|
-
eventType: string;
|
|
58
|
-
url: string;
|
|
59
|
-
method?: string;
|
|
60
|
-
headers?: Record<string, string>;
|
|
61
|
-
secret?: string;
|
|
62
|
-
timeoutMs?: number;
|
|
63
|
-
payload: unknown;
|
|
64
|
-
}
|
|
65
|
-
interface ClaimOptions {
|
|
66
|
-
/** Identifier of the node doing the claim (for `claimedBy`). */
|
|
67
|
-
nodeId: string;
|
|
68
|
-
/** Max rows to claim per call. */
|
|
69
|
-
limit: number;
|
|
70
|
-
/**
|
|
71
|
-
* Partition assignment for this worker. Only rows whose
|
|
72
|
-
* `hash(webhookId) mod count === index` are claimed. Omit to claim
|
|
73
|
-
* across all partitions (single-node mode).
|
|
74
|
-
*/
|
|
75
|
-
partition?: {
|
|
76
|
-
index: number;
|
|
77
|
-
count: number;
|
|
78
|
-
};
|
|
79
|
-
/** Visibility timeout — claimed rows revert to pending after this many ms. */
|
|
80
|
-
claimTtlMs: number;
|
|
81
|
-
/** "Now" reference, ms since epoch. Defaults to Date.now(). */
|
|
82
|
-
now?: number;
|
|
83
|
-
}
|
|
84
|
-
interface AckSuccess {
|
|
85
|
-
success: true;
|
|
86
|
-
httpStatus: number;
|
|
87
|
-
responseBody?: string;
|
|
88
|
-
durationMs: number;
|
|
89
|
-
}
|
|
90
|
-
interface AckFailure {
|
|
91
|
-
success: false;
|
|
92
|
-
httpStatus?: number;
|
|
93
|
-
responseBody?: string;
|
|
94
|
-
error?: string;
|
|
95
|
-
durationMs: number;
|
|
96
|
-
/** Computed by the dispatcher per the retry schedule, or undefined for dead. */
|
|
97
|
-
nextRetryAt?: number;
|
|
98
|
-
/** Marks the row terminal — no more attempts. */
|
|
99
|
-
dead?: boolean;
|
|
100
|
-
}
|
|
101
|
-
type AckResult = AckSuccess | AckFailure;
|
|
102
|
-
/**
|
|
103
|
-
* Error raised by `IWebhookOutbox.redeliver` when the requested row is
|
|
104
|
-
* either missing or in a non-terminal state. The dispatcher / admin UI
|
|
105
|
-
* surfaces this verbatim to the caller — never throw it for transient
|
|
106
|
-
* conditions (transport errors should bubble as native `Error`).
|
|
107
|
-
*/
|
|
108
|
-
declare class RedeliverError extends Error {
|
|
109
|
-
readonly code: 'not_found' | 'not_eligible';
|
|
110
|
-
constructor(message: string, code: 'not_found' | 'not_eligible');
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Pluggable storage backend for delivery rows. Implementations MUST make
|
|
114
|
-
* `claim()` atomic across concurrent callers — that property is the
|
|
115
|
-
* exactly-once guarantee.
|
|
116
|
-
*/
|
|
117
|
-
interface IWebhookOutbox {
|
|
118
|
-
/**
|
|
119
|
-
* Insert a new delivery row. Implementations MUST treat
|
|
120
|
-
* `(eventId, webhookId)` as unique and silently drop duplicates.
|
|
121
|
-
* Returns the row id (existing or new).
|
|
122
|
-
*/
|
|
123
|
-
enqueue(input: EnqueueInput): Promise<string>;
|
|
124
|
-
/**
|
|
125
|
-
* Atomically claim up to `limit` rows whose `nextRetryAt <= now` (or
|
|
126
|
-
* null) and matching the partition predicate. Claimed rows MUST be
|
|
127
|
-
* marked `in_flight` so concurrent claimers don't see them.
|
|
128
|
-
*/
|
|
129
|
-
claim(opts: ClaimOptions): Promise<WebhookDelivery[]>;
|
|
130
|
-
/** Record the outcome of an attempt. */
|
|
131
|
-
ack(id: string, result: AckResult): Promise<void>;
|
|
132
|
-
/** Snapshot accessor for tests / admin tooling. */
|
|
133
|
-
list(filter?: {
|
|
134
|
-
status?: DeliveryStatus;
|
|
135
|
-
}): Promise<WebhookDelivery[]>;
|
|
136
|
-
/**
|
|
137
|
-
* Reset a terminal row back to `pending` so the dispatcher will pick
|
|
138
|
-
* it up again on its next tick.
|
|
139
|
-
*
|
|
140
|
-
* - Eligible source states: `success`, `failed`, `dead`.
|
|
141
|
-
* - Rejects `pending` / `in_flight` rows — replaying those would
|
|
142
|
-
* double-deliver because they're either already queued or actively
|
|
143
|
-
* being sent.
|
|
144
|
-
* - Resets `attempts=0` so the retry budget restarts.
|
|
145
|
-
* - Clears `claimed_by`, `claimed_at`, `next_retry_at`, `error`,
|
|
146
|
-
* `response_code`, `response_body`. URL / payload / secret are NOT
|
|
147
|
-
* touched — replay reproduces the original POST byte-for-byte.
|
|
148
|
-
*
|
|
149
|
-
* Throws `RedeliverError` with code `not_found` or `not_eligible`.
|
|
150
|
-
* Returns the post-reset row.
|
|
151
|
-
*/
|
|
152
|
-
redeliver(id: string): Promise<WebhookDelivery>;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export { type AckFailure as A, type ClaimOptions as C, type DeliveryStatus as D, type EnqueueInput as E, type IWebhookOutbox as I, RedeliverError as R, type WebhookDelivery as W, type AckResult as a, type AckSuccess as b };
|