@dsh-enhanced/event-triggers 0.1.3

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/lib/sensors.js ADDED
@@ -0,0 +1,440 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lookup as dnsLookup } from 'node:dns/promises';
3
+ import { constants, lstatSync, realpathSync, statSync } from 'node:fs';
4
+ import { lstat, open, realpath, stat } from 'node:fs/promises';
5
+ import { request as httpsRequest } from 'node:https';
6
+ import { isIP } from 'node:net';
7
+ import { isAbsolute, relative, resolve } from 'node:path';
8
+ import { Readable } from 'node:stream';
9
+ const MAX_DNS_ANSWERS = 16;
10
+ function hash(value) {
11
+ return createHash('sha256').update(value).digest('hex');
12
+ }
13
+ function inside(path, root) {
14
+ const child = relative(root, path);
15
+ return child === '' || (!child.startsWith('..') && !isAbsolute(child));
16
+ }
17
+ function hostname(url) {
18
+ const value = url.hostname;
19
+ return value.startsWith('[') && value.endsWith(']') ? value.slice(1, -1) : value;
20
+ }
21
+ export function pinFileRoots(roots) {
22
+ return Object.freeze(roots.map(root => {
23
+ const configuredPath = resolve(root);
24
+ try {
25
+ const configured = lstatSync(configuredPath, { bigint: true });
26
+ const realPath = realpathSync(configuredPath);
27
+ const physical = statSync(configuredPath, { bigint: true });
28
+ if (!physical.isDirectory())
29
+ throw new Error('allowed file root is not a directory');
30
+ return Object.freeze({
31
+ configuredPath,
32
+ realPath,
33
+ configuredDevice: configured.dev,
34
+ configuredInode: configured.ino,
35
+ physicalDevice: physical.dev,
36
+ physicalInode: physical.ino,
37
+ });
38
+ }
39
+ catch (error) {
40
+ throw new Error(`event-triggers: allowed file root cannot be pinned: ${configuredPath}`, { cause: error });
41
+ }
42
+ }));
43
+ }
44
+ async function verifiedFileRoots(target, pins) {
45
+ const candidates = pins.filter(pin => inside(target, pin.configuredPath));
46
+ if (candidates.length === 0)
47
+ throw new Error('event-triggers: file path is outside pinned allowlist roots');
48
+ const verified = await Promise.all(candidates.map(async (pin) => {
49
+ try {
50
+ const [configured, realPath, physical] = await Promise.all([
51
+ lstat(pin.configuredPath, { bigint: true }),
52
+ realpath(pin.configuredPath),
53
+ stat(pin.configuredPath, { bigint: true }),
54
+ ]);
55
+ if (!physical.isDirectory() || realPath !== pin.realPath
56
+ || configured.dev !== pin.configuredDevice || configured.ino !== pin.configuredInode
57
+ || physical.dev !== pin.physicalDevice || physical.ino !== pin.physicalInode)
58
+ return undefined;
59
+ return pin.realPath;
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }));
65
+ const roots = verified.filter(root => root !== undefined);
66
+ if (roots.length === 0)
67
+ throw new Error('event-triggers: allowed file root changed after initialization');
68
+ return roots;
69
+ }
70
+ export async function readFileObservation(input) {
71
+ const target = resolve(input.path);
72
+ if (!input.roots.some(root => inside(target, resolve(root))))
73
+ throw new Error('event-triggers: file path is outside allowlist');
74
+ const pins = input.pinnedRoots ?? pinFileRoots(input.roots);
75
+ const allowedRoots = await verifiedFileRoots(target, pins);
76
+ let metadata;
77
+ try {
78
+ metadata = await lstat(target);
79
+ }
80
+ catch (error) {
81
+ if (error.code === 'ENOENT')
82
+ return { fingerprint: 'missing', truthy: false };
83
+ throw error;
84
+ }
85
+ if (metadata.isSymbolicLink() || !metadata.isFile())
86
+ throw new Error('event-triggers: watched path must be a regular non-symlink file');
87
+ const actual = await realpath(target);
88
+ if (!allowedRoots.some(root => inside(actual, root))) {
89
+ throw new Error('event-triggers: watched file escapes its realpath allowlist');
90
+ }
91
+ await input.beforeOpen?.();
92
+ let descriptor;
93
+ try {
94
+ descriptor = await open(target, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
95
+ }
96
+ catch (error) {
97
+ const code = error.code;
98
+ if (code === 'ELOOP')
99
+ throw new Error('event-triggers: watched path became a symlink');
100
+ if (code === 'ENOENT')
101
+ return { fingerprint: 'missing', truthy: false };
102
+ throw error;
103
+ }
104
+ try {
105
+ const current = await descriptor.stat();
106
+ if (!current.isFile())
107
+ throw new Error('event-triggers: watched path must remain a regular file');
108
+ let currentPath;
109
+ let currentActual;
110
+ try {
111
+ currentPath = await lstat(target);
112
+ currentActual = await realpath(target);
113
+ }
114
+ catch {
115
+ throw new Error('event-triggers: watched path changed while it was being opened');
116
+ }
117
+ const currentAllowedRoots = await verifiedFileRoots(target, pins);
118
+ if (currentPath.isSymbolicLink() || !currentPath.isFile()
119
+ || !currentAllowedRoots.some(root => inside(currentActual, root))
120
+ || currentPath.dev !== current.dev || currentPath.ino !== current.ino) {
121
+ throw new Error('event-triggers: watched path changed or escaped its realpath allowlist');
122
+ }
123
+ if (input.mode === 'exists')
124
+ return { fingerprint: 'exists', truthy: true };
125
+ if (current.size > input.maxBytes)
126
+ throw new Error('event-triggers: watched file exceeds maxBodyBytes');
127
+ const content = await descriptor.readFile();
128
+ if (content.byteLength > input.maxBytes)
129
+ throw new Error('event-triggers: watched file exceeds maxBodyBytes');
130
+ return { fingerprint: `sha256:${hash(content)}`, truthy: true };
131
+ }
132
+ finally {
133
+ await descriptor.close();
134
+ }
135
+ }
136
+ function ipv4Bytes(address) {
137
+ if (isIP(address) !== 4)
138
+ return undefined;
139
+ const parts = address.split('.').map(Number);
140
+ if (parts.length !== 4 || parts.some(part => !Number.isInteger(part) || part < 0 || part > 255))
141
+ return undefined;
142
+ return parts;
143
+ }
144
+ function globalIpv4(parts) {
145
+ const [a, b, c] = parts;
146
+ return !(a === 0 || a === 10 || a === 127 || a >= 224
147
+ || (a === 100 && b >= 64 && b <= 127)
148
+ || (a === 169 && b === 254)
149
+ || (a === 172 && b >= 16 && b <= 31)
150
+ || (a === 192 && b === 168)
151
+ || (a === 192 && b === 0 && (c === 0 || c === 2))
152
+ || (a === 192 && b === 88 && c === 99)
153
+ || (a === 198 && (b === 18 || b === 19))
154
+ || (a === 198 && b === 51 && c === 100)
155
+ || (a === 203 && b === 0 && c === 113));
156
+ }
157
+ function ipv6Bytes(address) {
158
+ if (address.includes('%') || isIP(address) !== 6)
159
+ return undefined;
160
+ const halves = address.toLowerCase().split('::');
161
+ if (halves.length > 2)
162
+ return undefined;
163
+ const parseHalf = (value) => {
164
+ if (value === '')
165
+ return [];
166
+ const raw = value.split(':');
167
+ const result = [];
168
+ for (let index = 0; index < raw.length; index += 1) {
169
+ const part = raw[index];
170
+ if (part.includes('.')) {
171
+ if (index !== raw.length - 1)
172
+ return undefined;
173
+ const embedded = ipv4Bytes(part);
174
+ if (embedded === undefined)
175
+ return undefined;
176
+ result.push((embedded[0] << 8) | embedded[1], (embedded[2] << 8) | embedded[3]);
177
+ }
178
+ else {
179
+ if (!/^[a-f0-9]{1,4}$/u.test(part))
180
+ return undefined;
181
+ result.push(Number.parseInt(part, 16));
182
+ }
183
+ }
184
+ return result;
185
+ };
186
+ const left = parseHalf(halves[0]);
187
+ const right = parseHalf(halves[1] ?? '');
188
+ if (left === undefined || right === undefined)
189
+ return undefined;
190
+ const omitted = 8 - left.length - right.length;
191
+ if ((halves.length === 1 && omitted !== 0) || (halves.length === 2 && omitted < 1))
192
+ return undefined;
193
+ const groups = halves.length === 1 ? left : [...left, ...Array.from({ length: omitted }, () => 0), ...right];
194
+ if (groups.length !== 8)
195
+ return undefined;
196
+ const bytes = new Uint8Array(16);
197
+ groups.forEach((group, index) => {
198
+ bytes[index * 2] = group >>> 8;
199
+ bytes[index * 2 + 1] = group & 0xff;
200
+ });
201
+ return bytes;
202
+ }
203
+ function hasPrefix(value, prefix, bits) {
204
+ const bytes = Math.floor(bits / 8);
205
+ for (let index = 0; index < bytes; index += 1)
206
+ if (value[index] !== prefix[index])
207
+ return false;
208
+ const remaining = bits % 8;
209
+ if (remaining === 0)
210
+ return true;
211
+ const mask = 0xff << (8 - remaining);
212
+ return (value[bytes] & mask) === (prefix[bytes] & mask);
213
+ }
214
+ function globalIpv6(bytes) {
215
+ const mapped = bytes.slice(12);
216
+ if (bytes.slice(0, 10).every(value => value === 0) && bytes[10] === 0xff && bytes[11] === 0xff) {
217
+ return globalIpv4(mapped);
218
+ }
219
+ // IPv4-compatible, translated, NAT64 and all non-current global-unicast space fail closed.
220
+ if (bytes[0] < 0x20 || bytes[0] > 0x3f)
221
+ return false;
222
+ if (hasPrefix(bytes, [0x20, 0x01, 0x0d, 0xb8], 32)
223
+ || hasPrefix(bytes, [0x20, 0x01, 0x00, 0x00], 32)
224
+ || hasPrefix(bytes, [0x20, 0x01, 0x00, 0x10], 28)
225
+ || hasPrefix(bytes, [0x20, 0x01, 0x00, 0x20], 28)
226
+ || hasPrefix(bytes, [0x20, 0x01, 0x00, 0x02, 0x00, 0x00], 48)
227
+ || hasPrefix(bytes, [0x3f, 0xff, 0x00], 20))
228
+ return false;
229
+ if (hasPrefix(bytes, [0x20, 0x02], 16))
230
+ return globalIpv4(bytes.slice(2, 6));
231
+ const isatap = (bytes[8] === 0 || bytes[8] === 2) && bytes[9] === 0 && bytes[10] === 0x5e && bytes[11] === 0xfe;
232
+ return !isatap || globalIpv4(mapped);
233
+ }
234
+ function validatedAddresses(resolved, allowIpv6) {
235
+ if (resolved.length === 0 || resolved.length > MAX_DNS_ANSWERS) {
236
+ throw new Error('event-triggers: HTTP DNS answer count is outside the accepted bound');
237
+ }
238
+ const seen = new Set();
239
+ const addresses = [];
240
+ for (const item of resolved) {
241
+ const ipv4 = ipv4Bytes(item.address);
242
+ const ipv6 = ipv6Bytes(item.address);
243
+ const family = ipv4 === undefined ? (ipv6 === undefined ? 0 : 6) : 4;
244
+ if ((family !== 4 && family !== 6) || family !== item.family
245
+ || (ipv4 !== undefined ? !globalIpv4(ipv4) : ipv6 === undefined || !globalIpv6(ipv6))) {
246
+ throw new Error('event-triggers: HTTP host resolved to an unsafe or invalid address');
247
+ }
248
+ if (family === 6 && !allowIpv6) {
249
+ throw new Error('event-triggers: HTTP IPv6 address is unsafe without an explicit native-only network assertion');
250
+ }
251
+ const key = `${family}:${Buffer.from(ipv4 ?? ipv6).toString('hex')}`;
252
+ if (seen.has(key))
253
+ continue;
254
+ seen.add(key);
255
+ addresses.push(Object.freeze({ address: item.address, family }));
256
+ }
257
+ return addresses;
258
+ }
259
+ function abortError(signal) {
260
+ return signal.reason instanceof Error ? signal.reason : new Error('event-triggers: HTTP sensor was aborted');
261
+ }
262
+ async function raceWithAbort(operation, signal) {
263
+ if (signal.aborted)
264
+ throw abortError(signal);
265
+ return new Promise((resolvePromise, rejectPromise) => {
266
+ const aborted = () => { cleanup(); rejectPromise(abortError(signal)); };
267
+ const cleanup = () => signal.removeEventListener('abort', aborted);
268
+ signal.addEventListener('abort', aborted, { once: true });
269
+ void operation.then(value => { cleanup(); resolvePromise(value); }, error => { cleanup(); rejectPromise(error); });
270
+ });
271
+ }
272
+ function tracked(operation, tracker) {
273
+ return tracker?.(operation) ?? operation;
274
+ }
275
+ async function cancelBody(response, signal, tracker) {
276
+ if (response.body === null)
277
+ return;
278
+ try {
279
+ await raceWithAbort(tracked(response.body.cancel(), tracker), signal);
280
+ }
281
+ catch { }
282
+ }
283
+ function cancelReader(reader, tracker) {
284
+ try {
285
+ void tracked(reader.cancel(), tracker).catch(() => { });
286
+ }
287
+ catch { }
288
+ }
289
+ async function boundedBody(response, maximum, signal, tracker) {
290
+ const declared = response.headers.get('content-length');
291
+ if (declared !== null && Number(declared) > maximum) {
292
+ await cancelBody(response, signal, tracker);
293
+ throw new Error('event-triggers: HTTP body exceeds limit');
294
+ }
295
+ if (response.body === null)
296
+ return Buffer.alloc(0);
297
+ const reader = response.body.getReader();
298
+ const chunks = [];
299
+ let total = 0;
300
+ while (true) {
301
+ const reading = tracked(reader.read(), tracker);
302
+ let value;
303
+ try {
304
+ value = await raceWithAbort(reading, signal);
305
+ }
306
+ catch (error) {
307
+ cancelReader(reader, tracker);
308
+ throw error;
309
+ }
310
+ if (value.done)
311
+ break;
312
+ total += value.value.byteLength;
313
+ if (total > maximum) {
314
+ cancelReader(reader, tracker);
315
+ throw new Error('event-triggers: HTTP body exceeds limit');
316
+ }
317
+ chunks.push(Buffer.from(value.value));
318
+ }
319
+ return Buffer.concat(chunks, total);
320
+ }
321
+ function pointer(document, value) {
322
+ if (value === '')
323
+ return document;
324
+ let current = document;
325
+ for (const raw of value.slice(1).split('/')) {
326
+ const key = raw.replace(/~1/gu, '/').replace(/~0/gu, '~');
327
+ if (typeof current !== 'object' || current === null || !(key in current)) {
328
+ throw new Error('event-triggers: JSON pointer does not exist');
329
+ }
330
+ current = current[key];
331
+ }
332
+ return current;
333
+ }
334
+ export async function defaultLookup(hostname) {
335
+ return dnsLookup(hostname, { all: true, verbatim: true });
336
+ }
337
+ async function pinnedHttpsFetch(urlValue, init, route) {
338
+ const url = new URL(urlValue);
339
+ const certificateHost = hostname(url);
340
+ const selected = route.addresses[0];
341
+ if (selected === undefined)
342
+ throw new Error('event-triggers: HTTP route has no validated address');
343
+ const lookup = (_hostname, options, callback) => {
344
+ if (options.all)
345
+ callback(null, [selected]);
346
+ else
347
+ callback(null, selected.address, selected.family);
348
+ };
349
+ return new Promise((resolveResponse, rejectResponse) => {
350
+ const request = httpsRequest(url, {
351
+ agent: false,
352
+ method: init.method,
353
+ headers: Object.fromEntries(new Headers(init.headers).entries()),
354
+ lookup,
355
+ ...(isIP(certificateHost) === 0 ? { servername: certificateHost } : {}),
356
+ signal: init.signal ?? undefined,
357
+ }, (response) => {
358
+ try {
359
+ const headers = new Headers();
360
+ for (const [name, value] of Object.entries(response.headers)) {
361
+ if (Array.isArray(value))
362
+ for (const item of value)
363
+ headers.append(name, item);
364
+ else if (value !== undefined)
365
+ headers.set(name, value);
366
+ }
367
+ const status = response.statusCode ?? 500;
368
+ const hasNullBody = status === 204 || status === 205 || status === 304;
369
+ const body = hasNullBody ? null : Readable.toWeb(response);
370
+ if (hasNullBody)
371
+ response.destroy();
372
+ resolveResponse(new Response(body, { status, headers }));
373
+ }
374
+ catch (error) {
375
+ response.destroy();
376
+ rejectResponse(error);
377
+ }
378
+ });
379
+ request.once('error', rejectResponse);
380
+ request.end();
381
+ });
382
+ }
383
+ export async function readHttpJsonObservation(input) {
384
+ const url = new URL(input.url);
385
+ if (url.protocol !== 'https:')
386
+ throw new Error('event-triggers: HTTP sensor requires HTTPS');
387
+ const legacyAllowed = (url.port === '' || url.port === '443')
388
+ && (input.allowedHosts?.has(url.hostname.toLowerCase()) ?? false);
389
+ if (url.username !== '' || url.password !== '' || (!legacyAllowed && !(input.allowedOrigins?.has(url.origin) ?? false))) {
390
+ throw new Error('event-triggers: HTTP sensor host/origin is not allowlisted');
391
+ }
392
+ const controller = new AbortController();
393
+ const forwardAbort = () => controller.abort(input.signal?.reason ?? new Error('event-triggers: HTTP sensor was aborted'));
394
+ if (input.signal?.aborted)
395
+ forwardAbort();
396
+ else
397
+ input.signal?.addEventListener('abort', forwardAbort, { once: true });
398
+ const timer = setTimeout(() => controller.abort(new Error('event-triggers: HTTP sensor timeout')), input.timeoutMs);
399
+ timer.unref?.();
400
+ try {
401
+ const address = hostname(url);
402
+ const family = isIP(address);
403
+ const resolving = family === 0
404
+ ? (input.lookup ?? defaultLookup)(address)
405
+ : Promise.resolve([{ address, family }]);
406
+ const resolved = await raceWithAbort(tracked(resolving, input.trackOperation), controller.signal);
407
+ const addresses = validatedAddresses(resolved, input.allowIpv6 ?? false);
408
+ const fetching = (input.fetcher ?? pinnedHttpsFetch)(url.toString(), {
409
+ method: 'GET', redirect: 'manual', signal: controller.signal,
410
+ headers: { accept: 'application/json' },
411
+ }, { addresses });
412
+ const response = await raceWithAbort(tracked(fetching, input.trackOperation), controller.signal);
413
+ if (response.status >= 300 && response.status < 400) {
414
+ await cancelBody(response, controller.signal, input.trackOperation);
415
+ throw new Error('event-triggers: HTTP redirects are not allowed');
416
+ }
417
+ if (!response.ok) {
418
+ await cancelBody(response, controller.signal, input.trackOperation);
419
+ throw new Error(`event-triggers: HTTP sensor returned ${response.status}`);
420
+ }
421
+ const body = await boundedBody(response, input.maxBodyBytes, controller.signal, input.trackOperation);
422
+ let document;
423
+ try {
424
+ document = JSON.parse(body.toString('utf8'));
425
+ }
426
+ catch {
427
+ throw new Error('event-triggers: HTTP body is not valid JSON');
428
+ }
429
+ const selected = pointer(document, input.pointer);
430
+ const serialized = JSON.stringify(selected);
431
+ if (serialized === undefined)
432
+ throw new Error('event-triggers: JSON pointer selected an unsupported value');
433
+ return { fingerprint: `sha256:${hash(serialized)}`, truthy: Boolean(selected) };
434
+ }
435
+ finally {
436
+ clearTimeout(timer);
437
+ input.signal?.removeEventListener('abort', forwardAbort);
438
+ }
439
+ }
440
+ //# sourceMappingURL=sensors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensors.js","sourceRoot":"","sources":["../src/sensors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { Context, Service } from '@deepseek-ai/cordis';
2
+ import { ConfigSchema, type Config } from './config.js';
3
+ import { readFileObservation, type Fetcher, type Lookup } from './sensors.js';
4
+ import { EventTriggerStore } from './store.js';
5
+ export type EventTriggersErrorCode = 'cooldown' | 'disposed' | 'invalid-signature' | 'limit' | 'not-found' | 'policy-denied' | 'replay' | 'timestamp' | 'ttl';
6
+ export declare class EventTriggersError extends Error {
7
+ readonly code: EventTriggersErrorCode;
8
+ constructor(code: EventTriggersErrorCode, message: string);
9
+ }
10
+ export interface EventTriggersServiceOptions {
11
+ now?: () => number;
12
+ fetcher?: Fetcher;
13
+ lookup?: Lookup;
14
+ fileObserver?: typeof readFileObservation;
15
+ }
16
+ declare module '@deepseek-ai/cordis' {
17
+ interface Context {
18
+ eventTriggers: EventTriggersService;
19
+ }
20
+ }
21
+ export declare class EventTriggersService extends Service {
22
+ static Config: import("@deepseek-ai/schemastery").default<Config>;
23
+ private readonly config;
24
+ private readonly store;
25
+ private readonly policy;
26
+ private readonly automations;
27
+ private readonly credentials;
28
+ private readonly triggers;
29
+ private readonly now;
30
+ private readonly fetcher;
31
+ private readonly lookup;
32
+ private readonly fileObserver;
33
+ private readonly pinnedFileRoots;
34
+ private readonly shutdown;
35
+ private pollTimer;
36
+ private flushTimer;
37
+ private pollInFlight;
38
+ private flushInFlight;
39
+ private pollCursor;
40
+ private readonly inFlight;
41
+ private readonly pendingObservations;
42
+ private active;
43
+ constructor(ctx: Context, input: Config, options?: EventTriggersServiceOptions);
44
+ pollOnce(): Promise<void>;
45
+ private performPollOnce;
46
+ private observeTrigger;
47
+ /**
48
+ * Starts at most one pure sensor read per trigger. A timed-out filesystem read
49
+ * may be uninterruptible, so its eventual result is discarded and no durable
50
+ * state is touched outside the bounded waiter below.
51
+ */
52
+ private startObservation;
53
+ private raceObservation;
54
+ flushPending(): Promise<void>;
55
+ private startFlush;
56
+ private performFlushPending;
57
+ ingestWebhook(triggerId: string, input: {
58
+ timestamp: string;
59
+ nonce: string;
60
+ signature: string;
61
+ body: Buffer;
62
+ }): Promise<{
63
+ accepted: true;
64
+ eventId: string;
65
+ }>;
66
+ private performIngestWebhook;
67
+ health(): ReturnType<EventTriggerStore['health']>;
68
+ private verifySignature;
69
+ private assertActive;
70
+ private track;
71
+ }
72
+ export { ConfigSchema as Config };
73
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}