@elysiajs/eden 0.5.1 → 0.5.3

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.
@@ -0,0 +1,4 @@
1
+ import type { Elysia } from 'elysia';
2
+ import type { EdenFetch } from './types';
3
+ export type { EdenFetch } from './types';
4
+ export declare const edenFetch: <App extends Elysia<any>>(server: string, config?: EdenFetch.Config) => EdenFetch.Create<App>;
@@ -0,0 +1,32 @@
1
+ /// <reference types="bun-types" />
2
+ import type { Elysia, SCHEMA } from 'elysia';
3
+ import type { EdenFetchError } from '../utils';
4
+ import type { MapError, IsUnknown, IsNever } from '../types';
5
+ export declare namespace EdenFetch {
6
+ type Create<App extends Elysia<any>> = App['meta'] extends Record<typeof SCHEMA, infer Schema extends Record<string, any>> ? EdenFetch.Fn<Schema> : 'Please install Elysia before using Eden';
7
+ interface Config {
8
+ }
9
+ type Fn<Schema extends Record<string, any>> = <Endpoint extends keyof Schema, Method extends Extract<keyof Schema[Endpoint], string>, Route extends Schema[Endpoint][Method]>(endpoint: Endpoint, options: Omit<RequestInit, 'body' | 'method' | 'headers'> & ('get' extends Method ? {
10
+ method?: Uppercase<Method>;
11
+ } : {
12
+ method: Uppercase<Method>;
13
+ }) & (IsNever<keyof Route['params']> extends true ? {
14
+ params?: Record<never, string>;
15
+ } : {
16
+ params: Route['params'];
17
+ }) & (undefined extends Route['headers'] ? {
18
+ headers?: Record<string, string>;
19
+ } : {
20
+ headers: Route['headers'];
21
+ }) & (IsUnknown<Route['body']> extends false ? {
22
+ body: Route['body'];
23
+ } : {
24
+ body?: unknown;
25
+ })) => Promise<{
26
+ data: Route['response']['200'];
27
+ error: null;
28
+ } | {
29
+ data: null;
30
+ error: MapError<Route['response']> extends infer Errors ? IsNever<Errors> extends true ? EdenFetchError<number, string> : Errors : EdenFetchError<number, string>;
31
+ }>;
32
+ }
@@ -0,0 +1,4 @@
1
+ import type { Elysia } from 'elysia';
2
+ import type { EdenFn } from './types';
3
+ export type { EdenFn } from './types';
4
+ export declare const edenFn: <App extends Elysia<any>>(domain: string, config?: EdenFn.Config) => EdenFn.Create<App>;
@@ -0,0 +1,24 @@
1
+ /// <reference types="bun-types" />
2
+ import type { Elysia, EXPOSED } from 'elysia';
3
+ export declare namespace EdenFn {
4
+ type Create<App extends Elysia<any>> = App['meta'] extends Record<typeof EXPOSED, infer Schema extends Record<string, any>> ? EdenFn.Compose<Schema> : 'Please install Elysia before using Eden';
5
+ interface Config {
6
+ }
7
+ type Compose<Exposed extends Record<string, any>> = Fn<Exposed> & {
8
+ $set(config: Config): void;
9
+ $clone(config?: Config): Compose<Exposed>;
10
+ };
11
+ type Fn<T> = T extends {
12
+ [EXPOSED]: any;
13
+ value: infer Value;
14
+ } ? Asynctify<Value> : Asynctify<T>;
15
+ interface Config {
16
+ fn?: string;
17
+ fetch?: Omit<RequestInit, 'body'>;
18
+ }
19
+ }
20
+ type Promisify<T extends (...args: any[]) => any> = T extends (...args: infer Args) => infer Return ? Return extends Promise<any> ? T : (...args: Args) => Promise<Return> : never;
21
+ type Asynctify<T> = T extends infer Fn extends (...args: any) => any ? Promisify<Fn> : T extends Record<string, any> ? {
22
+ [K in keyof T]: EdenFn.Fn<T[K]>;
23
+ } : never;
24
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { EdenFn } from './types';
2
+ export declare class Signal {
3
+ private url;
4
+ private config;
5
+ private pendings;
6
+ private operation;
7
+ private isFetching;
8
+ private sJson;
9
+ constructor(url: string, config?: EdenFn.Config);
10
+ setConfig(config: EdenFn.Config): void;
11
+ clone(config?: EdenFn.Config): Signal;
12
+ run(procedure: string[], params: any): Promise<any>;
13
+ }
@@ -0,0 +1,3 @@
1
+ export { edenTreaty } from './treaty';
2
+ export { edenFetch } from './fetch';
3
+ export { edenFn } from './fn';
@@ -0,0 +1,17 @@
1
+ /// <reference types="bun-types" />
2
+ import type { Elysia, TypedSchema } from 'elysia';
3
+ import type { EdenTreaty } from './types';
4
+ export type { EdenTreaty } from './types';
5
+ export declare class EdenWS<Schema extends TypedSchema<any> = TypedSchema> {
6
+ ws: WebSocket;
7
+ url: string;
8
+ constructor(url: string);
9
+ send(data: Schema['body'] | Schema['body'][]): this;
10
+ on<K extends keyof WebSocketEventMap>(type: K, listener: (event: EdenTreaty.WSEvent<K, Schema['response']>) => void, options?: boolean | AddEventListenerOptions): this;
11
+ off<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): this;
12
+ subscribe(onMessage: (event: EdenTreaty.WSEvent<'message', Schema['response']>) => void, options?: boolean | AddEventListenerOptions): this;
13
+ addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (event: EdenTreaty.WSEvent<K, Schema['response']>) => void, options?: boolean | AddEventListenerOptions): this;
14
+ removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): this;
15
+ close(): this;
16
+ }
17
+ export declare const edenTreaty: <App extends Elysia<any>>(domain: string, config?: {}) => EdenTreaty.Create<App>;
@@ -0,0 +1 @@
1
+ export declare const composePath: (domain: string, path: string, query: Record<string, string> | undefined) => string;
package/dist/treaty.js CHANGED
@@ -1 +1 @@
1
- "use strict";var N=Object.defineProperty;var O=(r,e,t)=>e in r?N(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var w=(r,e,t)=>(O(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./utils-a2cfc56a.js"),j=(r,e,t)=>{if(r.endsWith("/")||(r+="/"),e==="index"&&(e=""),!t||!Object.keys(t).length)return`${r}${e}`;let n="";for(const[f,s]of Object.entries(t))n+=`${f}=${s}&`;return`${r}${e}?${n.slice(0,-1)}`},v=r=>typeof FileList>"u"?!1:r instanceof FileList||r instanceof File,k=r=>{for(let e in r){if(v(r[e]))return!0;if(Array.isArray(r[e])&&r[e].find(t=>v(t)))return!0}return!1},E=r=>new Promise(e=>{const t=new FileReader;t.onload=()=>{e(new Blob([t.result],{type:r.type}))},t.readAsArrayBuffer(r)});class F{constructor(e){w(this,"ws");w(this,"url");this.ws=new WebSocket(e),this.url=e}send(e){return Array.isArray(e)?(e.forEach(t=>this.send(t)),this):(this.ws.send(typeof e=="object"?JSON.stringify(e):e.toString()),this)}on(e,t,n){return this.addEventListener(e,t,n)}off(e,t,n){return this.ws.removeEventListener(e,t,n),this}subscribe(e,t){return this.addEventListener("message",e,t)}addEventListener(e,t,n){return this.ws.addEventListener(e,f=>{if(e==="message"){let s=f.data.toString();const i=s.charCodeAt(0);if(i===47||i===123)try{s=JSON.parse(s)}catch{}else Number.isNaN(+s)?s==="true"?s=!0:s==="fase"&&(s=!1):s=+s;t({...f,data:s})}else t(f)},n),this}removeEventListener(e,t,n){return this.off(e,t,n),this}close(){return this.ws.close(),this}}const S=(r,e="",t)=>new Proxy(()=>{},{get(n,f,s){return S(r,`${e}/${f.toString()}`)},apply(n,f,[{$query:s,$fetch:i,$body:L,...g}={$fetch:void 0,$query:void 0,$body:void 0}]=[{}]){const p=e.lastIndexOf("/"),h=e.slice(p+1),d=j(r,e.slice(0,p),s);return h==="subscribe"?new F(d.replace(/^([^]+):\/\//,d.startsWith("https://")?"wss://":"ws://")):(async()=>{let c=L??(Object.keys(g).length?g:void 0);const y=typeof c=="object",b=y&&k(c);if(b){const o=new FormData;for(const[a,l]of Object.entries(c))if(l instanceof File)o.append(a,await E(l));else if(l instanceof FileList)for(let u=0;u<l.length;u++)o.append(a,await E(l[u]));else o.append(a,l);c=o}else y&&(c=JSON.stringify(c));return fetch(d,{method:h,body:c,...i,headers:c?b?i==null?void 0:i.headers:{"content-type":y?"application/json":"text/plain",...i==null?void 0:i.headers}:i==null?void 0:i.headers}).then(async o=>{var l;let a;switch((l=o.headers.get("Content-Type"))==null?void 0:l.split(";")[0]){case"application/json":a=await o.json();break;default:a=await o.text().then(u=>Number.isNaN(+u)?u==="true"?!0:u==="false"?!1:u:+u)}return o.status>300?{data:a,error:new m.EdenFetchError(o.status,await a)}:{data:a,error:null}})})()}}),x=(r,e={})=>new Proxy({},{get(t,n){return S(r,n)}});exports.EdenWS=F;exports.edenTreaty=x;
1
+ "use strict";var O=Object.defineProperty;var m=(r,e,t)=>e in r?O(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var w=(r,e,t)=>(m(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("./utils-a2cfc56a.js"),k=(r,e,t)=>{if(r.endsWith("/")||(r+="/"),e==="index"&&(e=""),!t||!Object.keys(t).length)return`${r}${e}`;let n="";for(const[f,s]of Object.entries(t))n+=`${f}=${s}&`;return`${r}${e}?${n.slice(0,-1)}`},p=typeof FileList>"u",S=r=>p?r instanceof Blob:r instanceof FileList||r instanceof File,x=r=>{for(let e in r){if(S(r[e]))return!0;if(Array.isArray(r[e])&&r[e].find(t=>S(t)))return!0}return!1},E=r=>p?r:new Promise(e=>{const t=new FileReader;t.onload=()=>{e(new Blob([t.result],{type:r.type}))},t.readAsArrayBuffer(r)});class F{constructor(e){w(this,"ws");w(this,"url");this.ws=new WebSocket(e),this.url=e}send(e){return Array.isArray(e)?(e.forEach(t=>this.send(t)),this):(this.ws.send(typeof e=="object"?JSON.stringify(e):e.toString()),this)}on(e,t,n){return this.addEventListener(e,t,n)}off(e,t,n){return this.ws.removeEventListener(e,t,n),this}subscribe(e,t){return this.addEventListener("message",e,t)}addEventListener(e,t,n){return this.ws.addEventListener(e,f=>{if(e==="message"){let s=f.data.toString();const i=s.charCodeAt(0);if(i===47||i===123)try{s=JSON.parse(s)}catch{}else Number.isNaN(+s)?s==="true"?s=!0:s==="fase"&&(s=!1):s=+s;t({...f,data:s})}else t(f)},n),this}removeEventListener(e,t,n){return this.off(e,t,n),this}close(){return this.ws.close(),this}}const L=(r,e="",t)=>new Proxy(()=>{},{get(n,f,s){return L(r,`${e}/${f.toString()}`)},apply(n,f,[{$query:s,$fetch:i,$body:N,...g}={$fetch:void 0,$query:void 0,$body:void 0}]=[{}]){const h=e.lastIndexOf("/"),b=e.slice(h+1),d=k(r,e.slice(0,h),s);return b==="subscribe"?new F(d.replace(/^([^]+):\/\//,d.startsWith("https://")?"wss://":"ws://")):(async()=>{let c=N??(Object.keys(g).length?g:void 0);const y=typeof c=="object",v=y&&x(c);if(v){const o=new FormData;for(const[a,l]of Object.entries(c))if(p)o.append(a,l);else if(l instanceof File)o.append(a,await E(l));else if(l instanceof FileList)for(let u=0;u<l.length;u++)o.append(a,await E(l[u]));else o.append(a,l);c=o}else y&&(c=JSON.stringify(c));return fetch(d,{method:b,body:c,...i,headers:c?v?i==null?void 0:i.headers:{"content-type":y?"application/json":"text/plain",...i==null?void 0:i.headers}:i==null?void 0:i.headers}).then(async o=>{var l;let a;switch((l=o.headers.get("Content-Type"))==null?void 0:l.split(";")[0]){case"application/json":a=await o.json();break;default:a=await o.text().then(u=>Number.isNaN(+u)?u==="true"?!0:u==="false"?!1:u:+u)}return o.status>300?{data:a,error:new j.EdenFetchError(o.status,await a)}:{data:a,error:null}})})()}}),A=(r,e={})=>new Proxy({},{get(t,n){return L(r,n)}});exports.EdenWS=F;exports.edenTreaty=A;
package/dist/treaty.mjs CHANGED
@@ -1,6 +1,6 @@
1
- var L = Object.defineProperty;
2
- var N = (r, e, t) => e in r ? L(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
- var w = (r, e, t) => (N(r, typeof e != "symbol" ? e + "" : e, t), t);
1
+ var N = Object.defineProperty;
2
+ var S = (r, e, t) => e in r ? N(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
+ var p = (r, e, t) => (S(r, typeof e != "symbol" ? e + "" : e, t), t);
4
4
  import { E as x } from "./utils-5a40996f.mjs";
5
5
  const O = (r, e, t) => {
6
6
  if (r.endsWith("/") || (r += "/"), e === "index" && (e = ""), !t || !Object.keys(t).length)
@@ -9,24 +9,24 @@ const O = (r, e, t) => {
9
9
  for (const [f, s] of Object.entries(t))
10
10
  n += `${f}=${s}&`;
11
11
  return `${r}${e}?${n.slice(0, -1)}`;
12
- }, v = (r) => typeof FileList > "u" ? !1 : r instanceof FileList || r instanceof File, S = (r) => {
12
+ }, w = typeof FileList > "u", E = (r) => w ? r instanceof Blob : r instanceof FileList || r instanceof File, k = (r) => {
13
13
  for (let e in r) {
14
- if (v(r[e]))
14
+ if (E(r[e]))
15
15
  return !0;
16
- if (Array.isArray(r[e]) && r[e].find((t) => v(t)))
16
+ if (Array.isArray(r[e]) && r[e].find((t) => E(t)))
17
17
  return !0;
18
18
  }
19
19
  return !1;
20
- }, E = (r) => new Promise((e) => {
20
+ }, F = (r) => w ? r : new Promise((e) => {
21
21
  const t = new FileReader();
22
22
  t.onload = () => {
23
23
  e(new Blob([t.result], { type: r.type }));
24
24
  }, t.readAsArrayBuffer(r);
25
25
  });
26
- class k {
26
+ class A {
27
27
  constructor(e) {
28
- w(this, "ws");
29
- w(this, "url");
28
+ p(this, "ws");
29
+ p(this, "url");
30
30
  this.ws = new WebSocket(e), this.url = e;
31
31
  }
32
32
  send(e) {
@@ -74,37 +74,42 @@ class k {
74
74
  return this.ws.close(), this;
75
75
  }
76
76
  }
77
- const F = (r, e = "", t) => new Proxy(() => {
77
+ const m = (r, e = "", t) => new Proxy(() => {
78
78
  }, {
79
79
  get(n, f, s) {
80
- return F(r, `${e}/${f.toString()}`);
80
+ return m(r, `${e}/${f.toString()}`);
81
81
  },
82
82
  apply(n, f, [
83
- { $query: s, $fetch: i, $body: m, ...p } = {
83
+ { $query: s, $fetch: i, $body: L, ...g } = {
84
84
  $fetch: void 0,
85
85
  $query: void 0,
86
86
  $body: void 0
87
87
  }
88
88
  ] = [{}]) {
89
- const g = e.lastIndexOf("/"), h = e.slice(g + 1), d = O(r, e.slice(0, g), s);
90
- return h === "subscribe" ? new k(
89
+ const h = e.lastIndexOf("/"), b = e.slice(h + 1), d = O(r, e.slice(0, h), s);
90
+ return b === "subscribe" ? new A(
91
91
  d.replace(
92
92
  /^([^]+):\/\//,
93
93
  d.startsWith("https://") ? "wss://" : "ws://"
94
94
  )
95
95
  ) : (async () => {
96
- let c = m ?? (Object.keys(p).length ? p : void 0);
97
- const y = typeof c == "object", b = y && S(c);
98
- if (b) {
96
+ let c = L ?? (Object.keys(g).length ? g : void 0);
97
+ const y = typeof c == "object", v = y && k(c);
98
+ if (v) {
99
99
  const o = new FormData();
100
100
  for (const [a, l] of Object.entries(c))
101
- if (l instanceof File)
102
- o.append(a, await E(l));
101
+ if (w)
102
+ o.append(a, l);
103
+ else if (l instanceof File)
104
+ o.append(
105
+ a,
106
+ await F(l)
107
+ );
103
108
  else if (l instanceof FileList)
104
109
  for (let u = 0; u < l.length; u++)
105
110
  o.append(
106
111
  a,
107
- await E(l[u])
112
+ await F(l[u])
108
113
  );
109
114
  else
110
115
  o.append(a, l);
@@ -112,11 +117,11 @@ const F = (r, e = "", t) => new Proxy(() => {
112
117
  } else
113
118
  y && (c = JSON.stringify(c));
114
119
  return fetch(d, {
115
- method: h,
120
+ method: b,
116
121
  body: c,
117
122
  // ...config.fetch,
118
123
  ...i,
119
- headers: c ? b ? i == null ? void 0 : i.headers : {
124
+ headers: c ? v ? i == null ? void 0 : i.headers : {
120
125
  "content-type": y ? "application/json" : "text/plain",
121
126
  ...i == null ? void 0 : i.headers
122
127
  } : i == null ? void 0 : i.headers
@@ -141,11 +146,11 @@ const F = (r, e = "", t) => new Proxy(() => {
141
146
  {},
142
147
  {
143
148
  get(t, n) {
144
- return F(r, n);
149
+ return m(r, n);
145
150
  }
146
151
  }
147
152
  );
148
153
  export {
149
- k as EdenWS,
154
+ A as EdenWS,
150
155
  P as edenTreaty
151
156
  };
@@ -0,0 +1,25 @@
1
+ import type { EdenFetchError } from './utils';
2
+ type Range<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
3
+ type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
4
+ type ErrorRange = Range<300, 599>;
5
+ export type MapError<T extends Record<number, unknown>> = [
6
+ {
7
+ [K in keyof T]-?: K extends ErrorRange ? K : never;
8
+ }[keyof T]
9
+ ] extends [infer A extends number] ? {
10
+ [K in A]: EdenFetchError<K, T[K]>;
11
+ }[A] : false;
12
+ export type UnionToIntersect<U> = (U extends unknown ? (arg: U) => 0 : never) extends (arg: infer I) => 0 ? I : never;
13
+ export type IsAny<T> = 0 extends 1 & T ? true : false;
14
+ export type IsNever<T> = [T] extends [never] ? true : false;
15
+ export type IsUnknown<T> = IsAny<T> extends true ? false : unknown extends T ? true : false;
16
+ export type AnyTypedRoute = {
17
+ body: unknown;
18
+ headers: Record<string, any> | undefined;
19
+ query: Record<string, any> | undefined;
20
+ params: Record<string, any> | undefined;
21
+ response: Record<string, unknown> & {
22
+ '200': unknown;
23
+ };
24
+ };
25
+ export {};
@@ -0,0 +1,5 @@
1
+ export declare class EdenFetchError<Status extends number = number, Value = unknown> extends Error {
2
+ status: Status;
3
+ value: Value;
4
+ constructor(status: Status, value: Value);
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elysiajs/eden",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "Fully type-safe Elysia client",
5
5
  "author": {
6
6
  "name": "saltyAom",
@@ -13,25 +13,29 @@
13
13
  "require": "./dist/index.js",
14
14
  "import": "./dist/index.mjs",
15
15
  "node": "./dist/index.js",
16
- "default": "./dist/index.js"
16
+ "default": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
17
18
  },
18
19
  "./treaty": {
19
20
  "require": "./dist/treaty.js",
20
21
  "import": "./dist/treaty.mjs",
21
22
  "node": "./dist/treaty.js",
22
- "default": "./dist/treaty.js"
23
+ "default": "./dist/treaty.js",
24
+ "types": "./dist/treaty/index.d.ts"
23
25
  },
24
26
  "./fetch": {
25
27
  "require": "./dist/fetch.js",
26
28
  "import": "./dist/fetch.mjs",
27
29
  "node": "./dist/fetch.js",
28
- "default": "./dist/fetch.js"
30
+ "default": "./dist/fetch.js",
31
+ "types": "./dist/fetch/index.d.ts"
29
32
  },
30
33
  "./fn": {
31
34
  "require": "./dist/fn.js",
32
35
  "import": "./dist/fn.mjs",
33
36
  "node": "./dist/fn.js",
34
- "default": "./dist/fn.js"
37
+ "default": "./dist/fn.js",
38
+ "types": "./dist/fn/index.d.ts"
35
39
  }
36
40
  },
37
41
  "types": "./src/index.ts",
@@ -50,7 +54,7 @@
50
54
  "scripts": {
51
55
  "dev": "bun run --hot example/index.ts",
52
56
  "test": "bun wiptest",
53
- "build": "vite build",
57
+ "build": "vite build && tsc",
54
58
  "release": "npm run build && npm run test && npm publish --access public"
55
59
  },
56
60
  "peerDependencies": {
@@ -69,7 +73,7 @@
69
73
  "@sinclair/typebox": "^0.26.8",
70
74
  "@types/node": "^18.15.5",
71
75
  "bun-types": "^0.5.8",
72
- "elysia": "0.5.0",
76
+ "elysia": "0.5.17",
73
77
  "eslint": "^8.26.0",
74
78
  "rimraf": "^4.4.1",
75
79
  "typescript": "^5.0.4",
@@ -7,12 +7,17 @@ import type { EdenTreaty } from './types'
7
7
 
8
8
  export type { EdenTreaty } from './types'
9
9
 
10
- const isFile = (v: any) => {
11
- // @ts-ignore
12
- if (typeof FileList === 'undefined') return false
10
+ // @ts-ignore
11
+ const isServer = typeof FileList === 'undefined'
13
12
 
13
+ const isFile = (v: any) => {
14
14
  // @ts-ignore
15
- return v instanceof FileList || v instanceof File
15
+ if (isServer) {
16
+ return v instanceof Blob
17
+ } else {
18
+ // @ts-ignore
19
+ return v instanceof FileList || v instanceof File
20
+ }
16
21
  }
17
22
 
18
23
  // FormData is 1 level deep
@@ -31,16 +36,18 @@ const hasFile = (obj: Record<string, any>) => {
31
36
 
32
37
  // @ts-ignore
33
38
  const fileToBlob = (v: File) =>
34
- new Promise<Blob>((resolve) => {
35
- // @ts-ignore
36
- const reader = new FileReader()
39
+ isServer
40
+ ? v
41
+ : new Promise<Blob>((resolve) => {
42
+ // @ts-ignore
43
+ const reader = new FileReader()
37
44
 
38
- reader.onload = () => {
39
- resolve(new Blob([reader.result!], { type: v.type }))
40
- }
45
+ reader.onload = () => {
46
+ resolve(new Blob([reader.result!], { type: v.type }))
47
+ }
41
48
 
42
- reader.readAsArrayBuffer(v)
43
- })
49
+ reader.readAsArrayBuffer(v)
50
+ })
44
51
 
45
52
  export class EdenWS<Schema extends TypedSchema<any> = TypedSchema> {
46
53
  ws: WebSocket
@@ -184,19 +191,26 @@ const createProxy = (
184
191
 
185
192
  // FormData is 1 level deep
186
193
  for (const [key, field] of Object.entries(body)) {
187
- // @ts-ignore
188
- if (field instanceof File)
189
- newBody.append(key, await fileToBlob(field as any))
190
- // @ts-ignore
191
- else if (field instanceof FileList) {
194
+ if (isServer) {
195
+ newBody.append(key, field as any)
196
+ } else {
192
197
  // @ts-ignore
193
- for (let i = 0; i < field.length; i++) {
198
+ if (field instanceof File)
194
199
  newBody.append(
195
- key as any,
196
- await fileToBlob((field as any)[i])
200
+ key,
201
+ await fileToBlob(field as any)
197
202
  )
198
- }
199
- } else newBody.append(key, field as string)
203
+ // @ts-ignore
204
+ else if (field instanceof FileList) {
205
+ // @ts-ignore
206
+ for (let i = 0; i < field.length; i++) {
207
+ newBody.append(
208
+ key as any,
209
+ await fileToBlob((field as any)[i])
210
+ )
211
+ }
212
+ } else newBody.append(key, field as string)
213
+ }
200
214
  }
201
215
 
202
216
  body = newBody