spiceflow 0.0.7 → 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/README.md +1 -171
- package/dist/client/errors.d.ts +7 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +18 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +14 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +376 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +87 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/utils.d.ts +2 -0
- package/dist/client/utils.d.ts.map +1 -0
- package/dist/client/utils.js +9 -0
- package/dist/client/utils.js.map +1 -0
- package/dist/client/ws.d.ts +15 -0
- package/dist/client/ws.d.ts.map +1 -0
- package/dist/client/ws.js +51 -0
- package/dist/client/ws.js.map +1 -0
- package/dist/client.test.d.ts +2 -0
- package/dist/client.test.d.ts.map +1 -0
- package/dist/client.test.js +237 -0
- package/dist/client.test.js.map +1 -0
- package/dist/elysia-fork/context.d.ts +87 -0
- package/dist/elysia-fork/context.d.ts.map +1 -0
- package/dist/elysia-fork/context.js +2 -0
- package/dist/elysia-fork/context.js.map +1 -0
- package/dist/elysia-fork/error.d.ts +246 -0
- package/dist/elysia-fork/error.d.ts.map +1 -0
- package/dist/elysia-fork/error.js +195 -0
- package/dist/elysia-fork/error.js.map +1 -0
- package/dist/elysia-fork/types.d.ts +652 -0
- package/dist/elysia-fork/types.d.ts.map +1 -0
- package/dist/elysia-fork/types.js +3 -0
- package/dist/elysia-fork/types.js.map +1 -0
- package/dist/elysia-fork/utils.d.ts +134 -0
- package/dist/elysia-fork/utils.d.ts.map +1 -0
- package/dist/elysia-fork/utils.js +70 -0
- package/dist/elysia-fork/utils.js.map +1 -0
- package/dist/spiceflow.d.ts +253 -0
- package/dist/spiceflow.d.ts.map +1 -0
- package/dist/spiceflow.js +500 -0
- package/dist/spiceflow.js.map +1 -0
- package/dist/spiceflow.test.d.ts +2 -0
- package/dist/spiceflow.test.d.ts.map +1 -0
- package/dist/spiceflow.test.js +225 -0
- package/dist/spiceflow.test.js.map +1 -0
- package/dist/stream.test.d.ts +2 -0
- package/dist/stream.test.d.ts.map +1 -0
- package/dist/stream.test.js +286 -0
- package/dist/stream.test.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +4 -20
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +17 -46
- package/dist/utils.js.map +1 -1
- package/package.json +12 -36
- package/src/client/errors.ts +21 -0
- package/src/client/index.ts +539 -0
- package/src/client/types.ts +233 -0
- package/src/client/utils.ts +7 -0
- package/src/client/ws.ts +99 -0
- package/src/client.test.ts +235 -0
- package/src/elysia-fork/context.ts +196 -0
- package/src/elysia-fork/error.ts +293 -0
- package/src/elysia-fork/types.ts +1454 -0
- package/src/elysia-fork/utils.ts +85 -0
- package/src/spiceflow.test.ts +290 -0
- package/src/spiceflow.ts +1266 -0
- package/src/stream.test.ts +342 -0
- package/src/types.ts +0 -0
- package/src/utils.ts +21 -70
- package/context.d.ts +0 -2
- package/context.js +0 -1
- package/dist/babel.test.d.ts +0 -2
- package/dist/babel.test.d.ts.map +0 -1
- package/dist/babel.test.js +0 -27
- package/dist/babel.test.js.map +0 -1
- package/dist/babelDebugOutputs.d.ts +0 -9
- package/dist/babelDebugOutputs.d.ts.map +0 -1
- package/dist/babelDebugOutputs.js +0 -34
- package/dist/babelDebugOutputs.js.map +0 -1
- package/dist/babelTransformRpc.d.ts +0 -19
- package/dist/babelTransformRpc.d.ts.map +0 -1
- package/dist/babelTransformRpc.js +0 -285
- package/dist/babelTransformRpc.js.map +0 -1
- package/dist/browser.d.ts +0 -8
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js +0 -126
- package/dist/browser.js.map +0 -1
- package/dist/build.d.ts +0 -13
- package/dist/build.d.ts.map +0 -1
- package/dist/build.js +0 -230
- package/dist/build.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -111
- package/dist/cli.js.map +0 -1
- package/dist/context-internal.d.ts +0 -20
- package/dist/context-internal.d.ts.map +0 -1
- package/dist/context-internal.js +0 -16
- package/dist/context-internal.js.map +0 -1
- package/dist/context.d.ts +0 -2
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -2
- package/dist/context.js.map +0 -1
- package/dist/expose.d.ts +0 -6
- package/dist/expose.d.ts.map +0 -1
- package/dist/expose.js +0 -32
- package/dist/expose.js.map +0 -1
- package/dist/headers.d.ts +0 -2
- package/dist/headers.d.ts.map +0 -1
- package/dist/headers.js +0 -18
- package/dist/headers.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -23
- package/dist/index.js.map +0 -1
- package/dist/jsonRpc.d.ts +0 -32
- package/dist/jsonRpc.d.ts.map +0 -1
- package/dist/jsonRpc.js +0 -3
- package/dist/jsonRpc.js.map +0 -1
- package/dist/server.d.ts +0 -32
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -292
- package/dist/server.js.map +0 -1
- package/headers.d.ts +0 -2
- package/headers.js +0 -1
- package/sdk-template/package.json +0 -22
- package/sdk-template/src/index.ts +0 -2
- package/sdk-template/src/v1/example.ts +0 -5
- package/sdk-template/src/v1/generator.ts +0 -12
- package/sdk-template/tsconfig.json +0 -16
- package/src/babel.test.ts +0 -35
- package/src/babelDebugOutputs.ts +0 -56
- package/src/babelTransformRpc.ts +0 -394
- package/src/browser.ts +0 -141
- package/src/build.ts +0 -298
- package/src/cli.ts +0 -132
- package/src/context-internal.ts +0 -36
- package/src/context.ts +0 -5
- package/src/expose.ts +0 -34
- package/src/headers.ts +0 -19
- package/src/index.ts +0 -34
- package/src/jsonRpc.ts +0 -43
- package/src/server.ts +0 -384
package/README.md
CHANGED
|
@@ -4,177 +4,7 @@
|
|
|
4
4
|
<br/>
|
|
5
5
|
<h3>spiceflow</h3>
|
|
6
6
|
<br/>
|
|
7
|
-
<p>
|
|
7
|
+
<p>API framework fast, simple and type safe</p>
|
|
8
8
|
<br/>
|
|
9
9
|
<br/>
|
|
10
|
-
|
|
11
10
|
</div>
|
|
12
|
-
|
|
13
|
-
## What is spiceflow?
|
|
14
|
-
|
|
15
|
-
Spiceflow is the fastest way to write and expose an RPC API. In Spiceflow any files with the directive `'use spiceflow'` will be processed as an API route, each function defined in the file will be exposed as an JSON-RPC method.
|
|
16
|
-
|
|
17
|
-
After defining your functions you can call `spiceflow serve` to start a server exposing your API, you can also espose the API using the Next.js or your own server.
|
|
18
|
-
|
|
19
|
-
When calling `spiceflow build` spiceflow will generate a client side SDK for your API, you can use it to call your API from the browser. This client SDK will be type safe, because the functions are called the same way from the server and the client, so types can be reused (after being bundled with @microsoft/api-extractor).
|
|
20
|
-
|
|
21
|
-
You can publish this SDK to npm and let your users interact with your API in an easy and type safe way.
|
|
22
|
-
|
|
23
|
-
## Installation
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
npm i spiceflow
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Usage
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# create a new spiceflow project, works best in a monorepo
|
|
33
|
-
npx spiceflow init --name my-api
|
|
34
|
-
# .
|
|
35
|
-
# ├── package.json
|
|
36
|
-
# ├── src
|
|
37
|
-
# │ ├── index.ts
|
|
38
|
-
# │ └── v1
|
|
39
|
-
# │ ├── example.ts
|
|
40
|
-
# │ └── generator.ts
|
|
41
|
-
# └── tsconfig.json
|
|
42
|
-
|
|
43
|
-
npx spiceflow serve # builds the sdk in the dist folder and starts serving your API
|
|
44
|
-
|
|
45
|
-
npm run try-sdk # try using the sdk
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Writing your API functions
|
|
49
|
-
|
|
50
|
-
#### Any functions exported in a file with the `'use spiceflow'` directive will be processed as an API route, each function defined in the file will be exposed as an JSON-RPC method.
|
|
51
|
-
|
|
52
|
-
```ts
|
|
53
|
-
// src/v1/functions.ts
|
|
54
|
-
'use spiceflow';
|
|
55
|
-
|
|
56
|
-
export async function spiceflowFunction() {
|
|
57
|
-
return { hello: 'world' };
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export async function* spiceflowGenerator() {
|
|
61
|
-
for (let i = 0; i < 10; i++) {
|
|
62
|
-
await sleep(300);
|
|
63
|
-
yield { i };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function sleep(ms: number) {
|
|
68
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
#### Build and serve the API
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
spiceflow serve --watch
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
#### Call your function from the client, these will use fetch to communicate with the server
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
import {
|
|
82
|
-
spiceflowFunction,
|
|
83
|
-
spiceflowGenerator,
|
|
84
|
-
} from './my-api/dist/v1/functions';
|
|
85
|
-
|
|
86
|
-
// will call the server with fetch
|
|
87
|
-
const { hello } = await spiceflowFunction();
|
|
88
|
-
|
|
89
|
-
for await (const { i } of spiceflowGenerator()) {
|
|
90
|
-
console.log(i);
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Serving your API
|
|
95
|
-
|
|
96
|
-
Spiceflow has 3 ways to serve your API:
|
|
97
|
-
|
|
98
|
-
### Built-in Node.js server
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
spiceflow serve --port 3333
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### Next.js pages API handler
|
|
105
|
-
|
|
106
|
-
> Note: You will need to call `spiceflow build` before using the SDK when using this method
|
|
107
|
-
|
|
108
|
-
```tsx
|
|
109
|
-
// pages/api/spiceflow/[...slug].tsx
|
|
110
|
-
import { nodeJsHandler } from './my-api/server';
|
|
111
|
-
|
|
112
|
-
export default async function handler(req, res) {
|
|
113
|
-
return await nodeJsHandler({ req, res, basePath: '/api/spiceflow' });
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Next.js app API route
|
|
118
|
-
|
|
119
|
-
```tsx
|
|
120
|
-
// pages/api/spiceflow/[...slug]/route.tsx
|
|
121
|
-
import { edgeHandler } from './my-api/server';
|
|
122
|
-
|
|
123
|
-
export const POST = edgeHandler;
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
After exposing your server you will need to rebuild your client sdk using that url:
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
spiceflow build --url http://localhost:3000/api/spiceflow # the Next.js app url
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Accessing the request and response objects
|
|
133
|
-
|
|
134
|
-
This plugin injects the `req` and `res` objects in an `AsyncLocalStorage` context, so you can access them in your server functions:
|
|
135
|
-
|
|
136
|
-
```ts
|
|
137
|
-
'use spiceflow';
|
|
138
|
-
|
|
139
|
-
import { getNodejsContext } from 'spiceflow/context';
|
|
140
|
-
|
|
141
|
-
export async function serverAction({}) {
|
|
142
|
-
const { req } = getNodejsContext();
|
|
143
|
-
const host = req?.headers.get('host');
|
|
144
|
-
return { host };
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
## Adding error logging and handling
|
|
149
|
-
|
|
150
|
-
You can export a function named `wrapMethod` to easily wrap all your server actions with error logging or other wrappers
|
|
151
|
-
|
|
152
|
-
```ts
|
|
153
|
-
'use spiceflow';
|
|
154
|
-
|
|
155
|
-
export function wrapMethod(fn) {
|
|
156
|
-
return async (...args) => {
|
|
157
|
-
try {
|
|
158
|
-
const res = await fn(...args);
|
|
159
|
-
return res;
|
|
160
|
-
} catch (error) {
|
|
161
|
-
console.error(error);
|
|
162
|
-
throw error;
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export async function failingFunction({}) {
|
|
168
|
-
throw new Error('This function fails');
|
|
169
|
-
}
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
## Versioning
|
|
173
|
-
|
|
174
|
-
You can create a `v1` folder in your project and exports your function from `index.ts`, when you want to release a breaking version of your API, you can create a new folder and change the imports in `index.ts` file. This way the sdk users will always use the latest version of your API, while old SDK users will keep the old version.
|
|
175
|
-
|
|
176
|
-
## How it works
|
|
177
|
-
|
|
178
|
-
Spiceflow `build` command transpiles the files with the `use spiceflow` directive so that any exported function will use fetch to send arguments and get the result, the the transformed files are saved in the `dist` folder.Other files are compiled to the dist directory using `tsc`.
|
|
179
|
-
|
|
180
|
-
Spiceflow also bundles the type definitions with `@microsoft/api-extractor` so the generated dist files don't rely on external local packages and can be safely published to npm.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAc,CACvB,MAAM,GAAG,MAAM,EACf,KAAK,SAAS,GAAG,GAAG,GAAG,CACzB,SAAQ,KAAK;IAGA,MAAM,EAAE,MAAM;IACd,WAAW,EAAE,KAAK;IAH7B,KAAK,EAAE,KAAK,CAAA;gBAED,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,KAAK;CAahC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class EdenFetchError extends Error {
|
|
2
|
+
constructor(status, passedValue) {
|
|
3
|
+
let message = String((passedValue === null || passedValue === void 0 ? void 0 : passedValue.message) || '');
|
|
4
|
+
if (!message) {
|
|
5
|
+
if (typeof passedValue === 'object') {
|
|
6
|
+
message = JSON.stringify(passedValue);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
message = String(passedValue || '');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
super(message);
|
|
13
|
+
this.status = status;
|
|
14
|
+
this.passedValue = passedValue;
|
|
15
|
+
this.value = passedValue;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAGX,SAAQ,KAAK;IAEX,YACW,MAAc,EACd,WAAkB;QAEzB,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,WAAmB,aAAnB,WAAW,uBAAX,WAAW,CAAU,OAAO,KAAI,EAAE,CAAC,CAAA;QACzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAClC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;YACvC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,CAAA;QAXP,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAO;QAWzB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;IAC5B,CAAC;CACJ"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Elysia } from '../spiceflow';
|
|
2
|
+
import type { Treaty as SpiceflowClient } from './types';
|
|
3
|
+
interface SSEEvent {
|
|
4
|
+
event: string;
|
|
5
|
+
data: any;
|
|
6
|
+
id?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class TextDecoderStream extends TransformStream<Uint8Array, string> {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
export declare function streamSSEResponse(response: Response): AsyncGenerator<SSEEvent>;
|
|
12
|
+
export declare const createSpiceflowClient: <const App extends Elysia<any, any, any, any, any, any, any, any>>(domain: string | App, config?: SpiceflowClient.Config) => SpiceflowClient.Create<App>;
|
|
13
|
+
export type { SpiceflowClient as Treaty };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,SAAS,CAAA;AA8GxD,UAAU,QAAQ;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,GAAG,CAAA;IACT,EAAE,CAAC,EAAE,MAAM,CAAA;CACX;AAED,qBAAa,iBAAkB,SAAQ,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC;;CAwBzE;AAED,wBAAuB,iBAAiB,CACvC,QAAQ,EAAE,QAAQ,GAChB,cAAc,CAAC,QAAQ,CAAC,CAmB1B;AAqVD,eAAO,MAAM,qBAAqB,6EAGzB,MAAM,GAAG,GAAG,WACZ,gBAAgB,MAAM,KAC5B,gBAAgB,MAAM,CAAC,GAAG,CAqB5B,CAAA;AAED,YAAY,EAAE,eAAe,IAAI,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1,376 @@
|
|
|
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 = {}, 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
|
+
import { EventSourceParserStream } from 'eventsource-parser/stream';
|
|
15
|
+
import { EdenFetchError } from './errors';
|
|
16
|
+
// import { EdenWS } from './ws'
|
|
17
|
+
import { parseStringifiedValue } from './utils';
|
|
18
|
+
const method = [
|
|
19
|
+
'get',
|
|
20
|
+
'post',
|
|
21
|
+
'put',
|
|
22
|
+
'delete',
|
|
23
|
+
'patch',
|
|
24
|
+
'options',
|
|
25
|
+
'head',
|
|
26
|
+
'connect',
|
|
27
|
+
'subscribe'
|
|
28
|
+
];
|
|
29
|
+
const locals = ['localhost', '127.0.0.1', '0.0.0.0'];
|
|
30
|
+
const isServer = typeof FileList === 'undefined';
|
|
31
|
+
const isFile = (v) => {
|
|
32
|
+
if (isServer)
|
|
33
|
+
return v instanceof Blob;
|
|
34
|
+
return v instanceof FileList || v instanceof File;
|
|
35
|
+
};
|
|
36
|
+
// FormData is 1 level deep
|
|
37
|
+
const hasFile = (obj) => {
|
|
38
|
+
if (!obj)
|
|
39
|
+
return false;
|
|
40
|
+
for (const key in obj) {
|
|
41
|
+
if (isFile(obj[key]))
|
|
42
|
+
return true;
|
|
43
|
+
if (Array.isArray(obj[key]) && obj[key].find(isFile))
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
const createNewFile = (v) => isServer
|
|
49
|
+
? v
|
|
50
|
+
: new Promise((resolve) => {
|
|
51
|
+
const reader = new FileReader();
|
|
52
|
+
reader.onload = () => {
|
|
53
|
+
const file = new File([reader.result], v.name, {
|
|
54
|
+
lastModified: v.lastModified,
|
|
55
|
+
type: v.type
|
|
56
|
+
});
|
|
57
|
+
resolve(file);
|
|
58
|
+
};
|
|
59
|
+
reader.readAsArrayBuffer(v);
|
|
60
|
+
});
|
|
61
|
+
const processHeaders = (h, path, options = {}, headers = {}) => {
|
|
62
|
+
if (Array.isArray(h)) {
|
|
63
|
+
for (const value of h)
|
|
64
|
+
if (!Array.isArray(value))
|
|
65
|
+
headers = processHeaders(value, path, options, headers);
|
|
66
|
+
else {
|
|
67
|
+
const key = value[0];
|
|
68
|
+
if (typeof key === 'string')
|
|
69
|
+
headers[key.toLowerCase()] = value[1];
|
|
70
|
+
else
|
|
71
|
+
for (const [k, value] of key)
|
|
72
|
+
headers[k.toLowerCase()] = value;
|
|
73
|
+
}
|
|
74
|
+
return headers;
|
|
75
|
+
}
|
|
76
|
+
if (!h)
|
|
77
|
+
return headers;
|
|
78
|
+
switch (typeof h) {
|
|
79
|
+
case 'function':
|
|
80
|
+
if (h instanceof Headers)
|
|
81
|
+
return processHeaders(h, path, options, headers);
|
|
82
|
+
const v = h(path, options);
|
|
83
|
+
if (v)
|
|
84
|
+
return processHeaders(v, path, options, headers);
|
|
85
|
+
return headers;
|
|
86
|
+
case 'object':
|
|
87
|
+
if (h instanceof Headers) {
|
|
88
|
+
h.forEach((value, key) => {
|
|
89
|
+
headers[key.toLowerCase()] = value;
|
|
90
|
+
});
|
|
91
|
+
return headers;
|
|
92
|
+
}
|
|
93
|
+
for (const [key, value] of Object.entries(h))
|
|
94
|
+
headers[key.toLowerCase()] = value;
|
|
95
|
+
return headers;
|
|
96
|
+
default:
|
|
97
|
+
return headers;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
export class TextDecoderStream extends TransformStream {
|
|
101
|
+
constructor() {
|
|
102
|
+
const decoder = new TextDecoder('utf-8', {
|
|
103
|
+
fatal: true,
|
|
104
|
+
ignoreBOM: true
|
|
105
|
+
});
|
|
106
|
+
super({
|
|
107
|
+
transform(chunk, controller) {
|
|
108
|
+
const decoded = decoder.decode(chunk, { stream: true });
|
|
109
|
+
if (decoded.length > 0) {
|
|
110
|
+
controller.enqueue(decoded);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
flush(controller) {
|
|
114
|
+
const output = decoder.decode();
|
|
115
|
+
if (output.length > 0) {
|
|
116
|
+
controller.enqueue(output);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function streamSSEResponse(response) {
|
|
123
|
+
return __asyncGenerator(this, arguments, function* streamSSEResponse_1() {
|
|
124
|
+
const body = response.body;
|
|
125
|
+
if (!body)
|
|
126
|
+
return yield __await(void 0);
|
|
127
|
+
const eventStream = response.body
|
|
128
|
+
.pipeThrough(new TextDecoderStream())
|
|
129
|
+
.pipeThrough(new EventSourceParserStream());
|
|
130
|
+
let reader = eventStream.getReader();
|
|
131
|
+
while (true) {
|
|
132
|
+
const { done, value: event } = yield __await(reader.read());
|
|
133
|
+
if (done)
|
|
134
|
+
break;
|
|
135
|
+
if ((event === null || event === void 0 ? void 0 : event.event) === 'error') {
|
|
136
|
+
throw new EdenFetchError(500, event.data);
|
|
137
|
+
}
|
|
138
|
+
if (event) {
|
|
139
|
+
yield yield __await(tryParsingJson(event.data));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function tryParsingJson(data) {
|
|
145
|
+
try {
|
|
146
|
+
return JSON.parse(data);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const createProxy = (domain, config, paths = [], elysia) => new Proxy(() => { }, {
|
|
153
|
+
get(_, param) {
|
|
154
|
+
return createProxy(domain, config, param === 'index' ? paths : [...paths, param], elysia);
|
|
155
|
+
},
|
|
156
|
+
apply(_, __, [body, options]) {
|
|
157
|
+
if (!body ||
|
|
158
|
+
options ||
|
|
159
|
+
(typeof body === 'object' && Object.keys(body).length !== 1) ||
|
|
160
|
+
method.includes(paths.at(-1))) {
|
|
161
|
+
const methodPaths = [...paths];
|
|
162
|
+
const method = methodPaths.pop();
|
|
163
|
+
const path = '/' + methodPaths.join('/');
|
|
164
|
+
let { fetcher = fetch, headers, onRequest, onResponse, fetch: conf } = config;
|
|
165
|
+
const isGetOrHead = method === 'get' ||
|
|
166
|
+
method === 'head' ||
|
|
167
|
+
method === 'subscribe';
|
|
168
|
+
headers = processHeaders(headers, path, options);
|
|
169
|
+
const query = isGetOrHead
|
|
170
|
+
? body === null || body === void 0 ? void 0 : body.query
|
|
171
|
+
: options === null || options === void 0 ? void 0 : options.query;
|
|
172
|
+
let q = '';
|
|
173
|
+
if (query) {
|
|
174
|
+
const append = (key, value) => {
|
|
175
|
+
q +=
|
|
176
|
+
(q ? '&' : '?') +
|
|
177
|
+
`${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
|
|
178
|
+
};
|
|
179
|
+
for (const [key, value] of Object.entries(query)) {
|
|
180
|
+
if (Array.isArray(value)) {
|
|
181
|
+
for (const v of value)
|
|
182
|
+
append(key, v);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (typeof value === 'object') {
|
|
186
|
+
append(key, JSON.stringify(value));
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
append(key, `${value}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// if (method === 'subscribe') {
|
|
193
|
+
// const url =
|
|
194
|
+
// domain.replace(
|
|
195
|
+
// /^([^]+):\/\//,
|
|
196
|
+
// domain.startsWith('https://')
|
|
197
|
+
// ? 'wss://'
|
|
198
|
+
// : domain.startsWith('http://')
|
|
199
|
+
// ? 'ws://'
|
|
200
|
+
// : locals.find((v) =>
|
|
201
|
+
// (domain as string).includes(v)
|
|
202
|
+
// )
|
|
203
|
+
// ? 'ws://'
|
|
204
|
+
// : 'wss://'
|
|
205
|
+
// ) +
|
|
206
|
+
// path +
|
|
207
|
+
// q
|
|
208
|
+
// return new EdenWS(url)
|
|
209
|
+
// }
|
|
210
|
+
return (async () => {
|
|
211
|
+
var _a, _b;
|
|
212
|
+
let fetchInit = Object.assign(Object.assign({ method: method === null || method === void 0 ? void 0 : method.toUpperCase(), body }, conf), { headers });
|
|
213
|
+
fetchInit.headers = Object.assign(Object.assign({}, headers), processHeaders(
|
|
214
|
+
// For GET and HEAD, options is moved to body (1st param)
|
|
215
|
+
isGetOrHead ? body === null || body === void 0 ? void 0 : body.headers : options === null || options === void 0 ? void 0 : options.headers, path, fetchInit));
|
|
216
|
+
const fetchOpts = isGetOrHead && typeof body === 'object'
|
|
217
|
+
? body.fetch
|
|
218
|
+
: options === null || options === void 0 ? void 0 : options.fetch;
|
|
219
|
+
fetchInit = Object.assign(Object.assign({}, fetchInit), fetchOpts);
|
|
220
|
+
if (isGetOrHead)
|
|
221
|
+
delete fetchInit.body;
|
|
222
|
+
if (onRequest) {
|
|
223
|
+
if (!Array.isArray(onRequest))
|
|
224
|
+
onRequest = [onRequest];
|
|
225
|
+
for (const value of onRequest) {
|
|
226
|
+
const temp = await value(path, fetchInit);
|
|
227
|
+
if (typeof temp === 'object')
|
|
228
|
+
fetchInit = Object.assign(Object.assign(Object.assign({}, fetchInit), temp), { headers: Object.assign(Object.assign({}, fetchInit.headers), processHeaders(temp.headers, path, fetchInit)) });
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// ? Duplicate because end-user might add a body in onRequest
|
|
232
|
+
if (isGetOrHead)
|
|
233
|
+
delete fetchInit.body;
|
|
234
|
+
if (hasFile(body)) {
|
|
235
|
+
const formData = new FormData();
|
|
236
|
+
// FormData is 1 level deep
|
|
237
|
+
for (const [key, field] of Object.entries(fetchInit.body)) {
|
|
238
|
+
if (isServer) {
|
|
239
|
+
formData.append(key, field);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (field instanceof File) {
|
|
243
|
+
formData.append(key, await createNewFile(field));
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (field instanceof FileList) {
|
|
247
|
+
for (let i = 0; i < field.length; i++)
|
|
248
|
+
formData.append(key, await createNewFile(field[i]));
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (Array.isArray(field)) {
|
|
252
|
+
for (let i = 0; i < field.length; i++) {
|
|
253
|
+
const value = field[i];
|
|
254
|
+
formData.append(key, value instanceof File
|
|
255
|
+
? await createNewFile(value)
|
|
256
|
+
: value);
|
|
257
|
+
}
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
formData.append(key, field);
|
|
261
|
+
}
|
|
262
|
+
// We don't do this because we need to let the browser set the content type with the correct boundary
|
|
263
|
+
// fetchInit.headers['content-type'] = 'multipart/form-data'
|
|
264
|
+
fetchInit.body = formData;
|
|
265
|
+
}
|
|
266
|
+
else if (typeof body === 'object') {
|
|
267
|
+
;
|
|
268
|
+
fetchInit.headers['content-type'] = 'application/json';
|
|
269
|
+
fetchInit.body = JSON.stringify(body);
|
|
270
|
+
}
|
|
271
|
+
else if (body !== undefined && body !== null) {
|
|
272
|
+
;
|
|
273
|
+
fetchInit.headers['content-type'] = 'text/plain';
|
|
274
|
+
}
|
|
275
|
+
if (isGetOrHead)
|
|
276
|
+
delete fetchInit.body;
|
|
277
|
+
if (onRequest) {
|
|
278
|
+
if (!Array.isArray(onRequest))
|
|
279
|
+
onRequest = [onRequest];
|
|
280
|
+
for (const value of onRequest) {
|
|
281
|
+
const temp = await value(path, fetchInit);
|
|
282
|
+
if (typeof temp === 'object')
|
|
283
|
+
fetchInit = Object.assign(Object.assign(Object.assign({}, fetchInit), temp), { headers: Object.assign(Object.assign({}, fetchInit.headers), processHeaders(temp.headers, path, fetchInit)) });
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const url = domain + path + q;
|
|
287
|
+
const response = await ((_a = elysia === null || elysia === void 0 ? void 0 : elysia.handle(new Request(url, fetchInit))) !== null && _a !== void 0 ? _a : fetcher(url, fetchInit));
|
|
288
|
+
let data = null;
|
|
289
|
+
let error = null;
|
|
290
|
+
if (onResponse) {
|
|
291
|
+
if (!Array.isArray(onResponse))
|
|
292
|
+
onResponse = [onResponse];
|
|
293
|
+
for (const value of onResponse)
|
|
294
|
+
try {
|
|
295
|
+
const temp = await value(response.clone());
|
|
296
|
+
if (temp !== undefined && temp !== null) {
|
|
297
|
+
data = temp;
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
if (err instanceof EdenFetchError)
|
|
303
|
+
error = err;
|
|
304
|
+
else
|
|
305
|
+
error = new EdenFetchError(422, err);
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (data !== null) {
|
|
310
|
+
return {
|
|
311
|
+
data,
|
|
312
|
+
error,
|
|
313
|
+
response,
|
|
314
|
+
status: response.status,
|
|
315
|
+
headers: response.headers
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
switch ((_b = response.headers.get('Content-Type')) === null || _b === void 0 ? void 0 : _b.split(';')[0]) {
|
|
319
|
+
case 'text/event-stream':
|
|
320
|
+
data = streamSSEResponse(response);
|
|
321
|
+
break;
|
|
322
|
+
case 'application/json':
|
|
323
|
+
data = await response.json();
|
|
324
|
+
break;
|
|
325
|
+
case 'application/octet-stream':
|
|
326
|
+
data = await response.arrayBuffer();
|
|
327
|
+
break;
|
|
328
|
+
case 'multipart/form-data':
|
|
329
|
+
const temp = await response.formData();
|
|
330
|
+
data = {};
|
|
331
|
+
temp.forEach((value, key) => {
|
|
332
|
+
// @ts-ignore
|
|
333
|
+
data[key] = value;
|
|
334
|
+
});
|
|
335
|
+
break;
|
|
336
|
+
default:
|
|
337
|
+
data = await response
|
|
338
|
+
.text()
|
|
339
|
+
.then(parseStringifiedValue);
|
|
340
|
+
}
|
|
341
|
+
if (response.status >= 300 || response.status < 200) {
|
|
342
|
+
error = new EdenFetchError(response.status, data);
|
|
343
|
+
data = null;
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
data,
|
|
347
|
+
error,
|
|
348
|
+
response,
|
|
349
|
+
status: response.status,
|
|
350
|
+
headers: response.headers
|
|
351
|
+
};
|
|
352
|
+
})();
|
|
353
|
+
}
|
|
354
|
+
if (typeof body === 'object')
|
|
355
|
+
return createProxy(domain, config, [...paths, Object.values(body)[0]], elysia);
|
|
356
|
+
return createProxy(domain, config, paths);
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
export const createSpiceflowClient = (domain, config = {}) => {
|
|
360
|
+
if (typeof domain === 'string') {
|
|
361
|
+
if (!config.keepDomain) {
|
|
362
|
+
if (!domain.includes('://'))
|
|
363
|
+
domain =
|
|
364
|
+
(locals.find((v) => domain.includes(v))
|
|
365
|
+
? 'http://'
|
|
366
|
+
: 'https://') + domain;
|
|
367
|
+
if (domain.endsWith('/'))
|
|
368
|
+
domain = domain.slice(0, -1);
|
|
369
|
+
}
|
|
370
|
+
return createProxy(domain, config);
|
|
371
|
+
}
|
|
372
|
+
if (typeof window !== 'undefined')
|
|
373
|
+
console.warn('Elysia instance server found on client side, this is not recommended for security reason. Use generic type instead.');
|
|
374
|
+
return createProxy('http://e.ly', config, [], domain);
|
|
375
|
+
};
|
|
376
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|