spiceflow 1.3.0 → 1.4.1
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/client/errors.js +4 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +59 -49
- package/dist/client/index.js.map +1 -1
- package/dist/client.test.js +22 -63
- package/dist/client.test.js.map +1 -1
- package/dist/cors.js +8 -6
- package/dist/cors.js.map +1 -1
- package/dist/error.js +8 -18
- package/dist/error.js.map +1 -1
- package/dist/mcp-transport.js +12 -8
- package/dist/mcp-transport.js.map +1 -1
- package/dist/mcp.js +10 -12
- package/dist/mcp.js.map +1 -1
- package/dist/middleware.test.js +2 -2
- package/dist/middleware.test.js.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +119 -80
- package/dist/openapi.js.map +1 -1
- package/dist/openapi.test.js +10 -27
- package/dist/openapi.test.js.map +1 -1
- package/dist/spiceflow.d.ts.map +1 -1
- package/dist/spiceflow.js +117 -104
- package/dist/spiceflow.js.map +1 -1
- package/dist/spiceflow.test.js +12 -61
- package/dist/spiceflow.test.js.map +1 -1
- package/dist/static-node.js +6 -3
- package/dist/static-node.js.map +1 -1
- package/dist/static.js +3 -5
- package/dist/static.js.map +1 -1
- package/dist/stream.test.js +36 -65
- package/dist/stream.test.js.map +1 -1
- package/dist/types.test.js +10 -45
- package/dist/types.test.js.map +1 -1
- package/package.json +1 -3
- package/src/client/index.ts +12 -3
- package/src/client.test.ts +9 -3
- package/src/middleware.test.ts +1 -1
- package/src/openapi.ts +11 -12
- package/src/spiceflow.ts +48 -14
package/dist/stream.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../src/stream.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../src/stream.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.test.js
CHANGED
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
2
|
-
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
3
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
4
|
-
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
5
|
-
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
6
|
-
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
7
|
-
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
8
|
-
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
9
|
-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
10
|
-
function fulfill(value) { resume("next", value); }
|
|
11
|
-
function reject(value) { resume("throw", value); }
|
|
12
|
-
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
13
|
-
};
|
|
14
|
-
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
15
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
16
|
-
var m = o[Symbol.asyncIterator], i;
|
|
17
|
-
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
18
|
-
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
19
|
-
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
20
|
-
};
|
|
21
1
|
import { test, expect } from 'vitest';
|
|
22
2
|
import { Spiceflow } from './spiceflow.js';
|
|
23
3
|
import { createSpiceflowClient } from './client/index.js';
|
|
@@ -49,37 +29,22 @@ test('`use` on Spiceflow return', async () => {
|
|
|
49
29
|
expect(await res.json()).toEqual('hi');
|
|
50
30
|
});
|
|
51
31
|
test('async generator type with client', async () => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
yield yield __await({ message: 'Hello' });
|
|
56
|
-
yield yield __await({ message: 'World' });
|
|
57
|
-
});
|
|
32
|
+
const app = new Spiceflow().get('/stream', async function* () {
|
|
33
|
+
yield { message: 'Hello' };
|
|
34
|
+
yield { message: 'World' };
|
|
58
35
|
});
|
|
59
36
|
const client = createSpiceflowClient(app);
|
|
60
37
|
const streamResponse = await client.stream.get();
|
|
61
38
|
if (streamResponse.error) {
|
|
62
39
|
throw streamResponse.error;
|
|
63
40
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
item.something;
|
|
72
|
-
item.message;
|
|
73
|
-
expect(item).toHaveProperty('message');
|
|
74
|
-
expect(typeof item.message).toBe('string');
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
78
|
-
finally {
|
|
79
|
-
try {
|
|
80
|
-
if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
|
|
81
|
-
}
|
|
82
|
-
finally { if (e_1) throw e_1.error; }
|
|
41
|
+
// Type check: each yielded item should have the 'message' property
|
|
42
|
+
for await (const item of streamResponse.data) {
|
|
43
|
+
// @ts-expect-error
|
|
44
|
+
item.something;
|
|
45
|
+
item.message;
|
|
46
|
+
expect(item).toHaveProperty('message');
|
|
47
|
+
expect(typeof item.message).toBe('string');
|
|
83
48
|
}
|
|
84
49
|
});
|
|
85
50
|
//# sourceMappingURL=types.test.js.map
|
package/dist/types.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../src/types.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../src/types.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spiceflow",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Simple API framework with RPC and type safety",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -46,8 +46,6 @@
|
|
|
46
46
|
"ajv": "^8.17.1",
|
|
47
47
|
"ajv-formats": "^3.0.1",
|
|
48
48
|
"eventsource-parser": "^3.0.0",
|
|
49
|
-
"fast-querystring": "^1.1.2",
|
|
50
|
-
"lodash.clonedeep": "^4.5.0",
|
|
51
49
|
"openapi-types": "^12.1.3",
|
|
52
50
|
"zod": "^3.24.1",
|
|
53
51
|
"zod-to-json-schema": "^3.24.1"
|
package/src/client/index.ts
CHANGED
|
@@ -185,6 +185,10 @@ const createProxy = (
|
|
|
185
185
|
): any =>
|
|
186
186
|
new Proxy(() => {}, {
|
|
187
187
|
get(_, param: string): any {
|
|
188
|
+
// handle case where createClient returns a promise and await calls .then on it
|
|
189
|
+
if ((!paths.length && param === 'then') || param === 'catch') {
|
|
190
|
+
return _[param]
|
|
191
|
+
}
|
|
188
192
|
return createProxy(
|
|
189
193
|
domain,
|
|
190
194
|
config,
|
|
@@ -237,7 +241,7 @@ const createProxy = (
|
|
|
237
241
|
}
|
|
238
242
|
}
|
|
239
243
|
|
|
240
|
-
return (async () => {
|
|
244
|
+
return Promise.resolve().then(async () => {
|
|
241
245
|
let fetchInit = {
|
|
242
246
|
method: method?.toUpperCase(),
|
|
243
247
|
body,
|
|
@@ -365,6 +369,7 @@ const createProxy = (
|
|
|
365
369
|
}
|
|
366
370
|
|
|
367
371
|
const url = domain + path + q
|
|
372
|
+
// console.log({ url, fetchInit })
|
|
368
373
|
const response = await (instance?.handle(
|
|
369
374
|
new Request(url, fetchInit),
|
|
370
375
|
) ?? fetcher!(url, fetchInit))
|
|
@@ -423,7 +428,11 @@ const createProxy = (
|
|
|
423
428
|
}
|
|
424
429
|
|
|
425
430
|
if (response.status >= 300 || response.status < 200) {
|
|
426
|
-
error = new SpiceflowFetchError(
|
|
431
|
+
error = new SpiceflowFetchError(
|
|
432
|
+
response.status,
|
|
433
|
+
data || 'Unknown error',
|
|
434
|
+
)
|
|
435
|
+
console.trace({ error, data })
|
|
427
436
|
data = null
|
|
428
437
|
}
|
|
429
438
|
|
|
@@ -434,7 +443,7 @@ const createProxy = (
|
|
|
434
443
|
status: response.status,
|
|
435
444
|
headers: response.headers,
|
|
436
445
|
}
|
|
437
|
-
})
|
|
446
|
+
})
|
|
438
447
|
}
|
|
439
448
|
|
|
440
449
|
if (typeof body === 'object')
|
package/src/client.test.ts
CHANGED
|
@@ -210,9 +210,7 @@ describe('client', () => {
|
|
|
210
210
|
expect(data).toMatchInlineSnapshot(
|
|
211
211
|
`"this string will not be parsed as json"`,
|
|
212
212
|
)
|
|
213
|
-
expect(error).toMatchInlineSnapshot(
|
|
214
|
-
`null`,
|
|
215
|
-
)
|
|
213
|
+
expect(error).toMatchInlineSnapshot(`null`)
|
|
216
214
|
})
|
|
217
215
|
|
|
218
216
|
it('stream ', async () => {
|
|
@@ -271,3 +269,11 @@ describe('client', () => {
|
|
|
271
269
|
// expect(value).toEqual('Kirifuji Nagisa')
|
|
272
270
|
// })
|
|
273
271
|
})
|
|
272
|
+
|
|
273
|
+
describe('client as promise', () => {
|
|
274
|
+
it('should work with async client', async () => {
|
|
275
|
+
const asyncClient = Promise.resolve(client)
|
|
276
|
+
const { data } = await (await asyncClient).mirror.post({ test: 'value' })
|
|
277
|
+
expect(data).toEqual({ test: 'value' })
|
|
278
|
+
}, 200)
|
|
279
|
+
})
|
package/src/middleware.test.ts
CHANGED
|
@@ -358,7 +358,7 @@ test('each middleware and route is called exactly once if an error is thrown', a
|
|
|
358
358
|
const res = await app.handle(new Request('http://localhost/test'))
|
|
359
359
|
|
|
360
360
|
expect(res.status).toBe(500)
|
|
361
|
-
expect(await res.text()).
|
|
361
|
+
expect(await res.text()).toMatchInlineSnapshot(`"{"message":"Route response"}"`)
|
|
362
362
|
expect(callOrder).toEqual(['middleware1', 'middleware2', 'middleware3', 'route'])
|
|
363
363
|
|
|
364
364
|
// Check that each middleware and route is called exactly once
|
package/src/openapi.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { JSONSchemaType } from 'ajv'
|
|
2
2
|
import { InternalRoute, isZodSchema, Spiceflow } from './spiceflow.js'
|
|
3
|
-
import { ZodType } from 'zod'
|
|
4
3
|
|
|
5
4
|
import type { OpenAPIV3 } from 'openapi-types'
|
|
6
5
|
|
|
7
6
|
let excludeMethods = ['OPTIONS']
|
|
8
7
|
|
|
9
|
-
import type {
|
|
8
|
+
import type { TypeSchema } from './types.js'
|
|
9
|
+
|
|
10
10
|
|
|
11
|
-
import deepClone from 'lodash.clonedeep'
|
|
12
11
|
import { z } from 'zod'
|
|
13
12
|
import zodToJsonSchema from 'zod-to-json-schema'
|
|
14
13
|
|
|
@@ -129,20 +128,20 @@ const registerSchemaPath = ({
|
|
|
129
128
|
route: InternalRoute
|
|
130
129
|
models: Record<string, TypeSchema>
|
|
131
130
|
}) => {
|
|
132
|
-
const
|
|
131
|
+
const hooks = route.hooks
|
|
133
132
|
|
|
134
133
|
let contentTypes = ['application/json']
|
|
135
134
|
|
|
136
135
|
if (isAsyncGenerator(route.handler) && !route.hooks?.response) {
|
|
137
136
|
contentTypes = ['text/event-stream']
|
|
138
|
-
} else if (
|
|
139
|
-
contentTypes = Array.isArray(
|
|
137
|
+
} else if (hooks?.type) {
|
|
138
|
+
contentTypes = Array.isArray(hooks.type) ? hooks.type : [hooks.type]
|
|
140
139
|
}
|
|
141
140
|
|
|
142
141
|
const path = toOpenAPIPath(route.path)
|
|
143
142
|
|
|
144
|
-
const bodySchema = getJsonSchema(
|
|
145
|
-
let paramsSchema =
|
|
143
|
+
const bodySchema = getJsonSchema(hooks?.body)
|
|
144
|
+
let paramsSchema = hooks?.params
|
|
146
145
|
if (route.path.includes(':') && !paramsSchema) {
|
|
147
146
|
const paramNames = extractParamNames(route.path)
|
|
148
147
|
if (paramNames.length) {
|
|
@@ -156,8 +155,8 @@ const registerSchemaPath = ({
|
|
|
156
155
|
}
|
|
157
156
|
|
|
158
157
|
// const headerSchema = hook?.headers
|
|
159
|
-
const querySchema =
|
|
160
|
-
let responseSchema =
|
|
158
|
+
const querySchema = hooks?.query
|
|
159
|
+
let responseSchema = hooks?.response as unknown as TypeSchema
|
|
161
160
|
const defaultResponseSchema: OpenAPIV3.ResponsesObject = {
|
|
162
161
|
// '500': {
|
|
163
162
|
// description: 'Internal Server Error',
|
|
@@ -331,7 +330,7 @@ const registerSchemaPath = ({
|
|
|
331
330
|
// hook?.detail?.operationId ?? generateOperationId(route.method, path),
|
|
332
331
|
|
|
333
332
|
// Add any additional details from hook
|
|
334
|
-
...
|
|
333
|
+
...hooks?.detail,
|
|
335
334
|
|
|
336
335
|
// Add request body if body schema exists
|
|
337
336
|
...(bodySchema
|
|
@@ -339,7 +338,7 @@ const registerSchemaPath = ({
|
|
|
339
338
|
requestBody: {
|
|
340
339
|
required: true,
|
|
341
340
|
content: mapTypesResponse(
|
|
342
|
-
|
|
341
|
+
hooks.bodyType ? [hooks.bodyType] : ['application/json'],
|
|
343
342
|
typeof bodySchema === 'string'
|
|
344
343
|
? {
|
|
345
344
|
$ref: `#/components/schemas/${bodySchema}`,
|
package/src/spiceflow.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import parseQuery from 'fast-querystring'
|
|
2
|
-
|
|
3
1
|
import { Type } from '@sinclair/typebox'
|
|
4
2
|
|
|
5
3
|
export { Type as t }
|
|
@@ -763,7 +761,7 @@ export class Spiceflow<
|
|
|
763
761
|
request,
|
|
764
762
|
state,
|
|
765
763
|
path,
|
|
766
|
-
query: parseQuery
|
|
764
|
+
query: parseQuery((u.search || '').slice(1)),
|
|
767
765
|
params: _params,
|
|
768
766
|
redirect,
|
|
769
767
|
} satisfies MiddlewareContext<any>
|
|
@@ -1017,7 +1015,6 @@ export class Spiceflow<
|
|
|
1017
1015
|
|
|
1018
1016
|
return server
|
|
1019
1017
|
}
|
|
1020
|
-
|
|
1021
1018
|
private async handleStream({
|
|
1022
1019
|
onErrorHandlers,
|
|
1023
1020
|
generator,
|
|
@@ -1035,15 +1032,35 @@ export class Spiceflow<
|
|
|
1035
1032
|
if (init?.done) {
|
|
1036
1033
|
return await turnHandlerResultIntoResponse(init.value, route)
|
|
1037
1034
|
}
|
|
1038
|
-
|
|
1035
|
+
|
|
1039
1036
|
let self = this
|
|
1040
1037
|
return new Response(
|
|
1041
1038
|
new ReadableStream({
|
|
1042
1039
|
async start(controller) {
|
|
1043
1040
|
let end = false
|
|
1044
1041
|
|
|
1045
|
-
|
|
1042
|
+
// Set up ping interval
|
|
1043
|
+
const pingInterval = setInterval(() => {
|
|
1044
|
+
if (!end) {
|
|
1045
|
+
controller.enqueue(Buffer.from('\n'))
|
|
1046
|
+
}
|
|
1047
|
+
}, 10 * 1000)
|
|
1048
|
+
|
|
1049
|
+
request?.signal.addEventListener('abort', async () => {
|
|
1046
1050
|
end = true
|
|
1051
|
+
clearInterval(pingInterval)
|
|
1052
|
+
|
|
1053
|
+
// Using return() instead of throw() because:
|
|
1054
|
+
// 1. return() allows for cleanup in finally blocks
|
|
1055
|
+
// 2. throw() would trigger error handling which isn't needed for normal aborts
|
|
1056
|
+
// 3. return() is the more graceful way to stop iteration
|
|
1057
|
+
if ('return' in generator) {
|
|
1058
|
+
try {
|
|
1059
|
+
await generator.return(undefined)
|
|
1060
|
+
} catch {
|
|
1061
|
+
// Ignore errors from stopping generator
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1047
1064
|
|
|
1048
1065
|
try {
|
|
1049
1066
|
controller.close()
|
|
@@ -1055,7 +1072,7 @@ export class Spiceflow<
|
|
|
1055
1072
|
if (init?.value !== undefined && init?.value !== null)
|
|
1056
1073
|
controller.enqueue(
|
|
1057
1074
|
Buffer.from(
|
|
1058
|
-
|
|
1075
|
+
'event: message\ndata: ' + JSON.stringify(init.value) + '\n\n',
|
|
1059
1076
|
),
|
|
1060
1077
|
)
|
|
1061
1078
|
|
|
@@ -1066,7 +1083,7 @@ export class Spiceflow<
|
|
|
1066
1083
|
|
|
1067
1084
|
controller.enqueue(
|
|
1068
1085
|
Buffer.from(
|
|
1069
|
-
|
|
1086
|
+
'event: message\ndata: ' + JSON.stringify(chunk) + '\n\n',
|
|
1070
1087
|
),
|
|
1071
1088
|
)
|
|
1072
1089
|
}
|
|
@@ -1078,13 +1095,14 @@ export class Spiceflow<
|
|
|
1078
1095
|
})
|
|
1079
1096
|
controller.enqueue(
|
|
1080
1097
|
Buffer.from(
|
|
1081
|
-
|
|
1082
|
-
error.message || error.name || 'Error'
|
|
1083
|
-
|
|
1098
|
+
'event: error\ndata: ' +
|
|
1099
|
+
JSON.stringify(error.message || error.name || 'Error') +
|
|
1100
|
+
'\n\n',
|
|
1084
1101
|
),
|
|
1085
1102
|
)
|
|
1086
1103
|
}
|
|
1087
1104
|
|
|
1105
|
+
clearInterval(pingInterval)
|
|
1088
1106
|
try {
|
|
1089
1107
|
controller.close()
|
|
1090
1108
|
} catch {
|
|
@@ -1093,12 +1111,9 @@ export class Spiceflow<
|
|
|
1093
1111
|
},
|
|
1094
1112
|
}),
|
|
1095
1113
|
{
|
|
1096
|
-
// TODO add headers somehow
|
|
1097
1114
|
headers: {
|
|
1098
|
-
// Manually set transfer-encoding for direct response, eg. app.handle, eden
|
|
1099
1115
|
'transfer-encoding': 'chunked',
|
|
1100
1116
|
'content-type': 'text/event-stream; charset=utf-8',
|
|
1101
|
-
// ...set?.headers
|
|
1102
1117
|
},
|
|
1103
1118
|
},
|
|
1104
1119
|
)
|
|
@@ -1322,3 +1337,22 @@ function runValidation(value: any, validate?: ValidateFunction) {
|
|
|
1322
1337
|
}
|
|
1323
1338
|
return value
|
|
1324
1339
|
}
|
|
1340
|
+
|
|
1341
|
+
function parseQuery(queryString: string) {
|
|
1342
|
+
// Create a URLSearchParams instance
|
|
1343
|
+
const params = new URLSearchParams(queryString)
|
|
1344
|
+
|
|
1345
|
+
// Convert to an object with arrays for repeated keys
|
|
1346
|
+
const paramsObject = {}
|
|
1347
|
+
for (const [key, value] of params) {
|
|
1348
|
+
// If the key already exists, convert to an array or push to the existing array
|
|
1349
|
+
if (paramsObject[key]) {
|
|
1350
|
+
paramsObject[key] = Array.isArray(paramsObject[key])
|
|
1351
|
+
? [...paramsObject[key], value]
|
|
1352
|
+
: [paramsObject[key], value]
|
|
1353
|
+
} else {
|
|
1354
|
+
paramsObject[key] = value // Set the value if it's the first occurrence
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
return paramsObject
|
|
1358
|
+
}
|