@waiaas/daemon 2.9.1-rc → 2.10.0-rc
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/api/middleware/master-auth.d.ts +3 -0
- package/dist/api/middleware/master-auth.d.ts.map +1 -1
- package/dist/api/middleware/master-auth.js +14 -0
- package/dist/api/middleware/master-auth.js.map +1 -1
- package/dist/api/routes/admin.d.ts +4 -0
- package/dist/api/routes/admin.d.ts.map +1 -1
- package/dist/api/routes/admin.js +186 -1
- package/dist/api/routes/admin.js.map +1 -1
- package/dist/api/routes/audit-logs.d.ts +15 -0
- package/dist/api/routes/audit-logs.d.ts.map +1 -0
- package/dist/api/routes/audit-logs.js +119 -0
- package/dist/api/routes/audit-logs.js.map +1 -0
- package/dist/api/routes/index.d.ts +2 -1
- package/dist/api/routes/index.d.ts.map +1 -1
- package/dist/api/routes/index.js +2 -1
- package/dist/api/routes/index.js.map +1 -1
- package/dist/api/routes/openapi-schemas.d.ts +324 -6
- package/dist/api/routes/openapi-schemas.d.ts.map +1 -1
- package/dist/api/routes/openapi-schemas.js +76 -0
- package/dist/api/routes/openapi-schemas.js.map +1 -1
- package/dist/api/routes/sessions.d.ts +2 -0
- package/dist/api/routes/sessions.d.ts.map +1 -1
- package/dist/api/routes/sessions.js +21 -0
- package/dist/api/routes/sessions.js.map +1 -1
- package/dist/api/routes/transactions.d.ts +2 -1
- package/dist/api/routes/transactions.d.ts.map +1 -1
- package/dist/api/routes/transactions.js +72 -1
- package/dist/api/routes/transactions.js.map +1 -1
- package/dist/api/routes/wallets.d.ts.map +1 -1
- package/dist/api/routes/wallets.js +25 -0
- package/dist/api/routes/wallets.js.map +1 -1
- package/dist/api/routes/webhooks.d.ts +17 -0
- package/dist/api/routes/webhooks.d.ts.map +1 -0
- package/dist/api/routes/webhooks.js +218 -0
- package/dist/api/routes/webhooks.js.map +1 -0
- package/dist/api/server.d.ts +27 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +31 -5
- package/dist/api/server.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/backup/backup-format.d.ts +107 -0
- package/dist/infrastructure/backup/backup-format.d.ts.map +1 -0
- package/dist/infrastructure/backup/backup-format.js +134 -0
- package/dist/infrastructure/backup/backup-format.js.map +1 -0
- package/dist/infrastructure/backup/encrypted-backup-service.d.ts +56 -0
- package/dist/infrastructure/backup/encrypted-backup-service.d.ts.map +1 -0
- package/dist/infrastructure/backup/encrypted-backup-service.js +269 -0
- package/dist/infrastructure/backup/encrypted-backup-service.js.map +1 -0
- package/dist/infrastructure/backup/index.d.ts +3 -0
- package/dist/infrastructure/backup/index.d.ts.map +1 -1
- package/dist/infrastructure/backup/index.js +2 -0
- package/dist/infrastructure/backup/index.js.map +1 -1
- package/dist/infrastructure/config/loader.d.ts +23 -0
- package/dist/infrastructure/config/loader.d.ts.map +1 -1
- package/dist/infrastructure/config/loader.js +8 -0
- package/dist/infrastructure/config/loader.js.map +1 -1
- package/dist/infrastructure/database/audit-helper.d.ts +29 -0
- package/dist/infrastructure/database/audit-helper.d.ts.map +1 -0
- package/dist/infrastructure/database/audit-helper.js +30 -0
- package/dist/infrastructure/database/audit-helper.js.map +1 -0
- package/dist/infrastructure/database/index.d.ts +2 -0
- package/dist/infrastructure/database/index.d.ts.map +1 -1
- package/dist/infrastructure/database/index.js +1 -0
- package/dist/infrastructure/database/index.js.map +1 -1
- package/dist/infrastructure/database/migrate.d.ts +1 -1
- package/dist/infrastructure/database/migrate.d.ts.map +1 -1
- package/dist/infrastructure/database/migrate.js +83 -2
- package/dist/infrastructure/database/migrate.js.map +1 -1
- package/dist/infrastructure/database/schema.d.ts +343 -1
- package/dist/infrastructure/database/schema.d.ts.map +1 -1
- package/dist/infrastructure/database/schema.js +41 -1
- package/dist/infrastructure/database/schema.js.map +1 -1
- package/dist/infrastructure/metrics/in-memory-counter.d.ts +34 -0
- package/dist/infrastructure/metrics/in-memory-counter.d.ts.map +1 -0
- package/dist/infrastructure/metrics/in-memory-counter.js +88 -0
- package/dist/infrastructure/metrics/in-memory-counter.js.map +1 -0
- package/dist/infrastructure/settings/hot-reload.d.ts +1 -0
- package/dist/infrastructure/settings/hot-reload.d.ts.map +1 -1
- package/dist/infrastructure/settings/hot-reload.js +23 -2
- package/dist/infrastructure/settings/hot-reload.js.map +1 -1
- package/dist/infrastructure/settings/setting-keys.d.ts.map +1 -1
- package/dist/infrastructure/settings/setting-keys.js +4 -0
- package/dist/infrastructure/settings/setting-keys.js.map +1 -1
- package/dist/infrastructure/telegram/telegram-bot-service.d.ts.map +1 -1
- package/dist/infrastructure/telegram/telegram-bot-service.js +32 -19
- package/dist/infrastructure/telegram/telegram-bot-service.js.map +1 -1
- package/dist/lifecycle/daemon.d.ts +8 -1
- package/dist/lifecycle/daemon.d.ts.map +1 -1
- package/dist/lifecycle/daemon.js +103 -1
- package/dist/lifecycle/daemon.js.map +1 -1
- package/dist/pipeline/dry-run.d.ts +68 -0
- package/dist/pipeline/dry-run.d.ts.map +1 -0
- package/dist/pipeline/dry-run.js +426 -0
- package/dist/pipeline/dry-run.js.map +1 -0
- package/dist/pipeline/index.d.ts +1 -0
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +2 -0
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/pipeline.d.ts +18 -1
- package/dist/pipeline/pipeline.d.ts.map +1 -1
- package/dist/pipeline/pipeline.js +38 -0
- package/dist/pipeline/pipeline.js.map +1 -1
- package/dist/pipeline/stages.d.ts +31 -1
- package/dist/pipeline/stages.d.ts.map +1 -1
- package/dist/pipeline/stages.js +120 -22
- package/dist/pipeline/stages.js.map +1 -1
- package/dist/services/admin-stats-service.d.ts +48 -0
- package/dist/services/admin-stats-service.d.ts.map +1 -0
- package/dist/services/admin-stats-service.js +182 -0
- package/dist/services/admin-stats-service.js.map +1 -0
- package/dist/services/autostop/autostop-service.d.ts +83 -0
- package/dist/services/autostop/autostop-service.d.ts.map +1 -0
- package/dist/services/autostop/autostop-service.js +252 -0
- package/dist/services/autostop/autostop-service.js.map +1 -0
- package/dist/services/autostop/index.d.ts +15 -0
- package/dist/services/autostop/index.d.ts.map +1 -0
- package/dist/services/autostop/index.js +11 -0
- package/dist/services/autostop/index.js.map +1 -0
- package/dist/services/autostop/rule-registry.d.ts +42 -0
- package/dist/services/autostop/rule-registry.d.ts.map +1 -0
- package/dist/services/autostop/rule-registry.js +54 -0
- package/dist/services/autostop/rule-registry.js.map +1 -0
- package/dist/services/autostop/rules/consecutive-failures.rule.d.ts +38 -0
- package/dist/services/autostop/rules/consecutive-failures.rule.d.ts.map +1 -0
- package/dist/services/autostop/rules/consecutive-failures.rule.js +75 -0
- package/dist/services/autostop/rules/consecutive-failures.rule.js.map +1 -0
- package/dist/services/autostop/rules/idle-timeout.rule.d.ts +43 -0
- package/dist/services/autostop/rules/idle-timeout.rule.d.ts.map +1 -0
- package/dist/services/autostop/rules/idle-timeout.rule.js +128 -0
- package/dist/services/autostop/rules/idle-timeout.rule.js.map +1 -0
- package/dist/services/autostop/rules/unusual-activity.rule.d.ts +33 -0
- package/dist/services/autostop/rules/unusual-activity.rule.d.ts.map +1 -0
- package/dist/services/autostop/rules/unusual-activity.rule.js +73 -0
- package/dist/services/autostop/rules/unusual-activity.rule.js.map +1 -0
- package/dist/services/autostop/types.d.ts +49 -0
- package/dist/services/autostop/types.d.ts.map +1 -0
- package/dist/services/autostop/types.js +10 -0
- package/dist/services/autostop/types.js.map +1 -0
- package/dist/services/autostop-rules.d.ts +11 -74
- package/dist/services/autostop-rules.d.ts.map +1 -1
- package/dist/services/autostop-rules.js +9 -169
- package/dist/services/autostop-rules.js.map +1 -1
- package/dist/services/autostop-service.d.ts +6 -77
- package/dist/services/autostop-service.d.ts.map +1 -1
- package/dist/services/autostop-service.js +5 -212
- package/dist/services/autostop-service.js.map +1 -1
- package/dist/services/kill-switch-service.d.ts.map +1 -1
- package/dist/services/kill-switch-service.js +36 -21
- package/dist/services/kill-switch-service.js.map +1 -1
- package/dist/services/webhook-delivery-queue.d.ts +53 -0
- package/dist/services/webhook-delivery-queue.d.ts.map +1 -0
- package/dist/services/webhook-delivery-queue.js +118 -0
- package/dist/services/webhook-delivery-queue.js.map +1 -0
- package/dist/services/webhook-service.d.ts +46 -0
- package/dist/services/webhook-service.d.ts.map +1 -0
- package/dist/services/webhook-service.js +160 -0
- package/dist/services/webhook-service.js.map +1 -0
- package/package.json +5 -5
- package/public/admin/assets/{index-CBU6NfOH.js → index-RagPnRU1.js} +2 -2
- package/public/admin/index.html +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kill-switch-service.js","sourceRoot":"","sources":["../../src/services/kill-switch-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;
|
|
1
|
+
{"version":3,"file":"kill-switch-service.js","sourceRoot":"","sources":["../../src/services/kill-switch-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebhookDeliveryQueue: fire-and-forget delivery with HMAC-SHA256 signing and retry.
|
|
3
|
+
*
|
|
4
|
+
* Delivers webhook payloads to subscriber URLs with:
|
|
5
|
+
* - HMAC-SHA256 signature (X-WAIaaS-Signature header)
|
|
6
|
+
* - Exponential backoff retry (max 4 attempts: 0s, 1s, 2s, 4s)
|
|
7
|
+
* - 4xx immediate stop (client error, no retry)
|
|
8
|
+
* - 10s timeout per request
|
|
9
|
+
* - Per-attempt logging to webhook_logs table
|
|
10
|
+
*
|
|
11
|
+
* @see .planning/milestones/v30.0-phases/307/DESIGN-SPEC.md (OPS-04 section 5)
|
|
12
|
+
*/
|
|
13
|
+
import type { Database as SQLiteDatabase } from 'better-sqlite3';
|
|
14
|
+
export interface WebhookPayload {
|
|
15
|
+
id: string;
|
|
16
|
+
event: string;
|
|
17
|
+
timestamp: number;
|
|
18
|
+
data: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface WebhookDeliveryJob {
|
|
21
|
+
webhookId: string;
|
|
22
|
+
url: string;
|
|
23
|
+
secretEncrypted: string;
|
|
24
|
+
eventType: string;
|
|
25
|
+
payload: WebhookPayload;
|
|
26
|
+
deliveryId: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class WebhookDeliveryQueue {
|
|
29
|
+
private readonly sqlite;
|
|
30
|
+
private readonly getMasterPassword;
|
|
31
|
+
private readonly maxAttempts;
|
|
32
|
+
private readonly timeoutMs;
|
|
33
|
+
private readonly backoffMs;
|
|
34
|
+
constructor(sqlite: SQLiteDatabase, getMasterPassword: () => string);
|
|
35
|
+
/**
|
|
36
|
+
* Enqueue a delivery job (fire-and-forget).
|
|
37
|
+
* The delivery runs asynchronously and errors are caught internally.
|
|
38
|
+
*/
|
|
39
|
+
enqueue(job: WebhookDeliveryJob): void;
|
|
40
|
+
/**
|
|
41
|
+
* Deliver a webhook payload with retry logic.
|
|
42
|
+
*/
|
|
43
|
+
private deliver;
|
|
44
|
+
/**
|
|
45
|
+
* Produce HMAC-SHA256 signature in "sha256={hex}" format.
|
|
46
|
+
*/
|
|
47
|
+
sign(secret: string, body: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Log a single delivery attempt to webhook_logs.
|
|
50
|
+
*/
|
|
51
|
+
private logAttempt;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=webhook-delivery-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-delivery-queue.d.ts","sourceRoot":"","sources":["../../src/services/webhook-delivery-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQjE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,qBAAa,oBAAoB;IAM7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;gBAGhC,MAAM,EAAE,cAAc,EACtB,iBAAiB,EAAE,MAAM,MAAM;IAGlD;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI;IAMtC;;OAEG;YACW,OAAO;IAgErB;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI1C;;OAEG;IACH,OAAO,CAAC,UAAU;CA8BnB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebhookDeliveryQueue: fire-and-forget delivery with HMAC-SHA256 signing and retry.
|
|
3
|
+
*
|
|
4
|
+
* Delivers webhook payloads to subscriber URLs with:
|
|
5
|
+
* - HMAC-SHA256 signature (X-WAIaaS-Signature header)
|
|
6
|
+
* - Exponential backoff retry (max 4 attempts: 0s, 1s, 2s, 4s)
|
|
7
|
+
* - 4xx immediate stop (client error, no retry)
|
|
8
|
+
* - 10s timeout per request
|
|
9
|
+
* - Per-attempt logging to webhook_logs table
|
|
10
|
+
*
|
|
11
|
+
* @see .planning/milestones/v30.0-phases/307/DESIGN-SPEC.md (OPS-04 section 5)
|
|
12
|
+
*/
|
|
13
|
+
import { createHmac } from 'node:crypto';
|
|
14
|
+
import { decryptSettingValue } from '../infrastructure/settings/settings-crypto.js';
|
|
15
|
+
import { generateId } from '../infrastructure/database/id.js';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// WebhookDeliveryQueue
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
export class WebhookDeliveryQueue {
|
|
20
|
+
sqlite;
|
|
21
|
+
getMasterPassword;
|
|
22
|
+
maxAttempts = 4;
|
|
23
|
+
timeoutMs = 10_000;
|
|
24
|
+
backoffMs = [0, 1000, 2000, 4000];
|
|
25
|
+
constructor(sqlite, getMasterPassword) {
|
|
26
|
+
this.sqlite = sqlite;
|
|
27
|
+
this.getMasterPassword = getMasterPassword;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Enqueue a delivery job (fire-and-forget).
|
|
31
|
+
* The delivery runs asynchronously and errors are caught internally.
|
|
32
|
+
*/
|
|
33
|
+
enqueue(job) {
|
|
34
|
+
this.deliver(job, 1).catch((err) => {
|
|
35
|
+
console.error('[WebhookDeliveryQueue] unhandled delivery error:', err);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Deliver a webhook payload with retry logic.
|
|
40
|
+
*/
|
|
41
|
+
async deliver(job, attempt) {
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
let httpStatus = null;
|
|
44
|
+
let error = null;
|
|
45
|
+
try {
|
|
46
|
+
// Decrypt secret for HMAC signing
|
|
47
|
+
const secret = decryptSettingValue(job.secretEncrypted, this.getMasterPassword());
|
|
48
|
+
const body = JSON.stringify(job.payload);
|
|
49
|
+
const signature = this.sign(secret, body);
|
|
50
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
51
|
+
const headers = {
|
|
52
|
+
'Content-Type': 'application/json',
|
|
53
|
+
'X-WAIaaS-Signature': signature,
|
|
54
|
+
'X-WAIaaS-Event': job.eventType,
|
|
55
|
+
'X-WAIaaS-Delivery': job.deliveryId,
|
|
56
|
+
'X-WAIaaS-Timestamp': String(timestamp),
|
|
57
|
+
'User-Agent': 'WAIaaS-Webhook/1.0',
|
|
58
|
+
};
|
|
59
|
+
const response = await fetch(job.url, {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers,
|
|
62
|
+
body,
|
|
63
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
64
|
+
});
|
|
65
|
+
httpStatus = response.status;
|
|
66
|
+
const duration = Date.now() - startTime;
|
|
67
|
+
if (response.ok) {
|
|
68
|
+
// 2xx success
|
|
69
|
+
this.logAttempt(job.webhookId, job.eventType, 'success', httpStatus, attempt, null, duration);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (httpStatus >= 400 && httpStatus < 500) {
|
|
73
|
+
// 4xx client error -- no retry
|
|
74
|
+
error = `HTTP ${httpStatus}: client error`;
|
|
75
|
+
this.logAttempt(job.webhookId, job.eventType, 'failed', httpStatus, attempt, error, duration);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// 5xx server error -- retry
|
|
79
|
+
error = `HTTP ${httpStatus}: server error`;
|
|
80
|
+
this.logAttempt(job.webhookId, job.eventType, 'failed', httpStatus, attempt, error, duration);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
// Network error or timeout
|
|
84
|
+
const duration = Date.now() - startTime;
|
|
85
|
+
error = err instanceof Error ? err.message : String(err);
|
|
86
|
+
this.logAttempt(job.webhookId, job.eventType, 'failed', null, attempt, error, duration);
|
|
87
|
+
}
|
|
88
|
+
// Retry with backoff if attempts remain
|
|
89
|
+
if (attempt < this.maxAttempts) {
|
|
90
|
+
const delay = this.backoffMs[attempt] ?? 4000;
|
|
91
|
+
await new Promise((resolve) => {
|
|
92
|
+
setTimeout(() => resolve(), delay);
|
|
93
|
+
});
|
|
94
|
+
return this.deliver(job, attempt + 1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Produce HMAC-SHA256 signature in "sha256={hex}" format.
|
|
99
|
+
*/
|
|
100
|
+
sign(secret, body) {
|
|
101
|
+
return `sha256=${createHmac('sha256', secret).update(body, 'utf8').digest('hex')}`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Log a single delivery attempt to webhook_logs.
|
|
105
|
+
*/
|
|
106
|
+
logAttempt(webhookId, eventType, status, httpStatus, attempt, error, requestDuration) {
|
|
107
|
+
try {
|
|
108
|
+
this.sqlite
|
|
109
|
+
.prepare(`INSERT INTO webhook_logs (id, webhook_id, event_type, status, http_status, attempt, error, request_duration, created_at)
|
|
110
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
111
|
+
.run(generateId(), webhookId, eventType, status, httpStatus, attempt, error, requestDuration, Math.floor(Date.now() / 1000));
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.error('[WebhookDeliveryQueue] failed to log attempt:', err);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=webhook-delivery-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-delivery-queue.js","sourceRoot":"","sources":["../../src/services/webhook-delivery-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebhookService: dispatches events to registered webhooks.
|
|
3
|
+
*
|
|
4
|
+
* Queries enabled webhooks from DB, filters by subscribed events array,
|
|
5
|
+
* and enqueues delivery jobs to WebhookDeliveryQueue. Operates independently
|
|
6
|
+
* from NotificationService (different concerns: N URLs + HMAC vs single channel).
|
|
7
|
+
*
|
|
8
|
+
* EventBus listeners map internal events to webhook event types:
|
|
9
|
+
* - transaction:completed -> TX_CONFIRMED
|
|
10
|
+
* - transaction:failed -> TX_FAILED
|
|
11
|
+
* - wallet:activity -> TX_SUBMITTED / SESSION_CREATED / OWNER_REGISTERED
|
|
12
|
+
* - kill-switch:state-changed -> KILL_SWITCH_ACTIVATED / KILL_SWITCH_RECOVERED
|
|
13
|
+
* - transaction:incoming -> TX_SUBMITTED (incoming notification)
|
|
14
|
+
*
|
|
15
|
+
* Direct dispatch() calls handle: WALLET_CREATED, WALLET_SUSPENDED,
|
|
16
|
+
* SESSION_REVOKED, POLICY_DENIED, MASTER_AUTH_FAILED, AUTO_STOP_TRIGGERED,
|
|
17
|
+
* NOTIFICATION_TOTAL_FAILURE from their respective handlers.
|
|
18
|
+
*
|
|
19
|
+
* @see .planning/milestones/v30.0-phases/307/DESIGN-SPEC.md (OPS-04 section 7)
|
|
20
|
+
*/
|
|
21
|
+
import type { Database as SQLiteDatabase } from 'better-sqlite3';
|
|
22
|
+
import type { EventBus } from '@waiaas/core';
|
|
23
|
+
export declare class WebhookService {
|
|
24
|
+
private readonly sqlite;
|
|
25
|
+
private readonly queue;
|
|
26
|
+
private disposed;
|
|
27
|
+
readonly eventBus: EventBus;
|
|
28
|
+
constructor(sqlite: SQLiteDatabase, eventBus: EventBus, getMasterPassword: () => string);
|
|
29
|
+
/**
|
|
30
|
+
* Register EventBus listeners that map internal events to webhook event types.
|
|
31
|
+
*/
|
|
32
|
+
private registerEventBusListeners;
|
|
33
|
+
/**
|
|
34
|
+
* Dispatch an event to all matching enabled webhooks.
|
|
35
|
+
*
|
|
36
|
+
* @param eventType - The webhook event type (e.g., 'TX_CONFIRMED')
|
|
37
|
+
* @param data - Event-specific payload data
|
|
38
|
+
*/
|
|
39
|
+
dispatch(eventType: string, data: Record<string, unknown>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Mark service as disposed. Prevents further dispatching.
|
|
42
|
+
* EventBus listeners are cleaned up when daemon calls eventBus.removeAllListeners().
|
|
43
|
+
*/
|
|
44
|
+
destroy(): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=webhook-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-service.d.ts","sourceRoot":"","sources":["../../src/services/webhook-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AA2B7C,qBAAa,cAAc;IAMvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAGT,MAAM,EAAE,cAAc,EACvC,QAAQ,EAAE,QAAQ,EAClB,iBAAiB,EAAE,MAAM,MAAM;IAOjC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA8DjC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA6ChE;;;OAGG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebhookService: dispatches events to registered webhooks.
|
|
3
|
+
*
|
|
4
|
+
* Queries enabled webhooks from DB, filters by subscribed events array,
|
|
5
|
+
* and enqueues delivery jobs to WebhookDeliveryQueue. Operates independently
|
|
6
|
+
* from NotificationService (different concerns: N URLs + HMAC vs single channel).
|
|
7
|
+
*
|
|
8
|
+
* EventBus listeners map internal events to webhook event types:
|
|
9
|
+
* - transaction:completed -> TX_CONFIRMED
|
|
10
|
+
* - transaction:failed -> TX_FAILED
|
|
11
|
+
* - wallet:activity -> TX_SUBMITTED / SESSION_CREATED / OWNER_REGISTERED
|
|
12
|
+
* - kill-switch:state-changed -> KILL_SWITCH_ACTIVATED / KILL_SWITCH_RECOVERED
|
|
13
|
+
* - transaction:incoming -> TX_SUBMITTED (incoming notification)
|
|
14
|
+
*
|
|
15
|
+
* Direct dispatch() calls handle: WALLET_CREATED, WALLET_SUSPENDED,
|
|
16
|
+
* SESSION_REVOKED, POLICY_DENIED, MASTER_AUTH_FAILED, AUTO_STOP_TRIGGERED,
|
|
17
|
+
* NOTIFICATION_TOTAL_FAILURE from their respective handlers.
|
|
18
|
+
*
|
|
19
|
+
* @see .planning/milestones/v30.0-phases/307/DESIGN-SPEC.md (OPS-04 section 7)
|
|
20
|
+
*/
|
|
21
|
+
import { WebhookDeliveryQueue } from './webhook-delivery-queue.js';
|
|
22
|
+
import { generateId } from '../infrastructure/database/id.js';
|
|
23
|
+
/** Maps wallet:activity event names to webhook event types. */
|
|
24
|
+
const ACTIVITY_EVENT_MAP = {
|
|
25
|
+
TX_SUBMITTED: 'TX_SUBMITTED',
|
|
26
|
+
SESSION_CREATED: 'SESSION_CREATED',
|
|
27
|
+
OWNER_SET: 'OWNER_REGISTERED',
|
|
28
|
+
};
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// WebhookService
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
export class WebhookService {
|
|
33
|
+
sqlite;
|
|
34
|
+
queue;
|
|
35
|
+
disposed = false;
|
|
36
|
+
eventBus;
|
|
37
|
+
constructor(sqlite, eventBus, getMasterPassword) {
|
|
38
|
+
this.sqlite = sqlite;
|
|
39
|
+
this.eventBus = eventBus;
|
|
40
|
+
this.queue = new WebhookDeliveryQueue(sqlite, getMasterPassword);
|
|
41
|
+
this.registerEventBusListeners();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Register EventBus listeners that map internal events to webhook event types.
|
|
45
|
+
*/
|
|
46
|
+
registerEventBusListeners() {
|
|
47
|
+
// transaction:completed -> TX_CONFIRMED
|
|
48
|
+
this.eventBus.on('transaction:completed', (e) => {
|
|
49
|
+
this.dispatch('TX_CONFIRMED', {
|
|
50
|
+
txId: e.txId,
|
|
51
|
+
txHash: e.txHash,
|
|
52
|
+
walletId: e.walletId,
|
|
53
|
+
network: e.network,
|
|
54
|
+
type: e.type,
|
|
55
|
+
amount: e.amount,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
// transaction:failed -> TX_FAILED
|
|
59
|
+
this.eventBus.on('transaction:failed', (e) => {
|
|
60
|
+
this.dispatch('TX_FAILED', {
|
|
61
|
+
txId: e.txId,
|
|
62
|
+
error: e.error,
|
|
63
|
+
walletId: e.walletId,
|
|
64
|
+
network: e.network,
|
|
65
|
+
type: e.type,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// wallet:activity -> TX_SUBMITTED / SESSION_CREATED / OWNER_REGISTERED
|
|
69
|
+
this.eventBus.on('wallet:activity', (e) => {
|
|
70
|
+
const webhookEvent = ACTIVITY_EVENT_MAP[e.activity];
|
|
71
|
+
if (webhookEvent) {
|
|
72
|
+
this.dispatch(webhookEvent, {
|
|
73
|
+
walletId: e.walletId,
|
|
74
|
+
...(e.details ?? {}),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// kill-switch:state-changed -> KILL_SWITCH_ACTIVATED / KILL_SWITCH_RECOVERED
|
|
79
|
+
this.eventBus.on('kill-switch:state-changed', (e) => {
|
|
80
|
+
if (e.state === 'SUSPENDED') {
|
|
81
|
+
this.dispatch('KILL_SWITCH_ACTIVATED', {
|
|
82
|
+
activatedBy: e.activatedBy,
|
|
83
|
+
previousState: e.previousState,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else if (e.state === 'ACTIVE' && e.previousState !== 'ACTIVE') {
|
|
87
|
+
this.dispatch('KILL_SWITCH_RECOVERED', {
|
|
88
|
+
activatedBy: e.activatedBy,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// transaction:incoming -> TX_SUBMITTED (incoming notification)
|
|
93
|
+
this.eventBus.on('transaction:incoming', (e) => {
|
|
94
|
+
this.dispatch('TX_SUBMITTED', {
|
|
95
|
+
txHash: e.txHash,
|
|
96
|
+
fromAddress: e.fromAddress,
|
|
97
|
+
amount: e.amount,
|
|
98
|
+
walletId: e.walletId,
|
|
99
|
+
network: e.network,
|
|
100
|
+
status: e.status,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Dispatch an event to all matching enabled webhooks.
|
|
106
|
+
*
|
|
107
|
+
* @param eventType - The webhook event type (e.g., 'TX_CONFIRMED')
|
|
108
|
+
* @param data - Event-specific payload data
|
|
109
|
+
*/
|
|
110
|
+
dispatch(eventType, data) {
|
|
111
|
+
if (this.disposed)
|
|
112
|
+
return;
|
|
113
|
+
try {
|
|
114
|
+
// Query all enabled webhooks
|
|
115
|
+
const rows = this.sqlite
|
|
116
|
+
.prepare('SELECT id, url, secret_encrypted, events FROM webhooks WHERE enabled = 1')
|
|
117
|
+
.all();
|
|
118
|
+
for (const row of rows) {
|
|
119
|
+
try {
|
|
120
|
+
// Parse events filter
|
|
121
|
+
const subscribedEvents = JSON.parse(row.events);
|
|
122
|
+
// Empty array = wildcard (match all events)
|
|
123
|
+
if (subscribedEvents.length > 0 && !subscribedEvents.includes(eventType)) {
|
|
124
|
+
continue; // Skip -- event not subscribed
|
|
125
|
+
}
|
|
126
|
+
const deliveryId = generateId();
|
|
127
|
+
const payload = {
|
|
128
|
+
id: deliveryId,
|
|
129
|
+
event: eventType,
|
|
130
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
131
|
+
data,
|
|
132
|
+
};
|
|
133
|
+
this.queue.enqueue({
|
|
134
|
+
webhookId: row.id,
|
|
135
|
+
url: row.url,
|
|
136
|
+
secretEncrypted: row.secret_encrypted,
|
|
137
|
+
eventType,
|
|
138
|
+
payload,
|
|
139
|
+
deliveryId,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
// One webhook error shouldn't block others
|
|
144
|
+
console.error(`[WebhookService] dispatch error for webhook ${row.id}:`, err);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
console.error('[WebhookService] dispatch query error:', err);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Mark service as disposed. Prevents further dispatching.
|
|
154
|
+
* EventBus listeners are cleaned up when daemon calls eventBus.removeAllListeners().
|
|
155
|
+
*/
|
|
156
|
+
destroy() {
|
|
157
|
+
this.disposed = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=webhook-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-service.js","sourceRoot":"","sources":["../../src/services/webhook-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@waiaas/daemon",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0-rc",
|
|
4
4
|
"description": "WAIaaS daemon - self-hosted wallet service for AI agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -47,10 +47,10 @@
|
|
|
47
47
|
"uuidv7": "^1.0.2",
|
|
48
48
|
"viem": "^2.21.0",
|
|
49
49
|
"zod": "^3.24.0",
|
|
50
|
-
"@waiaas/
|
|
51
|
-
"@waiaas/
|
|
52
|
-
"@waiaas/adapter-
|
|
53
|
-
"@waiaas/core": "2.
|
|
50
|
+
"@waiaas/adapter-solana": "2.10.0-rc",
|
|
51
|
+
"@waiaas/actions": "2.10.0-rc",
|
|
52
|
+
"@waiaas/adapter-evm": "2.10.0-rc",
|
|
53
|
+
"@waiaas/core": "2.10.0-rc"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/better-sqlite3": "^7.6.0",
|