@cbxss/tack-service 1.0.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/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +284 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Server } from "node:http";
|
|
2
|
+
import { type TackManifest, type TackRuntime } from "@cbxss/tack-core";
|
|
3
|
+
import { type CodeRuntime, type CreateExecutionEngineOptions, type OperationPolicy, type ToolAuditEvent } from "@cbxss/tack-codemode";
|
|
4
|
+
export interface ServiceRateLimit {
|
|
5
|
+
readonly requests: number;
|
|
6
|
+
readonly windowMs: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ServiceUser {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly token: string;
|
|
11
|
+
readonly allowedOperations?: readonly string[] | undefined;
|
|
12
|
+
readonly deniedOperations?: readonly string[] | undefined;
|
|
13
|
+
readonly rateLimit?: ServiceRateLimit | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface CreateTackHttpServiceOptions {
|
|
16
|
+
readonly manifest: TackManifest;
|
|
17
|
+
readonly runtime: TackRuntime;
|
|
18
|
+
readonly codeRuntime: CodeRuntime;
|
|
19
|
+
readonly users: readonly ServiceUser[];
|
|
20
|
+
readonly policy?: OperationPolicy | undefined;
|
|
21
|
+
readonly maxRequestBytes?: number | undefined;
|
|
22
|
+
readonly rateLimit?: ServiceRateLimit | undefined;
|
|
23
|
+
readonly onAuditEvent?: ((event: ServiceAuditEvent) => void | Promise<void>) | undefined;
|
|
24
|
+
readonly typecheck?: CreateExecutionEngineOptions["typecheck"];
|
|
25
|
+
}
|
|
26
|
+
export interface TackHttpListenOptions {
|
|
27
|
+
readonly host?: string | undefined;
|
|
28
|
+
readonly port?: number | undefined;
|
|
29
|
+
}
|
|
30
|
+
export interface TackHttpServiceHandle {
|
|
31
|
+
readonly server: Server;
|
|
32
|
+
readonly url: string;
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export type ServiceAuditEvent = ToolAuditEvent & {
|
|
36
|
+
readonly userId?: string | undefined;
|
|
37
|
+
};
|
|
38
|
+
export declare function listenTackHttpService(options: CreateTackHttpServiceOptions, listen?: TackHttpListenOptions): Promise<TackHttpServiceHandle>;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAEjG,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,CAAC;AAuDF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,EACrC,MAAM,GAAE,qBAA0B,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAkBhC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { timingSafeEqual } from "node:crypto";
|
|
3
|
+
import { ownField, sanitizeData } from "@cbxss/tack-core";
|
|
4
|
+
import { createExecutionEngine, searchOperations } from "@cbxss/tack-codemode";
|
|
5
|
+
const DEFAULT_MAX_REQUEST_BYTES = 1_000_000;
|
|
6
|
+
function createTackHttpService(options) {
|
|
7
|
+
const context = normalizeServiceContext(options);
|
|
8
|
+
if (context.users.length === 0) {
|
|
9
|
+
throw new Error("Tack HTTP service requires at least one configured user token");
|
|
10
|
+
}
|
|
11
|
+
const isolation = context.codeRuntime.isolation;
|
|
12
|
+
if (isolation === "none") {
|
|
13
|
+
const name = context.codeRuntime.name;
|
|
14
|
+
throw new Error(`Tack HTTP service refuses code runtime "${typeof name === "string" ? name : "unknown"}" because it has no isolation. ` +
|
|
15
|
+
"Use the quickjs or workerd runtime for exposed services.");
|
|
16
|
+
}
|
|
17
|
+
const limiter = createRateLimiter(normalizeRateLimit(ownField(options, "rateLimit")));
|
|
18
|
+
return createServer((request, response) => {
|
|
19
|
+
void handleRequest(context, limiter, request, response);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function listenTackHttpService(options, listen = {}) {
|
|
23
|
+
const server = createTackHttpService(options);
|
|
24
|
+
const host = ownField(listen, "host") ?? "127.0.0.1";
|
|
25
|
+
const port = ownField(listen, "port") ?? 8787;
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
server.once("error", reject);
|
|
28
|
+
server.listen(port, host, () => {
|
|
29
|
+
server.off("error", reject);
|
|
30
|
+
const address = server.address();
|
|
31
|
+
const actualPort = typeof address === "object" && address ? address.port : port;
|
|
32
|
+
resolve({
|
|
33
|
+
server,
|
|
34
|
+
url: `http://${host}:${actualPort}`,
|
|
35
|
+
close: () => closeServer(server)
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async function handleRequest(context, limiter, request, response) {
|
|
41
|
+
if (request.method === "GET" && request.url === "/health") {
|
|
42
|
+
writeJson(response, 200, { ok: true });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (request.method !== "POST") {
|
|
46
|
+
writeJson(response, 405, { error: "method_not_allowed" });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const user = authenticate(context.users, request.headers["authorization"]);
|
|
50
|
+
if (!user) {
|
|
51
|
+
writeJson(response, 401, { error: "unauthorized" });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const rate = limiter.check(user);
|
|
55
|
+
if (!rate.allowed) {
|
|
56
|
+
response.setHeader("retry-after", String(Math.ceil(rate.retryAfterMs / 1000)));
|
|
57
|
+
writeJson(response, 429, { error: "rate_limited", retryAfterMs: rate.retryAfterMs });
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const body = await readBody(request, context.maxRequestBytes);
|
|
62
|
+
const policy = mergePolicy(context.policy, user.policy);
|
|
63
|
+
const onAuditEvent = createUserAuditSink(user.id, context.onAuditEvent);
|
|
64
|
+
if (request.url === "/search") {
|
|
65
|
+
writeJson(response, 200, searchOperations(context.manifest, normalizeSearchBody(body), policy));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (request.url === "/execute") {
|
|
69
|
+
const code = readString(body, "code");
|
|
70
|
+
if (!code) {
|
|
71
|
+
writeJson(response, 400, { error: "code_required" });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const engine = createExecutionEngine({
|
|
75
|
+
manifest: context.manifest,
|
|
76
|
+
runtime: context.runtime,
|
|
77
|
+
codeRuntime: context.codeRuntime,
|
|
78
|
+
...(policy ? { policy } : {}),
|
|
79
|
+
...(onAuditEvent ? { onAuditEvent } : {}),
|
|
80
|
+
...(context.typecheck ? { typecheck: context.typecheck } : {})
|
|
81
|
+
});
|
|
82
|
+
const result = await engine.execute(code);
|
|
83
|
+
writeJson(response, result.ok ? 200 : 400, result);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
writeJson(response, 404, { error: "not_found" });
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error instanceof RequestBodyTooLargeError) {
|
|
90
|
+
writeJson(response, 413, {
|
|
91
|
+
error: "request_too_large",
|
|
92
|
+
maxRequestBytes: error.maxBytes
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
writeJson(response, 400, {
|
|
97
|
+
error: "bad_request",
|
|
98
|
+
message: error instanceof Error ? error.message : String(error)
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function normalizeServiceContext(options) {
|
|
103
|
+
const policy = ownField(options, "policy");
|
|
104
|
+
const onAuditEvent = ownField(options, "onAuditEvent");
|
|
105
|
+
const typecheck = ownField(options, "typecheck");
|
|
106
|
+
return {
|
|
107
|
+
manifest: ownField(options, "manifest"),
|
|
108
|
+
runtime: ownField(options, "runtime"),
|
|
109
|
+
codeRuntime: ownField(options, "codeRuntime"),
|
|
110
|
+
users: optionUsers(options).map(normalizeServiceUser),
|
|
111
|
+
...(policy ? { policy } : {}),
|
|
112
|
+
maxRequestBytes: ownField(options, "maxRequestBytes") ?? DEFAULT_MAX_REQUEST_BYTES,
|
|
113
|
+
...(onAuditEvent ? { onAuditEvent } : {}),
|
|
114
|
+
...(typecheck ? { typecheck } : {})
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function normalizeServiceUser(user) {
|
|
118
|
+
const { id, token } = user;
|
|
119
|
+
const allowedOperations = stringArray(user.allowedOperations);
|
|
120
|
+
const deniedOperations = stringArray(user.deniedOperations);
|
|
121
|
+
const policy = mergePolicy(undefined, {
|
|
122
|
+
...(allowedOperations ? { allowedOperations } : {}),
|
|
123
|
+
...(deniedOperations ? { deniedOperations } : {})
|
|
124
|
+
});
|
|
125
|
+
const rateLimit = normalizeRateLimit(user.rateLimit);
|
|
126
|
+
return {
|
|
127
|
+
id: typeof id === "string" ? id : "",
|
|
128
|
+
...(typeof token === "string" ? { token } : {}),
|
|
129
|
+
...(policy ? { policy } : {}),
|
|
130
|
+
...(rateLimit ? { rateLimit } : {})
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function authenticate(users, authorization) {
|
|
134
|
+
const header = Array.isArray(authorization) ? authorization[0] : authorization;
|
|
135
|
+
const token = header?.startsWith("Bearer ") ? header.slice("Bearer ".length) : undefined;
|
|
136
|
+
if (!token) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
for (const user of users) {
|
|
140
|
+
if (typeof user.token === "string" && safeEqual(token, user.token)) {
|
|
141
|
+
return {
|
|
142
|
+
id: user.id,
|
|
143
|
+
...(user.policy ? { policy: user.policy } : {}),
|
|
144
|
+
...(user.rateLimit ? { rateLimit: user.rateLimit } : {})
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
function safeEqual(left, right) {
|
|
151
|
+
const leftBuffer = Buffer.from(left);
|
|
152
|
+
const rightBuffer = Buffer.from(right);
|
|
153
|
+
return leftBuffer.length === rightBuffer.length && timingSafeEqual(leftBuffer, rightBuffer);
|
|
154
|
+
}
|
|
155
|
+
function createRateLimiter(defaultLimit) {
|
|
156
|
+
const windows = new Map();
|
|
157
|
+
return {
|
|
158
|
+
check(user) {
|
|
159
|
+
const limit = user.rateLimit ?? defaultLimit;
|
|
160
|
+
if (!limit) {
|
|
161
|
+
return { allowed: true };
|
|
162
|
+
}
|
|
163
|
+
const { requests, windowMs } = limit;
|
|
164
|
+
const now = Date.now();
|
|
165
|
+
const window = windows.get(user.id);
|
|
166
|
+
if (!window || now >= window.resetAt) {
|
|
167
|
+
windows.set(user.id, { count: 1, resetAt: now + windowMs });
|
|
168
|
+
return { allowed: true };
|
|
169
|
+
}
|
|
170
|
+
if (window.count >= requests) {
|
|
171
|
+
return { allowed: false, retryAfterMs: Math.max(0, window.resetAt - now) };
|
|
172
|
+
}
|
|
173
|
+
window.count += 1;
|
|
174
|
+
return { allowed: true };
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function mergePolicy(base, user) {
|
|
179
|
+
if (!base && !user) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
if (base && user) {
|
|
183
|
+
return { allOf: [base, user] };
|
|
184
|
+
}
|
|
185
|
+
return base ?? user;
|
|
186
|
+
}
|
|
187
|
+
function normalizeRateLimit(value) {
|
|
188
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
const record = value;
|
|
192
|
+
const requests = record["requests"];
|
|
193
|
+
const windowMs = record["windowMs"];
|
|
194
|
+
return typeof requests === "number" && typeof windowMs === "number"
|
|
195
|
+
? { requests, windowMs }
|
|
196
|
+
: undefined;
|
|
197
|
+
}
|
|
198
|
+
function stringArray(value) {
|
|
199
|
+
if (!Array.isArray(value)) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
const strings = value.filter((entry) => typeof entry === "string");
|
|
203
|
+
return strings.length > 0 ? strings : undefined;
|
|
204
|
+
}
|
|
205
|
+
function createUserAuditSink(userId, sink) {
|
|
206
|
+
if (!sink) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
return async (event) => {
|
|
210
|
+
await sink({ ...event, userId });
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function normalizeSearchBody(input) {
|
|
214
|
+
return typeof input === "object" && input !== null && !Array.isArray(input)
|
|
215
|
+
? input
|
|
216
|
+
: { query: "" };
|
|
217
|
+
}
|
|
218
|
+
function readString(input, key) {
|
|
219
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
const value = input[key];
|
|
223
|
+
return typeof value === "string" ? value : undefined;
|
|
224
|
+
}
|
|
225
|
+
function readBody(request, maxBytes) {
|
|
226
|
+
return new Promise((resolve, reject) => {
|
|
227
|
+
let body = "";
|
|
228
|
+
let bytes = 0;
|
|
229
|
+
let settled = false;
|
|
230
|
+
request.setEncoding("utf8");
|
|
231
|
+
request.on("data", (chunk) => {
|
|
232
|
+
if (settled) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
bytes += Buffer.byteLength(chunk);
|
|
236
|
+
if (bytes > maxBytes) {
|
|
237
|
+
settled = true;
|
|
238
|
+
reject(new RequestBodyTooLargeError(maxBytes));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
body += chunk;
|
|
242
|
+
});
|
|
243
|
+
request.on("error", (error) => {
|
|
244
|
+
if (!settled) {
|
|
245
|
+
settled = true;
|
|
246
|
+
reject(error);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
request.on("end", () => {
|
|
250
|
+
if (settled) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
settled = true;
|
|
254
|
+
try {
|
|
255
|
+
resolve(sanitizeData(body.length > 0 ? JSON.parse(body) : {}, {}));
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
reject(error);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
class RequestBodyTooLargeError extends Error {
|
|
264
|
+
maxBytes;
|
|
265
|
+
constructor(maxBytes) {
|
|
266
|
+
super(`Request body exceeded ${maxBytes} bytes`);
|
|
267
|
+
this.maxBytes = maxBytes;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function writeJson(response, status, body) {
|
|
271
|
+
response.writeHead(status, { "content-type": "application/json" });
|
|
272
|
+
response.end(JSON.stringify(body));
|
|
273
|
+
}
|
|
274
|
+
function closeServer(server) {
|
|
275
|
+
return new Promise((resolve) => {
|
|
276
|
+
server.closeAllConnections();
|
|
277
|
+
server.close(() => resolve());
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
function optionUsers(options) {
|
|
281
|
+
const users = sanitizeData(ownField(options, "users"), {});
|
|
282
|
+
return Array.isArray(users) ? users : [];
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cbxss/tack-service",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"import": "./dist/index.js"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
16
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
17
|
+
"test": "vitest run --passWithNoTests"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@cbxss/tack-codemode": "1.0.0",
|
|
21
|
+
"@cbxss/tack-core": "1.0.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@cbxss/tack-runtime-quickjs": "1.0.0",
|
|
25
|
+
"@cbxss/tack-runtime-workerd": "1.0.0",
|
|
26
|
+
"typescript": "^7.0.2",
|
|
27
|
+
"vitest": "^4.1.10"
|
|
28
|
+
},
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/shrimp-software/tack.git"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/shrimp-software/tack#readme",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/shrimp-software/tack/issues"
|
|
37
|
+
}
|
|
38
|
+
}
|