@chatcops/server 0.4.0 → 0.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/README.md +35 -7
- package/dist/adapters/ai-sdk.d.ts +12 -0
- package/dist/adapters/ai-sdk.d.ts.map +1 -0
- package/dist/adapters/ai-sdk.js +27 -0
- package/dist/adapters/ai-sdk.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +3 -1
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +11 -58
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/express.d.ts +6 -2
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +109 -26
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/vercel.d.ts.map +1 -1
- package/dist/adapters/vercel.js +7 -60
- package/dist/adapters/vercel.js.map +1 -1
- package/dist/client-ip.d.ts +36 -0
- package/dist/client-ip.d.ts.map +1 -0
- package/dist/client-ip.js +62 -0
- package/dist/client-ip.js.map +1 -0
- package/dist/config.d.ts +110 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/handler.d.ts +53 -2
- package/dist/handler.d.ts.map +1 -1
- package/dist/handler.js +410 -127
- package/dist/handler.js.map +1 -1
- package/dist/http.d.ts +66 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +262 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/rate-limit.d.ts +5 -0
- package/dist/rate-limit.d.ts.map +1 -1
- package/dist/rate-limit.js +5 -0
- package/dist/rate-limit.js.map +1 -1
- package/dist/security/origin-policy.d.ts +19 -0
- package/dist/security/origin-policy.d.ts.map +1 -0
- package/dist/security/origin-policy.js +58 -0
- package/dist/security/origin-policy.js.map +1 -0
- package/dist/security/origin.d.ts +5 -0
- package/dist/security/origin.d.ts.map +1 -0
- package/dist/security/origin.js +47 -0
- package/dist/security/origin.js.map +1 -0
- package/dist/security/session-token.d.ts +65 -0
- package/dist/security/session-token.d.ts.map +1 -0
- package/dist/security/session-token.js +338 -0
- package/dist/security/session-token.js.map +1 -0
- package/dist/security/sessions.d.ts +49 -0
- package/dist/security/sessions.d.ts.map +1 -0
- package/dist/security/sessions.js +159 -0
- package/dist/security/sessions.js.map +1 -0
- package/dist/security/startup-checks.d.ts +44 -0
- package/dist/security/startup-checks.d.ts.map +1 -0
- package/dist/security/startup-checks.js +134 -0
- package/dist/security/startup-checks.js.map +1 -0
- package/dist/security/turnstile.d.ts +24 -0
- package/dist/security/turnstile.d.ts.map +1 -0
- package/dist/security/turnstile.js +93 -0
- package/dist/security/turnstile.js.map +1 -0
- package/dist/visitor-context.d.ts +20 -0
- package/dist/visitor-context.d.ts.map +1 -0
- package/dist/visitor-context.js +60 -0
- package/dist/visitor-context.js.map +1 -0
- package/dist/webhook.d.ts +48 -2
- package/dist/webhook.d.ts.map +1 -1
- package/dist/webhook.js +159 -31
- package/dist/webhook.js.map +1 -1
- package/package.json +22 -5
package/dist/webhook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,uFAAuF;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AACvD,6EAA6E;AAC7E,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAKnD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,UAAQ,GAAG,GAAG,CAiBrF;AAqCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa,EAAE,EAAE,SAAS,GAAE,MAAmC;IAQ9E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB7C,IAAI;CA4CnB;AAoBD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,SAAgC,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7H;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBnB"}
|
package/dist/webhook.js
CHANGED
|
@@ -1,59 +1,187 @@
|
|
|
1
1
|
export const DEFAULT_WEBHOOK_TIMEOUT_MS = 5000;
|
|
2
|
+
export const SIGNATURE_HEADER = 'X-ChatCops-Signature';
|
|
3
|
+
/** Signatures older than this are rejected by `verifyWebhook` by default. */
|
|
4
|
+
export const DEFAULT_SIGNATURE_TOLERANCE_SEC = 300;
|
|
5
|
+
const MAX_ATTEMPTS = 3;
|
|
6
|
+
const MAX_RETRY_AFTER_MS = 10_000;
|
|
7
|
+
/**
|
|
8
|
+
* Throws when a webhook URL isn't safe to call from a server: anything other
|
|
9
|
+
* than https, and hosts on loopback, private or link-local networks (which
|
|
10
|
+
* includes cloud metadata endpoints such as 169.254.169.254). Set
|
|
11
|
+
* `allowPrivateNetwork: true` on the webhook to call one of those on purpose,
|
|
12
|
+
* for example a receiver on localhost during development.
|
|
13
|
+
*
|
|
14
|
+
* Only literal addresses are checked; a hostname that resolves to a private
|
|
15
|
+
* address isn't. Hosted deployments should also block private ranges at the
|
|
16
|
+
* network level.
|
|
17
|
+
*/
|
|
18
|
+
export function assertSafeWebhookUrl(rawUrl, allowPrivateNetwork = false) {
|
|
19
|
+
const url = new URL(rawUrl); // throws on invalid URL
|
|
20
|
+
if (allowPrivateNetwork) {
|
|
21
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:') {
|
|
22
|
+
throw new Error(`Webhook URL must use https or http: ${rawUrl}`);
|
|
23
|
+
}
|
|
24
|
+
return url;
|
|
25
|
+
}
|
|
26
|
+
if (url.protocol !== 'https:') {
|
|
27
|
+
throw new Error(`Webhook URL must use https: ${rawUrl}. Set allowPrivateNetwork: true for a local http receiver.`);
|
|
28
|
+
}
|
|
29
|
+
if (isPrivateHost(url.hostname)) {
|
|
30
|
+
throw new Error(`Webhook URL points at a private or local address: ${rawUrl}. Set allowPrivateNetwork: true if that's intended.`);
|
|
31
|
+
}
|
|
32
|
+
return url;
|
|
33
|
+
}
|
|
34
|
+
function isPrivateHost(hostname) {
|
|
35
|
+
const host = hostname.replace(/^\[|\]$/g, '').toLowerCase();
|
|
36
|
+
if (host === 'localhost' || host.endsWith('.localhost') || host.endsWith('.local') || host.endsWith('.internal')) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
const v4 = host.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
|
|
40
|
+
if (v4) {
|
|
41
|
+
const [a, b] = [Number(v4[1]), Number(v4[2])];
|
|
42
|
+
return (a === 0 || a === 10 || a === 127 ||
|
|
43
|
+
(a === 100 && b >= 64 && b <= 127) || // carrier-grade NAT
|
|
44
|
+
(a === 169 && b === 254) || // link-local, cloud metadata
|
|
45
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
46
|
+
(a === 192 && b === 168) ||
|
|
47
|
+
a >= 224 // multicast and reserved
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
if (host.includes(':')) {
|
|
51
|
+
if (host === '::' || host === '::1')
|
|
52
|
+
return true;
|
|
53
|
+
// IPv4-mapped addresses. URL parsing turns ::ffff:10.0.0.1 into ::ffff:a00:1.
|
|
54
|
+
const mappedDotted = host.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);
|
|
55
|
+
if (mappedDotted)
|
|
56
|
+
return isPrivateHost(mappedDotted[1]);
|
|
57
|
+
const mappedHex = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
|
|
58
|
+
if (mappedHex) {
|
|
59
|
+
const [high, low] = [parseInt(mappedHex[1], 16), parseInt(mappedHex[2], 16)];
|
|
60
|
+
return isPrivateHost(`${high >> 8}.${high & 255}.${low >> 8}.${low & 255}`);
|
|
61
|
+
}
|
|
62
|
+
return /^(fc|fd|fe8|fe9|fea|feb)/.test(host); // unique local, link-local
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
2
66
|
export class WebhookDispatcher {
|
|
3
67
|
configs;
|
|
4
|
-
maxRetries = 3;
|
|
5
68
|
timeoutMs;
|
|
6
69
|
constructor(configs, timeoutMs = DEFAULT_WEBHOOK_TIMEOUT_MS) {
|
|
7
70
|
for (const config of configs) {
|
|
8
|
-
|
|
71
|
+
assertSafeWebhookUrl(config.url, config.allowPrivateNetwork);
|
|
9
72
|
}
|
|
10
73
|
this.configs = configs;
|
|
11
74
|
this.timeoutMs = timeoutMs;
|
|
12
75
|
}
|
|
13
76
|
async dispatch(event, data) {
|
|
14
77
|
const matching = this.configs.filter((c) => c.events.includes(event) || c.events.includes('*'));
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
78
|
+
if (matching.length === 0)
|
|
79
|
+
return;
|
|
80
|
+
const created = Date.now();
|
|
81
|
+
const envelope = {
|
|
82
|
+
id: `evt_${crypto.randomUUID()}`,
|
|
83
|
+
type: event,
|
|
84
|
+
created,
|
|
20
85
|
data,
|
|
21
|
-
|
|
86
|
+
event,
|
|
87
|
+
timestamp: created,
|
|
22
88
|
};
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
89
|
+
const body = JSON.stringify(envelope);
|
|
90
|
+
await Promise.allSettled(matching.map((config) => this.send(config, envelope, body)));
|
|
91
|
+
}
|
|
92
|
+
async send(config, envelope, body) {
|
|
93
|
+
let lastProblem = '';
|
|
94
|
+
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
|
|
95
|
+
let retryAfterMs;
|
|
27
96
|
try {
|
|
97
|
+
const headers = {
|
|
98
|
+
'Content-Type': 'application/json',
|
|
99
|
+
'X-ChatCops-Event': envelope.type,
|
|
100
|
+
'X-ChatCops-Event-Id': envelope.id,
|
|
101
|
+
};
|
|
102
|
+
if (config.secret) {
|
|
103
|
+
headers[SIGNATURE_HEADER] = await signWebhook(body, config.secret);
|
|
104
|
+
}
|
|
28
105
|
const response = await fetch(config.url, {
|
|
29
106
|
method: 'POST',
|
|
30
|
-
headers
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
body: JSON.stringify(payload),
|
|
107
|
+
headers,
|
|
108
|
+
body,
|
|
109
|
+
// A redirect could point anywhere, including a private address.
|
|
110
|
+
redirect: 'manual',
|
|
35
111
|
signal: AbortSignal.timeout(this.timeoutMs),
|
|
36
112
|
});
|
|
37
113
|
if (response.ok)
|
|
38
114
|
return;
|
|
39
|
-
|
|
40
|
-
|
|
115
|
+
lastProblem = `HTTP ${response.status}`;
|
|
116
|
+
const retryable = response.status === 429 || response.status >= 500;
|
|
117
|
+
if (!retryable)
|
|
118
|
+
break;
|
|
119
|
+
retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));
|
|
41
120
|
}
|
|
42
|
-
catch {
|
|
43
|
-
|
|
121
|
+
catch (error) {
|
|
122
|
+
lastProblem = error instanceof Error ? error.name : 'network error';
|
|
44
123
|
}
|
|
45
|
-
if (attempt <
|
|
46
|
-
await new Promise((r) => setTimeout(r,
|
|
124
|
+
if (attempt < MAX_ATTEMPTS) {
|
|
125
|
+
await new Promise((r) => setTimeout(r, retryAfterMs ?? 2 ** (attempt - 1) * 1000));
|
|
47
126
|
}
|
|
48
127
|
}
|
|
128
|
+
// Never log the body or the secret; they can hold lead details.
|
|
129
|
+
console.error(`[chatcops] Webhook delivery failed: ${envelope.type} (${envelope.id}) to ${new URL(config.url).origin}: ${lastProblem}`);
|
|
49
130
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
131
|
+
}
|
|
132
|
+
function parseRetryAfter(value) {
|
|
133
|
+
if (!value)
|
|
134
|
+
return undefined;
|
|
135
|
+
const seconds = Number(value);
|
|
136
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
137
|
+
return undefined;
|
|
138
|
+
return Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);
|
|
139
|
+
}
|
|
140
|
+
async function hmacHex(secret, message) {
|
|
141
|
+
const encoder = new TextEncoder();
|
|
142
|
+
const key = await crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, [
|
|
143
|
+
'sign',
|
|
144
|
+
]);
|
|
145
|
+
const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(message));
|
|
146
|
+
return Array.from(new Uint8Array(signature))
|
|
147
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
148
|
+
.join('');
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Builds the signature header value for a raw body:
|
|
152
|
+
* `t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<body>">`.
|
|
153
|
+
*/
|
|
154
|
+
export async function signWebhook(body, secret, timestampSec = Math.floor(Date.now() / 1000)) {
|
|
155
|
+
return `t=${timestampSec},v1=${await hmacHex(secret, `${timestampSec}.${body}`)}`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Checks a delivery on the receiving side. Pass the raw request body exactly
|
|
159
|
+
* as received (not re-serialized JSON) and the `X-ChatCops-Signature` header.
|
|
160
|
+
* Returns false for a bad signature or one older than `toleranceSec`.
|
|
161
|
+
*/
|
|
162
|
+
export async function verifyWebhook(options) {
|
|
163
|
+
const { body, signature, secret, toleranceSec = DEFAULT_SIGNATURE_TOLERANCE_SEC } = options;
|
|
164
|
+
if (!signature)
|
|
165
|
+
return false;
|
|
166
|
+
const parts = Object.fromEntries(signature.split(',').map((part) => {
|
|
167
|
+
const index = part.indexOf('=');
|
|
168
|
+
return [part.slice(0, index).trim(), part.slice(index + 1).trim()];
|
|
169
|
+
}));
|
|
170
|
+
const timestamp = Number(parts.t);
|
|
171
|
+
if (!Number.isInteger(timestamp) || !parts.v1)
|
|
172
|
+
return false;
|
|
173
|
+
const nowSec = Math.floor((options.now ?? Date.now()) / 1000);
|
|
174
|
+
if (Math.abs(nowSec - timestamp) > toleranceSec)
|
|
175
|
+
return false;
|
|
176
|
+
const expected = await hmacHex(secret, `${timestamp}.${body}`);
|
|
177
|
+
return constantTimeEqual(expected, parts.v1);
|
|
178
|
+
}
|
|
179
|
+
function constantTimeEqual(a, b) {
|
|
180
|
+
if (a.length !== b.length)
|
|
181
|
+
return false;
|
|
182
|
+
let diff = 0;
|
|
183
|
+
for (let i = 0; i < a.length; i++)
|
|
184
|
+
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
185
|
+
return diff === 0;
|
|
58
186
|
}
|
|
59
187
|
//# sourceMappingURL=webhook.js.map
|
package/dist/webhook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chatcops/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Server-side handler and adapters for ChatCops",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"chatcops",
|
|
7
|
+
"ai",
|
|
8
|
+
"chatbot",
|
|
9
|
+
"llm",
|
|
10
|
+
"sse",
|
|
11
|
+
"express",
|
|
12
|
+
"vercel",
|
|
13
|
+
"cloudflare-workers"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://chat.codercops.com",
|
|
16
|
+
"bugs": "https://github.com/codercops/chatcops/issues",
|
|
5
17
|
"type": "module",
|
|
6
18
|
"main": "dist/index.js",
|
|
7
19
|
"types": "dist/index.d.ts",
|
|
@@ -28,7 +40,7 @@
|
|
|
28
40
|
],
|
|
29
41
|
"dependencies": {
|
|
30
42
|
"zod": "^3.24.0",
|
|
31
|
-
"@chatcops/core": "0.
|
|
43
|
+
"@chatcops/core": "0.5.0"
|
|
32
44
|
},
|
|
33
45
|
"peerDependencies": {
|
|
34
46
|
"express": "^4.0.0 || ^5.0.0"
|
|
@@ -39,19 +51,24 @@
|
|
|
39
51
|
}
|
|
40
52
|
},
|
|
41
53
|
"devDependencies": {
|
|
54
|
+
"@types/express": "^5.0.0",
|
|
55
|
+
"ai": "7.0.122",
|
|
42
56
|
"typescript": "^5.7.0",
|
|
43
|
-
"vitest": "^4.1.11"
|
|
44
|
-
"@types/express": "^5.0.0"
|
|
57
|
+
"vitest": "^4.1.11"
|
|
45
58
|
},
|
|
46
59
|
"repository": {
|
|
47
60
|
"type": "git",
|
|
48
|
-
"url": "https://github.com/codercops/chatcops",
|
|
61
|
+
"url": "git+https://github.com/codercops/chatcops.git",
|
|
49
62
|
"directory": "packages/server"
|
|
50
63
|
},
|
|
51
64
|
"publishConfig": {
|
|
52
65
|
"access": "public"
|
|
53
66
|
},
|
|
54
67
|
"license": "MIT",
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=22"
|
|
70
|
+
},
|
|
71
|
+
"sideEffects": false,
|
|
55
72
|
"scripts": {
|
|
56
73
|
"build": "tsc",
|
|
57
74
|
"typecheck": "tsc --noEmit",
|