@relayfile/adapter-airtable 0.1.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/__tests__/airtable-adapter.test.d.ts +2 -0
- package/dist/__tests__/airtable-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/airtable-adapter.test.js +201 -0
- package/dist/__tests__/airtable-adapter.test.js.map +1 -0
- package/dist/__tests__/webhook-normalizer.test.d.ts +2 -0
- package/dist/__tests__/webhook-normalizer.test.d.ts.map +1 -0
- package/dist/__tests__/webhook-normalizer.test.js +102 -0
- package/dist/__tests__/webhook-normalizer.test.js.map +1 -0
- package/dist/airtable-adapter.d.ts +77 -0
- package/dist/airtable-adapter.d.ts.map +1 -0
- package/dist/airtable-adapter.js +705 -0
- package/dist/airtable-adapter.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/path-mapper.d.ts +21 -0
- package/dist/path-mapper.d.ts.map +1 -0
- package/dist/path-mapper.js +116 -0
- package/dist/path-mapper.js.map +1 -0
- package/dist/queries.d.ts +6 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +43 -0
- package/dist/queries.js.map +1 -0
- package/dist/types.d.ts +107 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/webhook-normalizer.d.ts +50 -0
- package/dist/webhook-normalizer.d.ts.map +1 -0
- package/dist/webhook-normalizer.js +501 -0
- package/dist/webhook-normalizer.js.map +1 -0
- package/dist/writeback.d.ts +5 -0
- package/dist/writeback.d.ts.map +1 -0
- package/dist/writeback.js +139 -0
- package/dist/writeback.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { normalizeAirtableObjectType } from './path-mapper.js';
|
|
3
|
+
export const AIRTABLE_PROVIDER = 'airtable';
|
|
4
|
+
export const AIRTABLE_CONTENT_MAC_HEADER = 'x-airtable-content-mac';
|
|
5
|
+
export const AIRTABLE_TIMESTAMP_HEADER = 'x-airtable-timestamp';
|
|
6
|
+
export const AIRTABLE_DELIVERY_HEADER = 'x-airtable-delivery';
|
|
7
|
+
export const AIRTABLE_EVENT_HEADER = 'x-airtable-event';
|
|
8
|
+
export const AIRTABLE_SIGNATURE_PREFIX = 'hmac-sha256=';
|
|
9
|
+
const CONNECTION_ID_HEADER_KEYS = [
|
|
10
|
+
'x-relay-connection-id',
|
|
11
|
+
'x-connection-id',
|
|
12
|
+
'x-airtable-connection-id',
|
|
13
|
+
'airtable-connection-id',
|
|
14
|
+
];
|
|
15
|
+
const PROVIDER_HEADER_KEYS = [
|
|
16
|
+
'x-relay-provider',
|
|
17
|
+
'x-provider',
|
|
18
|
+
'x-airtable-provider',
|
|
19
|
+
'airtable-provider',
|
|
20
|
+
];
|
|
21
|
+
const PROVIDER_CONFIG_KEY_HEADER_KEYS = [
|
|
22
|
+
'x-relay-provider-config-key',
|
|
23
|
+
'x-provider-config-key',
|
|
24
|
+
'x-airtable-provider-config-key',
|
|
25
|
+
'airtable-provider-config-key',
|
|
26
|
+
];
|
|
27
|
+
const REQUEST_ID_HEADER_KEYS = ['x-request-id', 'x-correlation-id', 'x-relay-request-id'];
|
|
28
|
+
const DEFAULT_WEBHOOK_TOLERANCE_MS = 5 * 60 * 1000;
|
|
29
|
+
export function normalizeAirtableWebhook(rawPayload, headers = {}, options = {}) {
|
|
30
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
31
|
+
if (options.webhookSecret !== undefined) {
|
|
32
|
+
if (!isRawWebhookBody(rawPayload)) {
|
|
33
|
+
throw new Error('Airtable webhook signature validation requires the original raw request body.');
|
|
34
|
+
}
|
|
35
|
+
assertValidAirtableWebhookSignature(rawPayload, normalizedHeaders, options.webhookSecret);
|
|
36
|
+
}
|
|
37
|
+
const timestampResult = validateAirtableWebhookTimestamp(rawPayload, normalizedHeaders, options.toleranceMs ?? DEFAULT_WEBHOOK_TOLERANCE_MS, options.nowMs, options.requireTimestamp ?? false);
|
|
38
|
+
if (!timestampResult.ok) {
|
|
39
|
+
throw new Error(`Invalid Airtable webhook timestamp: ${timestampResult.reason}`);
|
|
40
|
+
}
|
|
41
|
+
const payload = parseAirtableWebhookPayload(rawPayload);
|
|
42
|
+
const objectType = extractAirtableObjectType(payload, normalizedHeaders);
|
|
43
|
+
const objectId = extractAirtableObjectId(payload, objectType);
|
|
44
|
+
const action = extractAirtableAction(payload);
|
|
45
|
+
const eventType = extractAirtableEventType(payload, normalizedHeaders, objectType, action);
|
|
46
|
+
const connection = extractAirtableConnectionMetadata(payload, normalizedHeaders);
|
|
47
|
+
const normalized = {
|
|
48
|
+
provider: connection.provider,
|
|
49
|
+
eventType,
|
|
50
|
+
objectType,
|
|
51
|
+
objectId,
|
|
52
|
+
payload: buildNormalizedPayload(payload, normalizedHeaders, connection, {
|
|
53
|
+
action,
|
|
54
|
+
eventType,
|
|
55
|
+
objectId,
|
|
56
|
+
objectType,
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
if (connection.connectionId) {
|
|
60
|
+
normalized.connectionId = connection.connectionId;
|
|
61
|
+
}
|
|
62
|
+
return normalized;
|
|
63
|
+
}
|
|
64
|
+
export function parseAirtableWebhookPayload(rawPayload) {
|
|
65
|
+
const decoded = decodeWebhookPayload(rawPayload);
|
|
66
|
+
if (!isRecord(decoded)) {
|
|
67
|
+
throw new Error('Airtable webhook payload must be a JSON object.');
|
|
68
|
+
}
|
|
69
|
+
return decoded;
|
|
70
|
+
}
|
|
71
|
+
export function extractAirtableConnectionMetadata(payload, headers = {}) {
|
|
72
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
73
|
+
const record = parseAirtableWebhookPayload(payload);
|
|
74
|
+
const metadata = getRecord(record.metadata);
|
|
75
|
+
const connection = getRecord(record.connection);
|
|
76
|
+
const normalizedConnection = getRecord(record._connection);
|
|
77
|
+
const webhook = getRecord(record._webhook);
|
|
78
|
+
const result = {
|
|
79
|
+
provider: readHeaderValue(normalizedHeaders, PROVIDER_HEADER_KEYS) ??
|
|
80
|
+
readOptionalString(record.provider) ??
|
|
81
|
+
readOptionalString(metadata?.provider) ??
|
|
82
|
+
readOptionalString(normalizedConnection?.provider) ??
|
|
83
|
+
AIRTABLE_PROVIDER,
|
|
84
|
+
};
|
|
85
|
+
const connectionId = readHeaderValue(normalizedHeaders, CONNECTION_ID_HEADER_KEYS) ??
|
|
86
|
+
readOptionalString(record.connectionId) ??
|
|
87
|
+
readOptionalString(record.connection_id) ??
|
|
88
|
+
readOptionalString(metadata?.connectionId) ??
|
|
89
|
+
readOptionalString(metadata?.connection_id) ??
|
|
90
|
+
readOptionalString(normalizedConnection?.connectionId) ??
|
|
91
|
+
readOptionalString(normalizedConnection?.connection_id) ??
|
|
92
|
+
readOptionalString(connection?.id);
|
|
93
|
+
if (connectionId) {
|
|
94
|
+
result.connectionId = connectionId;
|
|
95
|
+
}
|
|
96
|
+
const providerConfigKey = readHeaderValue(normalizedHeaders, PROVIDER_CONFIG_KEY_HEADER_KEYS) ??
|
|
97
|
+
readOptionalString(record.providerConfigKey) ??
|
|
98
|
+
readOptionalString(record.provider_config_key) ??
|
|
99
|
+
readOptionalString(metadata?.providerConfigKey) ??
|
|
100
|
+
readOptionalString(metadata?.provider_config_key) ??
|
|
101
|
+
readOptionalString(normalizedConnection?.providerConfigKey) ??
|
|
102
|
+
readOptionalString(normalizedConnection?.provider_config_key);
|
|
103
|
+
if (providerConfigKey) {
|
|
104
|
+
result.providerConfigKey = providerConfigKey;
|
|
105
|
+
}
|
|
106
|
+
const deliveryId = readOptionalString(normalizedHeaders[AIRTABLE_DELIVERY_HEADER]) ??
|
|
107
|
+
readOptionalString(record.deliveryId) ??
|
|
108
|
+
readOptionalString(record.delivery_id) ??
|
|
109
|
+
readOptionalString(metadata?.deliveryId) ??
|
|
110
|
+
readOptionalString(metadata?.delivery_id) ??
|
|
111
|
+
readOptionalString(webhook?.deliveryId) ??
|
|
112
|
+
readOptionalString(webhook?.delivery_id);
|
|
113
|
+
if (deliveryId) {
|
|
114
|
+
result.deliveryId = deliveryId;
|
|
115
|
+
}
|
|
116
|
+
const signature = readOptionalString(normalizedHeaders[AIRTABLE_CONTENT_MAC_HEADER]) ??
|
|
117
|
+
readOptionalString(record.signature) ??
|
|
118
|
+
readOptionalString(metadata?.signature) ??
|
|
119
|
+
readOptionalString(webhook?.signature);
|
|
120
|
+
if (signature) {
|
|
121
|
+
result.signature = signature;
|
|
122
|
+
}
|
|
123
|
+
const requestId = readHeaderValue(normalizedHeaders, REQUEST_ID_HEADER_KEYS) ??
|
|
124
|
+
readOptionalString(record.requestId) ??
|
|
125
|
+
readOptionalString(record.request_id) ??
|
|
126
|
+
readOptionalString(metadata?.requestId) ??
|
|
127
|
+
readOptionalString(metadata?.request_id) ??
|
|
128
|
+
readOptionalString(normalizedConnection?.requestId) ??
|
|
129
|
+
readOptionalString(normalizedConnection?.request_id);
|
|
130
|
+
if (requestId) {
|
|
131
|
+
result.requestId = requestId;
|
|
132
|
+
}
|
|
133
|
+
const webhookTimestamp = readOptionalTimestamp(normalizedHeaders[AIRTABLE_TIMESTAMP_HEADER]) ??
|
|
134
|
+
readOptionalTimestamp(record.webhookTimestamp) ??
|
|
135
|
+
readOptionalTimestamp(record.webhook_timestamp) ??
|
|
136
|
+
readOptionalTimestamp(record.timestamp) ??
|
|
137
|
+
readOptionalTimestamp(metadata?.webhookTimestamp) ??
|
|
138
|
+
readOptionalTimestamp(metadata?.webhook_timestamp) ??
|
|
139
|
+
readOptionalTimestamp(webhook?.webhookTimestamp) ??
|
|
140
|
+
readOptionalTimestamp(webhook?.webhook_timestamp);
|
|
141
|
+
if (webhookTimestamp !== undefined) {
|
|
142
|
+
result.webhookTimestamp = webhookTimestamp;
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
export function extractAirtableEventType(payload, headers = {}, objectType, action) {
|
|
147
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
148
|
+
const record = parseAirtableWebhookPayload(payload);
|
|
149
|
+
const metadata = getRecord(record.metadata);
|
|
150
|
+
const webhook = getRecord(record._webhook);
|
|
151
|
+
const resolvedObjectType = objectType ?? extractAirtableObjectType(record, normalizedHeaders);
|
|
152
|
+
const resolvedAction = action ?? extractAirtableAction(record);
|
|
153
|
+
const explicitEventType = readOptionalString(record.eventType) ??
|
|
154
|
+
readOptionalString(record.event_type) ??
|
|
155
|
+
readOptionalString(metadata?.eventType) ??
|
|
156
|
+
readOptionalString(metadata?.event_type) ??
|
|
157
|
+
readOptionalString(webhook?.eventType) ??
|
|
158
|
+
readOptionalString(webhook?.event_type);
|
|
159
|
+
if (explicitEventType) {
|
|
160
|
+
const parts = explicitEventType.trim().toLowerCase().split(/[.:]/u).filter(Boolean);
|
|
161
|
+
if (parts.length >= 2) {
|
|
162
|
+
return `${normalizeAirtableObjectType(parts[0] ?? resolvedObjectType)}.${normalizeAction(parts[1] ?? resolvedAction)}`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return `${resolvedObjectType}.${resolvedAction}`;
|
|
166
|
+
}
|
|
167
|
+
export function extractAirtableObjectType(payload, headers = {}) {
|
|
168
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
169
|
+
const record = parseAirtableWebhookPayload(payload);
|
|
170
|
+
const metadata = getRecord(record.metadata);
|
|
171
|
+
const webhook = getRecord(record._webhook);
|
|
172
|
+
const data = getRecord(record.data);
|
|
173
|
+
const rawType = readOptionalString(record.objectType) ??
|
|
174
|
+
readOptionalString(record.object_type) ??
|
|
175
|
+
readOptionalString(record.type) ??
|
|
176
|
+
readOptionalString(normalizedHeaders[AIRTABLE_EVENT_HEADER]) ??
|
|
177
|
+
readOptionalString(data?.objectType) ??
|
|
178
|
+
readOptionalString(data?.object_type) ??
|
|
179
|
+
readOptionalString(data?.type) ??
|
|
180
|
+
readOptionalString(metadata?.objectType) ??
|
|
181
|
+
readOptionalString(metadata?.object_type) ??
|
|
182
|
+
readOptionalString(webhook?.objectType) ??
|
|
183
|
+
readOptionalString(webhook?.object_type);
|
|
184
|
+
if (rawType) {
|
|
185
|
+
return normalizeAirtableObjectType(rawType);
|
|
186
|
+
}
|
|
187
|
+
if (isRecord(record.record) || isRecord(data?.record) || looksLikeAirtableRecord(data)) {
|
|
188
|
+
return 'record';
|
|
189
|
+
}
|
|
190
|
+
if (isRecord(record.table) || isRecord(data?.table) || Array.isArray(record.fields) || Array.isArray(data?.fields)) {
|
|
191
|
+
return 'table';
|
|
192
|
+
}
|
|
193
|
+
if (isRecord(record.base) || isRecord(data?.base) || Array.isArray(record.tables) || Array.isArray(data?.tables)) {
|
|
194
|
+
return 'base';
|
|
195
|
+
}
|
|
196
|
+
throw new Error('Airtable webhook payload is missing object type metadata.');
|
|
197
|
+
}
|
|
198
|
+
export function extractAirtableObjectId(payload, objectType) {
|
|
199
|
+
const record = parseAirtableWebhookPayload(payload);
|
|
200
|
+
const data = getRecord(record.data);
|
|
201
|
+
const metadata = getRecord(record.metadata);
|
|
202
|
+
const webhook = getRecord(record._webhook);
|
|
203
|
+
const normalizedType = objectType ? normalizeAirtableObjectType(objectType) : extractAirtableObjectType(record);
|
|
204
|
+
const objectByType = normalizedType === 'record'
|
|
205
|
+
? getRecord(record.record) ?? getRecord(data?.record)
|
|
206
|
+
: normalizedType === 'table'
|
|
207
|
+
? getRecord(record.table) ?? getRecord(data?.table)
|
|
208
|
+
: getRecord(record.base) ?? getRecord(data?.base);
|
|
209
|
+
const objectId = readOptionalString(objectByType?.id) ??
|
|
210
|
+
readOptionalString(data?.id) ??
|
|
211
|
+
readOptionalString(record.objectId) ??
|
|
212
|
+
readOptionalString(record.object_id) ??
|
|
213
|
+
readOptionalString(metadata?.objectId) ??
|
|
214
|
+
readOptionalString(metadata?.object_id) ??
|
|
215
|
+
readOptionalString(webhook?.objectId) ??
|
|
216
|
+
readOptionalString(webhook?.object_id) ??
|
|
217
|
+
readOptionalString(record.id);
|
|
218
|
+
if (!objectId) {
|
|
219
|
+
throw new Error('Airtable webhook payload is missing an object identifier.');
|
|
220
|
+
}
|
|
221
|
+
return objectId;
|
|
222
|
+
}
|
|
223
|
+
export function computeAirtableWebhookSignature(rawPayload, secret) {
|
|
224
|
+
const normalizedSecret = secret.trim();
|
|
225
|
+
if (!normalizedSecret) {
|
|
226
|
+
throw new Error('Airtable webhook secret must be a non-empty string.');
|
|
227
|
+
}
|
|
228
|
+
const digest = createHmac('sha256', normalizedSecret)
|
|
229
|
+
.update(toRawBodyBuffer(rawPayload))
|
|
230
|
+
.digest('hex');
|
|
231
|
+
return `${AIRTABLE_SIGNATURE_PREFIX}${digest}`;
|
|
232
|
+
}
|
|
233
|
+
export function validateAirtableWebhookSignature(rawPayload, headers, secret) {
|
|
234
|
+
const normalizedSecret = secret.trim();
|
|
235
|
+
if (!normalizedSecret) {
|
|
236
|
+
return { ok: false, reason: 'missing-secret' };
|
|
237
|
+
}
|
|
238
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
239
|
+
const receivedSignature = readOptionalString(normalizedHeaders[AIRTABLE_CONTENT_MAC_HEADER]);
|
|
240
|
+
if (!receivedSignature) {
|
|
241
|
+
return { ok: false, reason: 'missing-signature' };
|
|
242
|
+
}
|
|
243
|
+
const normalizedSignature = normalizeMacHeader(receivedSignature);
|
|
244
|
+
if (!normalizedSignature) {
|
|
245
|
+
return { ok: false, reason: 'malformed-signature', receivedSignature };
|
|
246
|
+
}
|
|
247
|
+
const expectedSignature = computeAirtableWebhookSignature(rawPayload, normalizedSecret);
|
|
248
|
+
const receivedBuffer = Buffer.from(normalizedSignature, 'utf8');
|
|
249
|
+
const expectedBuffer = Buffer.from(expectedSignature, 'utf8');
|
|
250
|
+
const ok = receivedBuffer.length === expectedBuffer.length && timingSafeEqual(expectedBuffer, receivedBuffer);
|
|
251
|
+
return {
|
|
252
|
+
ok,
|
|
253
|
+
...(ok
|
|
254
|
+
? { expectedSignature, receivedSignature }
|
|
255
|
+
: { expectedSignature, reason: 'invalid-signature', receivedSignature }),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
export function assertValidAirtableWebhookSignature(rawPayload, headers, secret) {
|
|
259
|
+
const result = validateAirtableWebhookSignature(rawPayload, headers, secret);
|
|
260
|
+
if (!result.ok) {
|
|
261
|
+
throw new Error(`Invalid Airtable webhook signature${result.reason ? ` (${result.reason})` : ''}.`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
export function validateAirtableWebhookTimestamp(payload, headers = {}, toleranceMs = DEFAULT_WEBHOOK_TOLERANCE_MS, nowMs = Date.now(), requireTimestamp = false) {
|
|
265
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
266
|
+
const record = safelyParseAirtableWebhookPayload(payload);
|
|
267
|
+
const metadata = getRecord(record?.metadata);
|
|
268
|
+
const webhook = getRecord(record?._webhook);
|
|
269
|
+
const webhookTimestamp = readOptionalTimestamp(normalizedHeaders[AIRTABLE_TIMESTAMP_HEADER]) ??
|
|
270
|
+
readOptionalTimestamp(record?.webhookTimestamp) ??
|
|
271
|
+
readOptionalTimestamp(record?.webhook_timestamp) ??
|
|
272
|
+
readOptionalTimestamp(record?.timestamp) ??
|
|
273
|
+
readOptionalTimestamp(metadata?.webhookTimestamp) ??
|
|
274
|
+
readOptionalTimestamp(metadata?.webhook_timestamp) ??
|
|
275
|
+
readOptionalTimestamp(webhook?.webhookTimestamp) ??
|
|
276
|
+
readOptionalTimestamp(webhook?.webhook_timestamp);
|
|
277
|
+
if (webhookTimestamp === undefined) {
|
|
278
|
+
return requireTimestamp ? { ok: false, reason: 'missing-timestamp' } : { ok: true };
|
|
279
|
+
}
|
|
280
|
+
const driftMs = Math.abs(nowMs - webhookTimestamp);
|
|
281
|
+
if (driftMs > toleranceMs) {
|
|
282
|
+
return {
|
|
283
|
+
driftMs,
|
|
284
|
+
ok: false,
|
|
285
|
+
reason: 'stale-timestamp',
|
|
286
|
+
webhookTimestamp,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
driftMs,
|
|
291
|
+
ok: true,
|
|
292
|
+
webhookTimestamp,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
export function assertValidAirtableWebhookTimestamp(payload, headers = {}, toleranceMs = DEFAULT_WEBHOOK_TOLERANCE_MS, nowMs = Date.now(), requireTimestamp = false) {
|
|
296
|
+
const result = validateAirtableWebhookTimestamp(payload, headers, toleranceMs, nowMs, requireTimestamp);
|
|
297
|
+
if (!result.ok) {
|
|
298
|
+
throw new Error(`Invalid Airtable webhook timestamp${result.reason ? ` (${result.reason})` : ''}.`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function buildNormalizedPayload(payload, headers, connection, normalized) {
|
|
302
|
+
const existingConnection = getRecord(payload._connection);
|
|
303
|
+
const existingWebhook = getRecord(payload._webhook);
|
|
304
|
+
const normalizedPayload = { ...payload };
|
|
305
|
+
normalizedPayload._connection = compactObject({
|
|
306
|
+
...existingConnection,
|
|
307
|
+
connectionId: connection.connectionId,
|
|
308
|
+
deliveryId: connection.deliveryId,
|
|
309
|
+
provider: connection.provider,
|
|
310
|
+
providerConfigKey: connection.providerConfigKey,
|
|
311
|
+
requestId: connection.requestId,
|
|
312
|
+
});
|
|
313
|
+
normalizedPayload._webhook = compactObject({
|
|
314
|
+
...existingWebhook,
|
|
315
|
+
action: normalized.action,
|
|
316
|
+
deliveryId: connection.deliveryId ?? readOptionalString(existingWebhook?.deliveryId),
|
|
317
|
+
eventHeader: readOptionalString(headers[AIRTABLE_EVENT_HEADER]) ?? readOptionalString(existingWebhook?.eventHeader),
|
|
318
|
+
eventType: normalized.eventType,
|
|
319
|
+
objectId: normalized.objectId,
|
|
320
|
+
objectType: normalized.objectType,
|
|
321
|
+
signature: connection.signature ?? readOptionalString(existingWebhook?.signature),
|
|
322
|
+
webhookTimestamp: connection.webhookTimestamp ??
|
|
323
|
+
readOptionalNumber(payload.webhookTimestamp) ??
|
|
324
|
+
readOptionalNumber(payload.timestamp) ??
|
|
325
|
+
readOptionalNumber(existingWebhook?.webhookTimestamp),
|
|
326
|
+
});
|
|
327
|
+
return normalizedPayload;
|
|
328
|
+
}
|
|
329
|
+
function extractAirtableAction(payload) {
|
|
330
|
+
const metadata = getRecord(payload.metadata);
|
|
331
|
+
const webhook = getRecord(payload._webhook);
|
|
332
|
+
const raw = readOptionalString(payload.action) ??
|
|
333
|
+
readOptionalString(payload.changeType) ??
|
|
334
|
+
readOptionalString(payload.change_type) ??
|
|
335
|
+
readOptionalString(metadata?.action) ??
|
|
336
|
+
readOptionalString(webhook?.action) ??
|
|
337
|
+
'update';
|
|
338
|
+
return normalizeAction(raw);
|
|
339
|
+
}
|
|
340
|
+
function normalizeAction(action) {
|
|
341
|
+
const normalized = action.trim().toLowerCase();
|
|
342
|
+
switch (normalized) {
|
|
343
|
+
case 'add':
|
|
344
|
+
case 'added':
|
|
345
|
+
case 'create':
|
|
346
|
+
case 'created':
|
|
347
|
+
case 'insert':
|
|
348
|
+
return 'create';
|
|
349
|
+
case 'delete':
|
|
350
|
+
case 'deleted':
|
|
351
|
+
case 'destroy':
|
|
352
|
+
case 'remove':
|
|
353
|
+
case 'removed':
|
|
354
|
+
return 'delete';
|
|
355
|
+
case 'change':
|
|
356
|
+
case 'changed':
|
|
357
|
+
case 'modify':
|
|
358
|
+
case 'modified':
|
|
359
|
+
case 'update':
|
|
360
|
+
case 'updated':
|
|
361
|
+
return 'update';
|
|
362
|
+
default:
|
|
363
|
+
return normalized || 'update';
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function decodeWebhookPayload(rawPayload) {
|
|
367
|
+
if (typeof rawPayload === 'string') {
|
|
368
|
+
return JSON.parse(rawPayload);
|
|
369
|
+
}
|
|
370
|
+
if (Buffer.isBuffer(rawPayload)) {
|
|
371
|
+
return JSON.parse(rawPayload.toString('utf8'));
|
|
372
|
+
}
|
|
373
|
+
if (rawPayload instanceof Uint8Array) {
|
|
374
|
+
return JSON.parse(Buffer.from(rawPayload).toString('utf8'));
|
|
375
|
+
}
|
|
376
|
+
if (rawPayload instanceof ArrayBuffer) {
|
|
377
|
+
return JSON.parse(Buffer.from(rawPayload).toString('utf8'));
|
|
378
|
+
}
|
|
379
|
+
return rawPayload;
|
|
380
|
+
}
|
|
381
|
+
function safelyParseAirtableWebhookPayload(rawPayload) {
|
|
382
|
+
try {
|
|
383
|
+
return parseAirtableWebhookPayload(rawPayload);
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
return undefined;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
function toRawBodyBuffer(rawPayload) {
|
|
390
|
+
if (typeof rawPayload === 'string') {
|
|
391
|
+
return Buffer.from(rawPayload, 'utf8');
|
|
392
|
+
}
|
|
393
|
+
if (Buffer.isBuffer(rawPayload)) {
|
|
394
|
+
return rawPayload;
|
|
395
|
+
}
|
|
396
|
+
if (rawPayload instanceof Uint8Array) {
|
|
397
|
+
return Buffer.from(rawPayload);
|
|
398
|
+
}
|
|
399
|
+
if (rawPayload instanceof ArrayBuffer) {
|
|
400
|
+
return Buffer.from(rawPayload);
|
|
401
|
+
}
|
|
402
|
+
return Buffer.from(JSON.stringify(rawPayload), 'utf8');
|
|
403
|
+
}
|
|
404
|
+
function isRawWebhookBody(rawPayload) {
|
|
405
|
+
return (typeof rawPayload === 'string' ||
|
|
406
|
+
Buffer.isBuffer(rawPayload) ||
|
|
407
|
+
rawPayload instanceof Uint8Array ||
|
|
408
|
+
rawPayload instanceof ArrayBuffer);
|
|
409
|
+
}
|
|
410
|
+
function normalizeMacHeader(value) {
|
|
411
|
+
const trimmed = value.trim().toLowerCase();
|
|
412
|
+
if (!trimmed.startsWith(AIRTABLE_SIGNATURE_PREFIX)) {
|
|
413
|
+
return undefined;
|
|
414
|
+
}
|
|
415
|
+
const digest = trimmed.slice(AIRTABLE_SIGNATURE_PREFIX.length);
|
|
416
|
+
if (!/^[0-9a-f]{64}$/u.test(digest)) {
|
|
417
|
+
return undefined;
|
|
418
|
+
}
|
|
419
|
+
return `${AIRTABLE_SIGNATURE_PREFIX}${digest}`;
|
|
420
|
+
}
|
|
421
|
+
function normalizeHeaders(headers) {
|
|
422
|
+
if (headers instanceof Headers) {
|
|
423
|
+
return Object.fromEntries(Array.from(headers.entries()).map(([key, value]) => [key.toLowerCase(), value]));
|
|
424
|
+
}
|
|
425
|
+
if (isIterableHeaders(headers)) {
|
|
426
|
+
const normalized = {};
|
|
427
|
+
for (const [key, value] of headers) {
|
|
428
|
+
normalized[key.toLowerCase()] = value;
|
|
429
|
+
}
|
|
430
|
+
return normalized;
|
|
431
|
+
}
|
|
432
|
+
const normalized = {};
|
|
433
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
434
|
+
const normalizedValue = normalizeHeaderValue(value);
|
|
435
|
+
if (normalizedValue !== undefined) {
|
|
436
|
+
normalized[key.toLowerCase()] = normalizedValue;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return normalized;
|
|
440
|
+
}
|
|
441
|
+
function isIterableHeaders(value) {
|
|
442
|
+
return typeof value === 'object' && value !== null && Symbol.iterator in value;
|
|
443
|
+
}
|
|
444
|
+
function normalizeHeaderValue(value) {
|
|
445
|
+
if (value === undefined || value === null) {
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
if (Array.isArray(value)) {
|
|
449
|
+
return value.map(String).join(',');
|
|
450
|
+
}
|
|
451
|
+
return String(value);
|
|
452
|
+
}
|
|
453
|
+
function readHeaderValue(headers, keys) {
|
|
454
|
+
for (const key of keys) {
|
|
455
|
+
const value = readOptionalString(headers[key]);
|
|
456
|
+
if (value) {
|
|
457
|
+
return value;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return undefined;
|
|
461
|
+
}
|
|
462
|
+
function readOptionalTimestamp(value) {
|
|
463
|
+
const number = readOptionalNumber(value);
|
|
464
|
+
if (number === undefined) {
|
|
465
|
+
return undefined;
|
|
466
|
+
}
|
|
467
|
+
return number < 10_000_000_000 ? number * 1000 : number;
|
|
468
|
+
}
|
|
469
|
+
function readOptionalNumber(value) {
|
|
470
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
471
|
+
return value;
|
|
472
|
+
}
|
|
473
|
+
if (typeof value === 'string' && value.trim()) {
|
|
474
|
+
const parsed = Number(value);
|
|
475
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
476
|
+
}
|
|
477
|
+
return undefined;
|
|
478
|
+
}
|
|
479
|
+
function readOptionalString(value) {
|
|
480
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
481
|
+
}
|
|
482
|
+
function getRecord(value) {
|
|
483
|
+
return isRecord(value) ? value : undefined;
|
|
484
|
+
}
|
|
485
|
+
function isRecord(value) {
|
|
486
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
487
|
+
}
|
|
488
|
+
function looksLikeAirtableRecord(value) {
|
|
489
|
+
const record = getRecord(value);
|
|
490
|
+
return Boolean(record && (isRecord(record.fields) || readOptionalString(record.tableId) || readOptionalString(record.table_id)));
|
|
491
|
+
}
|
|
492
|
+
function compactObject(object) {
|
|
493
|
+
const compacted = {};
|
|
494
|
+
for (const [key, value] of Object.entries(object)) {
|
|
495
|
+
if (value !== undefined && value !== null) {
|
|
496
|
+
compacted[key] = value;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
return compacted;
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=webhook-normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-normalizer.js","sourceRoot":"","sources":["../src/webhook-normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AirtableWritebackRequest } from './types.js';
|
|
2
|
+
export declare const AIRTABLE_WRITEBACK_ROUTE_TEMPLATE = "/v0/{baseId}/{tableId}";
|
|
3
|
+
export declare function resolveAirtableWritebackRequest(path: string, content: string): AirtableWritebackRequest;
|
|
4
|
+
export declare function resolveAirtableReplaceRecordRequest(path: string, content: string): AirtableWritebackRequest;
|
|
5
|
+
//# sourceMappingURL=writeback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,iCAAiC,2BAA2B,CAAC;AAE1E,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,wBAAwB,CAqCvG;AAED,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,wBAAwB,CAoB3G"}
|