@anip-dev/express 0.11.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 ADDED
@@ -0,0 +1,15 @@
1
+ # @anip-dev/express
2
+
3
+ ANIP Express bindings — mount an ANIPService as HTTP routes
4
+
5
+ Part of the [ANIP](https://github.com/anip-protocol/anip) protocol ecosystem.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @anip-dev/express
11
+ ```
12
+
13
+ ## Documentation
14
+
15
+ See the [ANIP repository](https://github.com/anip-protocol/anip) for full documentation.
@@ -0,0 +1,2 @@
1
+ export { mountAnip } from "./routes.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { mountAnip } from "./routes.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Express } from "express";
2
+ import type { ANIPService } from "@anip-dev/service";
3
+ export declare function mountAnip(app: Express, service: ANIPService, opts?: {
4
+ prefix?: string;
5
+ healthEndpoint?: boolean;
6
+ }): Promise<{
7
+ shutdown: () => Promise<void>;
8
+ stop: () => void;
9
+ }>;
10
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GACnD,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAmM9D"}
package/dist/routes.js ADDED
@@ -0,0 +1,334 @@
1
+ import express, { Router } from "express";
2
+ import { ANIPError } from "@anip-dev/service";
3
+ export async function mountAnip(app, service, opts) {
4
+ const router = Router();
5
+ router.use(express.json());
6
+ // --- Discovery & Identity ---
7
+ router.get("/.well-known/anip", (req, res) => {
8
+ const baseUrl = `${req.protocol}://${req.get("host")}`;
9
+ res.json(service.getDiscovery({ baseUrl }));
10
+ });
11
+ router.get("/.well-known/jwks.json", async (_req, res, next) => {
12
+ try {
13
+ const jwks = await service.getJwks();
14
+ res.json(jwks);
15
+ }
16
+ catch (e) {
17
+ next(e);
18
+ }
19
+ });
20
+ router.get("/anip/manifest", async (_req, res, next) => {
21
+ try {
22
+ const [bodyBytes, signature] = await service.getSignedManifest();
23
+ res.set("Content-Type", "application/json");
24
+ res.set("X-ANIP-Signature", signature);
25
+ res.send(Buffer.from(bodyBytes));
26
+ }
27
+ catch (e) {
28
+ next(e);
29
+ }
30
+ });
31
+ // --- Tokens ---
32
+ router.post("/anip/tokens", async (req, res, next) => {
33
+ try {
34
+ const principal = await extractPrincipal(req, service);
35
+ if (!principal) {
36
+ authFailureTokenEndpoint(res);
37
+ return;
38
+ }
39
+ const result = await service.issueToken(principal, req.body);
40
+ res.json(result);
41
+ }
42
+ catch (e) {
43
+ if (e instanceof ANIPError) {
44
+ errorResponse(res, e);
45
+ return;
46
+ }
47
+ next(e);
48
+ }
49
+ });
50
+ // --- Permissions ---
51
+ router.post("/anip/permissions", async (req, res, next) => {
52
+ try {
53
+ const result = await resolveToken(req, service);
54
+ if (result === null) {
55
+ authFailureJwtEndpoint(res);
56
+ return;
57
+ }
58
+ if (result instanceof ANIPError) {
59
+ errorResponse(res, result);
60
+ return;
61
+ }
62
+ const token = result;
63
+ res.json(service.discoverPermissions(token));
64
+ }
65
+ catch (e) {
66
+ next(e);
67
+ }
68
+ });
69
+ // --- Invoke ---
70
+ router.post("/anip/invoke/:capability", async (req, res, next) => {
71
+ try {
72
+ const authResult = await resolveToken(req, service);
73
+ if (authResult === null) {
74
+ authFailureJwtEndpoint(res);
75
+ return;
76
+ }
77
+ if (authResult instanceof ANIPError) {
78
+ errorResponse(res, authResult);
79
+ return;
80
+ }
81
+ const token = authResult;
82
+ const body = req.body;
83
+ const params = body.parameters ?? body;
84
+ const clientReferenceId = body.client_reference_id ?? null;
85
+ if (!body.stream) {
86
+ // Unary mode — existing behavior
87
+ const result = await service.invoke(req.params.capability, token, params, {
88
+ clientReferenceId,
89
+ });
90
+ if (!result.success) {
91
+ const failure = result.failure;
92
+ res.status(failureStatus(failure?.type)).json(result);
93
+ return;
94
+ }
95
+ res.json(result);
96
+ return;
97
+ }
98
+ // Pre-validate streaming support (return JSON 400, not SSE)
99
+ const decl = service.getCapabilityDeclaration(req.params.capability);
100
+ const modes = decl?.response_modes ?? ["unary"];
101
+ if (!modes.includes("streaming")) {
102
+ const result = await service.invoke(req.params.capability, token, params, {
103
+ clientReferenceId, stream: true,
104
+ });
105
+ const failure = result.failure;
106
+ res.status(failureStatus(failure?.type)).json(result);
107
+ return;
108
+ }
109
+ // True streaming: res.write() as progress sink
110
+ res.writeHead(200, {
111
+ "Content-Type": "text/event-stream",
112
+ "Cache-Control": "no-cache",
113
+ "Connection": "keep-alive",
114
+ });
115
+ const result = await service.invoke(req.params.capability, token, params, {
116
+ clientReferenceId,
117
+ stream: true,
118
+ progressSink: async (event) => {
119
+ const eventData = { ...event, timestamp: new Date().toISOString() };
120
+ res.write(`event: progress\ndata: ${JSON.stringify(eventData)}\n\n`);
121
+ },
122
+ });
123
+ const ts = new Date().toISOString();
124
+ const terminalType = result.success ? "completed" : "failed";
125
+ const terminalData = {
126
+ invocation_id: result.invocation_id,
127
+ client_reference_id: result.client_reference_id,
128
+ timestamp: ts,
129
+ success: result.success,
130
+ ...(result.success
131
+ ? { result: result.result, cost_actual: result.cost_actual }
132
+ : { failure: result.failure }),
133
+ ...(result.stream_summary ? { stream_summary: result.stream_summary } : {}),
134
+ };
135
+ res.write(`event: ${terminalType}\ndata: ${JSON.stringify(terminalData)}\n\n`);
136
+ res.end();
137
+ }
138
+ catch (e) {
139
+ next(e);
140
+ }
141
+ });
142
+ // --- Audit ---
143
+ router.post("/anip/audit", async (req, res, next) => {
144
+ try {
145
+ const result = await resolveToken(req, service);
146
+ if (result === null) {
147
+ authFailureJwtEndpoint(res);
148
+ return;
149
+ }
150
+ if (result instanceof ANIPError) {
151
+ errorResponse(res, result);
152
+ return;
153
+ }
154
+ const token = result;
155
+ const filters = {
156
+ capability: req.query.capability ?? undefined,
157
+ since: req.query.since ?? undefined,
158
+ invocation_id: req.query.invocation_id ?? undefined,
159
+ client_reference_id: req.query.client_reference_id ?? undefined,
160
+ event_class: req.query.event_class ?? undefined,
161
+ limit: parseInt(req.query.limit ?? "50", 10),
162
+ };
163
+ res.json(await service.queryAudit(token, filters));
164
+ }
165
+ catch (e) {
166
+ next(e);
167
+ }
168
+ });
169
+ // --- Checkpoints ---
170
+ router.get("/anip/checkpoints", async (req, res, next) => {
171
+ try {
172
+ const limit = parseInt(req.query.limit ?? "10", 10);
173
+ res.json(await service.getCheckpoints(limit));
174
+ }
175
+ catch (e) {
176
+ next(e);
177
+ }
178
+ });
179
+ router.get("/anip/checkpoints/:id", async (req, res, next) => {
180
+ try {
181
+ const options = {
182
+ include_proof: req.query.include_proof === "true",
183
+ leaf_index: req.query.leaf_index ?? undefined,
184
+ consistency_from: req.query.consistency_from ?? undefined,
185
+ };
186
+ const result = await service.getCheckpoint(req.params.id, options);
187
+ if (!result) {
188
+ res.status(404).json({
189
+ success: false,
190
+ failure: {
191
+ type: "not_found",
192
+ detail: `Checkpoint ${req.params.id} not found`,
193
+ resolution: {
194
+ action: "list_checkpoints",
195
+ requires: "GET /anip/checkpoints to find valid checkpoint IDs",
196
+ grantable_by: null,
197
+ estimated_availability: null,
198
+ },
199
+ retry: false,
200
+ },
201
+ });
202
+ return;
203
+ }
204
+ res.json(result);
205
+ }
206
+ catch (e) {
207
+ next(e);
208
+ }
209
+ });
210
+ const prefix = opts?.prefix ?? "";
211
+ if (prefix) {
212
+ app.use(prefix, router);
213
+ }
214
+ else {
215
+ app.use(router);
216
+ }
217
+ // --- Health ---
218
+ if (opts?.healthEndpoint) {
219
+ app.get("/-/health", (_req, res) => {
220
+ res.json(service.getHealth());
221
+ });
222
+ }
223
+ await service.start();
224
+ return {
225
+ async shutdown() { await service.shutdown(); },
226
+ stop() { service.stop(); },
227
+ };
228
+ }
229
+ // --- Helpers ---
230
+ async function extractPrincipal(req, service) {
231
+ const auth = req.headers.authorization ?? "";
232
+ if (!auth.startsWith("Bearer "))
233
+ return null;
234
+ return service.authenticateBearer(auth.slice(7).trim());
235
+ }
236
+ async function resolveToken(req, service) {
237
+ const auth = req.headers.authorization ?? "";
238
+ if (!auth.startsWith("Bearer "))
239
+ return null;
240
+ try {
241
+ return await service.resolveBearerToken(auth.slice(7).trim());
242
+ }
243
+ catch (e) {
244
+ if (e instanceof ANIPError)
245
+ return e;
246
+ throw e;
247
+ }
248
+ }
249
+ function failureStatus(type) {
250
+ const mapping = {
251
+ invalid_token: 401,
252
+ token_expired: 401,
253
+ scope_insufficient: 403,
254
+ insufficient_authority: 403,
255
+ purpose_mismatch: 403,
256
+ unknown_capability: 404,
257
+ not_found: 404,
258
+ unavailable: 409,
259
+ concurrent_lock: 409,
260
+ internal_error: 500,
261
+ };
262
+ return mapping[type ?? ""] ?? 400;
263
+ }
264
+ function authFailureTokenEndpoint(res) {
265
+ res.status(401).json({
266
+ success: false,
267
+ failure: {
268
+ type: "authentication_required",
269
+ detail: "A valid API key is required to issue delegation tokens",
270
+ resolution: {
271
+ action: "provide_api_key",
272
+ requires: "API key in Authorization header",
273
+ grantable_by: null,
274
+ estimated_availability: null,
275
+ },
276
+ retry: true,
277
+ },
278
+ });
279
+ }
280
+ function authFailureJwtEndpoint(res) {
281
+ res.status(401).json({
282
+ success: false,
283
+ failure: {
284
+ type: "authentication_required",
285
+ detail: "A valid delegation token (JWT) is required in the Authorization header",
286
+ resolution: {
287
+ action: "obtain_delegation_token",
288
+ requires: "Bearer token from POST /anip/tokens",
289
+ grantable_by: null,
290
+ estimated_availability: null,
291
+ },
292
+ retry: true,
293
+ },
294
+ });
295
+ }
296
+ const DEFAULT_RESOLUTIONS = {
297
+ invalid_token: {
298
+ action: "obtain_delegation_token",
299
+ requires: "Valid JWT from POST /anip/tokens",
300
+ grantable_by: null,
301
+ estimated_availability: null,
302
+ },
303
+ scope_insufficient: {
304
+ action: "request_broader_scope",
305
+ requires: "Token with required scope",
306
+ grantable_by: null,
307
+ estimated_availability: null,
308
+ },
309
+ unknown_capability: {
310
+ action: "check_manifest",
311
+ requires: "Valid capability name from GET /anip/manifest",
312
+ grantable_by: null,
313
+ estimated_availability: null,
314
+ },
315
+ };
316
+ function errorResponse(res, error) {
317
+ const status = failureStatus(error.errorType);
318
+ const resolution = error.resolution ?? DEFAULT_RESOLUTIONS[error.errorType] ?? {
319
+ action: "contact_service_owner",
320
+ requires: null,
321
+ grantable_by: null,
322
+ estimated_availability: null,
323
+ };
324
+ res.status(status).json({
325
+ success: false,
326
+ failure: {
327
+ type: error.errorType,
328
+ detail: error.detail,
329
+ resolution,
330
+ retry: error.retry,
331
+ },
332
+ });
333
+ }
334
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAY,EACZ,OAAoB,EACpB,IAAoD;IAEpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3B,+BAA+B;IAC/B,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACjE,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAC5C,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,SAAS,EAAE,CAAC;gBAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC;gBAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC7D,IAAI,MAAM,YAAY,SAAS,EAAE,CAAC;gBAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACjE,IAAI,UAAU,YAAY,SAAS,EAAE,CAAC;gBAAC,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChF,MAAM,KAAK,GAAG,UAAU,CAAC;YACzB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;YACvC,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC;YAE3D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,iCAAiC;gBACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;oBACxE,iBAAiB;iBAClB,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAkC,CAAC;oBAC1D,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChE,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,4DAA4D;YAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrE,MAAM,KAAK,GAAI,IAAI,EAAE,cAA2B,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;oBACxE,iBAAiB,EAAE,MAAM,EAAE,IAAI;iBAChC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAkC,CAAC;gBAC1D,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;YAED,+CAA+C;YAC/C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,UAAU;gBAC3B,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;gBACxE,iBAAiB;gBACjB,MAAM,EAAE,IAAI;gBACZ,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC5B,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;oBACpE,GAAG,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACvE,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC7D,MAAM,YAAY,GAAG;gBACnB,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;gBAC/C,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,OAAO;oBAChB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;oBAC5D,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5E,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,UAAU,YAAY,WAAW,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/E,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC7D,IAAI,MAAM,YAAY,SAAS,EAAE,CAAC;gBAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC;YACrB,MAAM,OAAO,GAAG;gBACd,UAAU,EAAG,GAAG,CAAC,KAAK,CAAC,UAAqB,IAAI,SAAS;gBACzD,KAAK,EAAG,GAAG,CAAC,KAAK,CAAC,KAAgB,IAAI,SAAS;gBAC/C,aAAa,EAAG,GAAG,CAAC,KAAK,CAAC,aAAwB,IAAI,SAAS;gBAC/D,mBAAmB,EAAG,GAAG,CAAC,KAAK,CAAC,mBAA8B,IAAI,SAAS;gBAC3E,WAAW,EAAG,GAAG,CAAC,KAAK,CAAC,WAAsB,IAAI,SAAS;gBAC3D,KAAK,EAAE,QAAQ,CAAE,GAAG,CAAC,KAAK,CAAC,KAAgB,IAAI,IAAI,EAAE,EAAE,CAAC;aACzD,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAE,GAAG,CAAC,KAAK,CAAC,KAAgB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG;gBACd,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,MAAM;gBACjD,UAAU,EAAG,GAAG,CAAC,KAAK,CAAC,UAAqB,IAAI,SAAS;gBACzD,gBAAgB,EAAG,GAAG,CAAC,KAAK,CAAC,gBAA2B,IAAI,SAAS;aACtE,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE;wBACP,IAAI,EAAE,WAAW;wBACjB,MAAM,EAAE,cAAc,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY;wBAC/C,UAAU,EAAE;4BACV,MAAM,EAAE,kBAAkB;4BAC1B,QAAQ,EAAE,oDAAoD;4BAC9D,YAAY,EAAE,IAAI;4BAClB,sBAAsB,EAAE,IAAI;yBAC7B;wBACD,KAAK,EAAE,KAAK;qBACb;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,iBAAiB;IACjB,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACjC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO;QACL,KAAK,CAAC,QAAQ,KAAK,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,kBAAkB;AAElB,KAAK,UAAU,gBAAgB,CAAC,GAAY,EAAE,OAAoB;IAChE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,OAAoB;IAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,SAAS;YAAE,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,GAAG;QAClB,aAAa,EAAE,GAAG;QAClB,kBAAkB,EAAE,GAAG;QACvB,sBAAsB,EAAE,GAAG;QAC3B,gBAAgB,EAAE,GAAG;QACrB,kBAAkB,EAAE,GAAG;QACvB,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,GAAG;QACpB,cAAc,EAAE,GAAG;KACpB,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAa;IAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,wDAAwD;YAChE,UAAU,EAAE;gBACV,MAAM,EAAE,iBAAiB;gBACzB,QAAQ,EAAE,iCAAiC;gBAC3C,YAAY,EAAE,IAAI;gBAClB,sBAAsB,EAAE,IAAI;aAC7B;YACD,KAAK,EAAE,IAAI;SACZ;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAa;IAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,wEAAwE;YAChF,UAAU,EAAE;gBACV,MAAM,EAAE,yBAAyB;gBACjC,QAAQ,EAAE,qCAAqC;gBAC/C,YAAY,EAAE,IAAI;gBAClB,sBAAsB,EAAE,IAAI;aAC7B;YACD,KAAK,EAAE,IAAI;SACZ;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,mBAAmB,GAA4C;IACnE,aAAa,EAAE;QACb,MAAM,EAAE,yBAAyB;QACjC,QAAQ,EAAE,kCAAkC;QAC5C,YAAY,EAAE,IAAI;QAClB,sBAAsB,EAAE,IAAI;KAC7B;IACD,kBAAkB,EAAE;QAClB,MAAM,EAAE,uBAAuB;QAC/B,QAAQ,EAAE,2BAA2B;QACrC,YAAY,EAAE,IAAI;QAClB,sBAAsB,EAAE,IAAI;KAC7B;IACD,kBAAkB,EAAE;QAClB,MAAM,EAAE,gBAAgB;QACxB,QAAQ,EAAE,+CAA+C;QACzD,YAAY,EAAE,IAAI;QAClB,sBAAsB,EAAE,IAAI;KAC7B;CACF,CAAC;AAEF,SAAS,aAAa,CAAC,GAAa,EAAE,KAAgB;IACpD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI;QAC7E,MAAM,EAAE,uBAAuB;QAC/B,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;QAClB,sBAAsB,EAAE,IAAI;KAC7B,CAAC;IACF,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QACtB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,CAAC,SAAS;YACrB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU;YACV,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@anip-dev/express",
3
+ "version": "0.11.0",
4
+ "description": "ANIP Express bindings — mount an ANIPService as HTTP routes",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=20"
8
+ },
9
+ "main": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "test": "vitest run"
14
+ },
15
+ "dependencies": {
16
+ "@anip-dev/service": "0.11.0",
17
+ "express": "^4.21.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/express": "^5.0.0",
21
+ "@types/supertest": "^6.0.0",
22
+ "supertest": "^7.1.0",
23
+ "typescript": "^5.5.0",
24
+ "vitest": "^4.1.0"
25
+ },
26
+ "license": "Apache-2.0",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/anip-protocol/anip.git",
30
+ "directory": "packages/typescript/express"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "files": ["dist", "README.md"]
36
+ }