@sx3/ultra 0.1.4 → 0.2.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.
Files changed (37) hide show
  1. package/README.md +4 -4
  2. package/dist/auth.d.mts +4 -4
  3. package/dist/auth.mjs +1 -1
  4. package/dist/client.d.mts +26 -7
  5. package/dist/client.mjs +1 -1
  6. package/dist/compression.d.mts +5 -0
  7. package/dist/compression.mjs +1 -0
  8. package/dist/{context-CygqISTC.d.mts → context-BdPiiQY2.d.mts} +1 -1
  9. package/dist/context.d.mts +1 -1
  10. package/dist/cors.d.mts +3 -3
  11. package/dist/cors.mjs +1 -1
  12. package/dist/error.mjs +1 -1
  13. package/dist/{http-CzPARBt4.d.mts → http-DW9-I0jB.d.mts} +1 -1
  14. package/dist/http.d.mts +1 -1
  15. package/dist/{middleware-C5N5WjuQ.d.mts → middleware-pLpb5aaJ.d.mts} +3 -3
  16. package/dist/middleware.d.mts +2 -2
  17. package/dist/{procedure-DXkuVTmF.mjs → procedure-DqhXrslI.mjs} +1 -1
  18. package/dist/procedure.d.mts +2 -2
  19. package/dist/procedure.mjs +1 -1
  20. package/dist/{response-jq-JlZZH.mjs → response-Cg3awmqM.mjs} +1 -1
  21. package/dist/response.mjs +1 -1
  22. package/dist/rpc-BzGFmZuu.d.mts +23 -0
  23. package/dist/rpc.d.mts +1 -22
  24. package/dist/rpc.mjs +1 -1
  25. package/dist/session.d.mts +4 -4
  26. package/dist/session.mjs +1 -1
  27. package/dist/types.d.mts +1 -1
  28. package/dist/ultra.d.mts +7 -5
  29. package/dist/ultra.mjs +1 -1
  30. package/dist/{validation-s1s8P8HO.mjs → validation-DdDXJNvN.mjs} +1 -1
  31. package/dist/validation.d.mts +1 -1
  32. package/dist/validation.mjs +1 -1
  33. package/package.json +1 -1
  34. /package/dist/{error-CvEWFOYT.mjs → error-45bzsfk8.mjs} +0 -0
  35. /package/dist/{rpc-D9H6IkRD.mjs → rpc-Hr71rqEs.mjs} +0 -0
  36. /package/dist/{types-DshrwR9G.d.mts → types-DDhVsVEu.d.mts} +0 -0
  37. /package/dist/{validation-DzxNLrxi.d.mts → validation-CBofLqUN.d.mts} +0 -0
package/README.md CHANGED
@@ -38,20 +38,20 @@ import { Ultra } from '@sx3/ultra';
38
38
  // User module
39
39
  const users = new Ultra().routes(input => ({
40
40
  users: {
41
- list: input().http().handler(() => [
41
+ list: input().http().handler(() => ([
42
42
  { id: 1, name: 'Alice' },
43
43
  { id: 2, name: 'Bob' }
44
- ])
44
+ ]))
45
45
  }
46
46
  }));
47
47
 
48
48
  // Book module
49
49
  const books = new Ultra().routes(input => ({
50
50
  books: {
51
- list: input().http().handler(() => [
51
+ list: input().http().handler(() => ([
52
52
  { id: 1, title: 'TypeScript' },
53
53
  { id: 2, title: 'Brave New World' }
54
- ]),
54
+ ])),
55
55
  }
56
56
  }));
57
57
 
package/dist/auth.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { s as Promisable } from "./types-DshrwR9G.mjs";
2
- import { n as DeriveRecord, t as BaseContext } from "./context-CygqISTC.mjs";
3
- import "./http-CzPARBt4.mjs";
4
- import { t as Middleware } from "./middleware-C5N5WjuQ.mjs";
1
+ import { s as Promisable } from "./types-DDhVsVEu.mjs";
2
+ import { n as DeriveRecord, t as BaseContext } from "./context-BdPiiQY2.mjs";
3
+ import "./http-DW9-I0jB.mjs";
4
+ import { t as Middleware } from "./middleware-pLpb5aaJ.mjs";
5
5
  import { ProceduresMap, Ultra } from "./ultra.mjs";
6
6
  import { SessionContext } from "./session.mjs";
7
7
 
package/dist/auth.mjs CHANGED
@@ -1 +1 @@
1
- import{r as e}from"./error-CvEWFOYT.mjs";import{Ultra as t}from"./ultra.mjs";function n(e){return e}function r(e){return new t().derive(t=>({auth:new o(e,t)}))}const i=async t=>await t.context.auth.check()?t.next():new e,a=async t=>await t.context.auth.check()?new e:t.next();var o=class e{config;context;usingProvider;providerCache;constructor(e,t,n=e.provider,r=new Map){this.config=e,this.context=t,this.usingProvider=n,this.providerCache=r}use(t){return new e(this.config,this.context,t,this.providerCache)}get user(){return this.provider.user}check(){return this.provider.check()}login(e){return this.provider.login(e)}logout(){return this.provider.logout()}setUser(e){return this.provider.setUser(e)}get provider(){let e=this.providerCache.get(this.usingProvider);if(e)return e;let t=this.config.providers[this.usingProvider];if(!t)throw Error(`Auth provider "${String(this.usingProvider)}" is not configured.`);let n=t(this.context);return this.providerCache.set(this.usingProvider,n),n}},s=class{context;sessionKey;constructor(e,t=`user`){this.context=e,this.sessionKey=t}get user(){return this.context.session.get(this.sessionKey)||null}check(){return this.user!==null}login(e){this.setUser(e),this.context.session.regenerate()}logout(){this.context.session.delete(this.sessionKey)}setUser(e){this.context.session.set(this.sessionKey,e)}};export{o as Auth,s as SessionAuthProvider,r as createAuthModule,n as defineConfig,i as isAuthenticated,a as isGuest};
1
+ import{r as e}from"./error-45bzsfk8.mjs";import{Ultra as t}from"./ultra.mjs";function n(e){return e}function r(e){return new t().derive(t=>({auth:new o(e,t)}))}const i=async t=>await t.context.auth.check()?t.next():new e,a=async t=>await t.context.auth.check()?new e:t.next();var o=class e{config;context;usingProvider;providerCache;constructor(e,t,n=e.provider,r=new Map){this.config=e,this.context=t,this.usingProvider=n,this.providerCache=r}use(t){return new e(this.config,this.context,t,this.providerCache)}get user(){return this.provider.user}check(){return this.provider.check()}login(e){return this.provider.login(e)}logout(){return this.provider.logout()}setUser(e){return this.provider.setUser(e)}get provider(){let e=this.providerCache.get(this.usingProvider);if(e)return e;let t=this.config.providers[this.usingProvider];if(!t)throw Error(`Auth provider "${String(this.usingProvider)}" is not configured.`);let n=t(this.context);return this.providerCache.set(this.usingProvider,n),n}},s=class{context;sessionKey;constructor(e,t=`user`){this.context=e,this.sessionKey=t}get user(){return this.context.session.get(this.sessionKey)||null}check(){return this.user!==null}login(e){this.setUser(e),this.context.session.regenerate()}logout(){this.context.session.delete(this.sessionKey)}setUser(e){this.context.session.set(this.sessionKey,e)}};export{o as Auth,s as SessionAuthProvider,r as createAuthModule,n as defineConfig,i as isAuthenticated,a as isGuest};
package/dist/client.d.mts CHANGED
@@ -1,24 +1,43 @@
1
- import { l as Simplify } from "./types-DshrwR9G.mjs";
2
- import "./context-CygqISTC.mjs";
3
- import "./http-CzPARBt4.mjs";
4
- import { i as Procedure } from "./middleware-C5N5WjuQ.mjs";
1
+ import { l as Simplify } from "./types-DDhVsVEu.mjs";
2
+ import "./context-BdPiiQY2.mjs";
3
+ import "./http-DW9-I0jB.mjs";
4
+ import { i as Procedure } from "./middleware-pLpb5aaJ.mjs";
5
5
  import { ProceduresMap, Ultra } from "./ultra.mjs";
6
6
 
7
7
  //#region src/client.d.ts
8
+ type SocketMessage = string | Blob | ArrayBufferLike | ArrayBufferView<ArrayBufferLike>;
8
9
  type GetProcedures<T$1> = T$1 extends Ultra<infer P, any, any> ? P : never;
9
- type ProcedureFunction<I$1, O$1, CO$1> = undefined extends I$1 ? (input?: I$1, callOptions?: CO$1) => Promise<O$1> : (input: I$1, callOptions?: CO$1) => Promise<O$1>;
10
+ type ProcedureFunction<I$1, O$1, CO$1> = undefined extends I$1 ? (input?: I$1, invokeOptions?: CO$1) => Promise<O$1> : (input: I$1, invokeOptions?: CO$1) => Promise<O$1>;
10
11
  type BuildClient<P, CO$1> = Simplify<{ [K in keyof P]: P[K] extends ProceduresMap ? BuildClient<P[K], CO$1> : P[K] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO$1> : never }>;
11
- type Invoke<CO$1> = (method: string, params: unknown, callOptions?: CO$1) => Promise<unknown>;
12
+ type Invoke<CO$1> = (method: string, params: any, invokeOptions?: CO$1) => Promise<unknown>;
12
13
  interface HTTPClientOptions extends Omit<RequestInit, 'body'> {
13
14
  baseUrl: string;
15
+ /** @default 10 seconds */
14
16
  timeout?: number;
15
17
  }
16
18
  declare function createHTTPClient<U extends Ultra<any, any, any>>(clientOptions: HTTPClientOptions): Simplify<GetProcedures<U> extends infer T ? { [K in keyof T]: T[K] extends ProceduresMap ? Simplify<T[K] extends infer T_1 ? { [K_2 in keyof T_1]: T_1[K_2] extends ProceduresMap ? Simplify<T_1[K_2] extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] extends ProceduresMap ? Simplify<T_2[K_3] extends infer T_3 ? { [K_4 in keyof T_3]: T_3[K_4] extends ProceduresMap ? Simplify<T_3[K_4] extends infer T_4 ? { [K_5 in keyof T_4]: T_4[K_5] extends ProceduresMap ? Simplify<T_4[K_5] extends infer T_5 ? { [K_6 in keyof T_5]: T_5[K_6] extends ProceduresMap ? Simplify<T_5[K_6] extends infer T_6 ? { [K_7 in keyof T_6]: T_6[K_7] extends ProceduresMap ? Simplify<T_6[K_7] extends infer T_7 ? { [K_8 in keyof T_7]: T_7[K_8] extends ProceduresMap ? Simplify<T_7[K_8] extends infer T_8 ? { [K_9 in keyof T_8]: T_8[K_9] extends ProceduresMap ? Simplify<T_8[K_9] extends infer T_9 ? { [K_10 in keyof T_9]: T_9[K_10] extends ProceduresMap ? Simplify<T_9[K_10] extends infer T_10 ? { [K_11 in keyof T_10]: T_10[K_11] extends ProceduresMap ? Simplify< /*elided*/any> : T_10[K_11] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_9[K_10] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_8[K_9] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_7[K_8] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_6[K_7] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_5[K_6] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_4[K_5] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_3[K_4] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_2[K_3] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_1[K_2] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T[K] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never>;
17
19
  interface WebSocketClientOptions {
20
+ /** Socket getter */
18
21
  socket: () => WebSocket | null;
22
+ /** @default 10000ms */
19
23
  timeout?: number;
24
+ /**
25
+ * @default 99
26
+ * Set 1 for disable
27
+ */
28
+ batchSize?: number;
29
+ /** @default 0 */
30
+ batchDelay?: number;
31
+ /** @default 1000 characters */
32
+ compression?: number | false;
33
+ /** @default 3 */
34
+ retryCount?: number;
35
+ /** @default 1000ms */
36
+ retryDelay?: number;
37
+ /** Call before send, you can modify data */
38
+ onBeforeSend?: (data: SocketMessage) => SocketMessage | void;
20
39
  }
21
- declare function createWebSocketClient<U extends Ultra<any, any, any>>(options: WebSocketClientOptions): Simplify<GetProcedures<U> extends infer T ? { [K in keyof T]: T[K] extends ProceduresMap ? Simplify<T[K] extends infer T_1 ? { [K_2 in keyof T_1]: T_1[K_2] extends ProceduresMap ? Simplify<T_1[K_2] extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] extends ProceduresMap ? Simplify<T_2[K_3] extends infer T_3 ? { [K_4 in keyof T_3]: T_3[K_4] extends ProceduresMap ? Simplify<T_3[K_4] extends infer T_4 ? { [K_5 in keyof T_4]: T_4[K_5] extends ProceduresMap ? Simplify<T_4[K_5] extends infer T_5 ? { [K_6 in keyof T_5]: T_5[K_6] extends ProceduresMap ? Simplify<T_5[K_6] extends infer T_6 ? { [K_7 in keyof T_6]: T_6[K_7] extends ProceduresMap ? Simplify<T_6[K_7] extends infer T_7 ? { [K_8 in keyof T_7]: T_7[K_8] extends ProceduresMap ? Simplify<T_7[K_8] extends infer T_8 ? { [K_9 in keyof T_8]: T_8[K_9] extends ProceduresMap ? Simplify<T_8[K_9] extends infer T_9 ? { [K_10 in keyof T_9]: T_9[K_10] extends ProceduresMap ? Simplify<T_9[K_10] extends infer T_10 ? { [K_11 in keyof T_10]: T_10[K_11] extends ProceduresMap ? Simplify< /*elided*/any> : T_10[K_11] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_9[K_10] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_8[K_9] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_7[K_8] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_6[K_7] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_5[K_6] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_4[K_5] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_3[K_4] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_2[K_3] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_1[K_2] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T[K] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never>;
40
+ declare function createWebSocketClient<U extends Ultra<any, any, any>>(clientOptions: WebSocketClientOptions): Simplify<GetProcedures<U> extends infer T ? { [K in keyof T]: T[K] extends ProceduresMap ? Simplify<T[K] extends infer T_1 ? { [K_2 in keyof T_1]: T_1[K_2] extends ProceduresMap ? Simplify<T_1[K_2] extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] extends ProceduresMap ? Simplify<T_2[K_3] extends infer T_3 ? { [K_4 in keyof T_3]: T_3[K_4] extends ProceduresMap ? Simplify<T_3[K_4] extends infer T_4 ? { [K_5 in keyof T_4]: T_4[K_5] extends ProceduresMap ? Simplify<T_4[K_5] extends infer T_5 ? { [K_6 in keyof T_5]: T_5[K_6] extends ProceduresMap ? Simplify<T_5[K_6] extends infer T_6 ? { [K_7 in keyof T_6]: T_6[K_7] extends ProceduresMap ? Simplify<T_6[K_7] extends infer T_7 ? { [K_8 in keyof T_7]: T_7[K_8] extends ProceduresMap ? Simplify<T_7[K_8] extends infer T_8 ? { [K_9 in keyof T_8]: T_8[K_9] extends ProceduresMap ? Simplify<T_8[K_9] extends infer T_9 ? { [K_10 in keyof T_9]: T_9[K_10] extends ProceduresMap ? Simplify<T_9[K_10] extends infer T_10 ? { [K_11 in keyof T_10]: T_10[K_11] extends ProceduresMap ? Simplify< /*elided*/any> : T_10[K_11] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_9[K_10] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_8[K_9] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_7[K_8] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_6[K_7] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_5[K_6] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_4[K_5] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_3[K_4] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_2[K_3] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T_1[K_2] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never> : T[K] extends Procedure<infer I, infer O, any> ? ProcedureFunction<I, O, CO> : never } : never>;
22
41
  type ClientsCallsParams = Partial<WebSocketClientOptions> | Partial<HTTPClientOptions>;
23
42
  interface SuperClientOptions<B extends Ultra<any, any, any>> {
24
43
  pick: (...args: Parameters<Invoke<ClientsCallsParams>>) => BuildClient<GetProcedures<B>, ClientsCallsParams>;
package/dist/client.mjs CHANGED
@@ -1 +1 @@
1
- function e(t,n=[]){return new Proxy(()=>{},{get(r,i){if(typeof i==`string`)return e(t,[...n,i])},apply(e,r,i){if(!n.length)throw Error(`Cannot call client root; select a procedure first`);let a=n.join(`/`),o=i[0],s=i[1];return t(a,o,s)}})}function t(...e){let t=new Headers;for(let n of e)n&&new Headers(n).forEach((e,n)=>t.set(n,e));return t}function n(n){return e(async(e,r,i)=>{let a={...n,...i},o=a?.timeout||1e4,s=new AbortController,c=a?.method||`POST`,l=`${a.baseUrl}/${e}`,u=t(n?.headers,a?.headers,i?.headers),d=null,f=setTimeout(()=>s.abort(`Timeout: ${o}`),o);switch(!0){case c===`GET`:{if(d=null,!r)break;if(typeof r!=`object`)throw Error(`GET requests params to be an object for query string generation`);let e=Object.entries(r).filter(([,e])=>e!=null).map(([e,t])=>[e,String(t)]),t=new URLSearchParams(e).toString();t&&(l+=`?${t}`);break}case r instanceof FormData:d=r;break;case typeof r==`string`:u.set(`Content-Type`,`text/plain`),d=r;break;default:u.set(`Content-Type`,`application/json`),d=JSON.stringify(r)}try{let e=await fetch(l,{method:c,...d&&{body:d},...a,signal:s.signal,headers:u});if(!e.ok)throw Error(`${e.statusText} ${e.status}`);let t=e.headers.get(`Content-Type`)||``;switch(!0){case e.status===204:return null;case t.startsWith(`application/json`):return await e.json();case t.startsWith(`text/`):return await e.text();default:return await e.blob()}}catch(e){throw e.name===`AbortError`?Error(`Request aborted: ${e.message}`):e}finally{clearTimeout(f)}})}function r(t){let{timeout:n=1e4}=t,r=()=>Math.random().toString(36);return e((e,i,a)=>{let o=t.socket();if(!o||o.readyState!==WebSocket.OPEN)return Promise.reject(Error(`WebSocket is not open`));let{promise:s,resolve:c,reject:l}=Promise.withResolvers(),u=a?.timeout??n,d,f=r(),p=e=>{try{let t=JSON.parse(e.data);return t.id===f?(clearTimeout(d),o.removeEventListener(`message`,p),`error`in t?l(t.error):c(t.result)):void 0}catch(e){l(e)}};return o.addEventListener(`message`,p),d=setTimeout(()=>{o.removeEventListener(`message`,p),l(`Timeout: ${u}`)},u),o.send(JSON.stringify({id:f,method:e,params:i})),s})}function i(t){return e((e,n,r)=>{let i=t.pick(e,n,r),a=e.split(`/`).filter(Boolean),o=i;for(let e of a)o[e]&&(o=o[e]);return o(n,r)})}export{n as createHTTPClient,i as createSuperClient,r as createWebSocketClient};
1
+ import{compress as e}from"./compression.mjs";function t(e,n=[]){return new Proxy(()=>{},{get(r,i){if(typeof i==`string`)return t(e,[...n,i])},apply(t,r,i){if(!n.length)throw Error(`Cannot call client root; select a procedure first`);let a=n.join(`/`),o=i[0],s=i[1];return e(a,o,s)}})}function n(...e){let t=new Headers;for(let n of e)n&&new Headers(n).forEach((e,n)=>t.set(n,e));return t}function r(e){return t(async(t,r,i)=>{let a={...e,...i},o=a?.timeout||1e4,s=new AbortController,c=a?.method||`POST`,l=`${a.baseUrl}/${t}`,u=n(e?.headers,a?.headers,i?.headers),d=null,f=setTimeout(()=>s.abort(`Timeout: ${o}`),o);switch(!0){case c===`GET`:{if(d=null,!r)break;if(typeof r!=`object`)throw Error(`GET requests params to be an object for query string generation`);let e=Object.entries(r).filter(([,e])=>e!=null).map(([e,t])=>[e,String(t)]),t=new URLSearchParams(e).toString();t&&(l+=`?${t}`);break}case r instanceof FormData:d=r;break;case typeof r==`string`:u.set(`Content-Type`,`text/plain`),d=r;break;default:u.set(`Content-Type`,`application/json`),d=JSON.stringify(r)}try{let e=await fetch(l,{method:c,...d&&{body:d},...a,signal:s.signal,headers:u});if(!e.ok)throw Error(`${e.statusText} ${e.status}`);let t=e.headers.get(`Content-Type`)||``;switch(!0){case e.status===204:return null;case t.startsWith(`application/json`):return await e.json();case t.startsWith(`text/`):return await e.text();default:return await e.blob()}}catch(e){throw e.name===`AbortError`?Error(`Request aborted: ${e.message}`):e}finally{clearTimeout(f)}})}function i(n){let{retryCount:r=3,retryDelay:i=1e3,batchSize:a=99,batchDelay:o=0,onBeforeSend:s,compression:c}=n,l=()=>Math.random().toString(36),u=[],d=null,f=(t=0)=>{if(d!==null&&(clearTimeout(d),d=null),!u.length)return;let a=n.socket();if(!a||a.readyState!==WebSocket.OPEN)return t>=r?u.forEach(e=>{clearTimeout(e.timeout),e.reject(`WebSocket is not open`)}):setTimeout(()=>f(t+1),i);let o=e=>{try{let t=JSON.parse(e.data),n=u.find(e=>e.id===t.id);if(!n)return;clearTimeout(n.timeout),`error`in t?n.reject(t.error):n.resolve(t.result),u.length||a.removeEventListener(`message`,o)}catch(e){console.error(`Client failed parse server message`,e)}};a.addEventListener(`message`,o),a.addEventListener(`close`,()=>{a.removeEventListener(`message`,o),setTimeout(f,i)});let l=[];for(let e of u)e.pending||(e.pending=!0,l.push({id:e.id,method:e.method,params:e.params}));let p=JSON.stringify(l);c&&p.length>=c?e(new TextEncoder().encode(p)).then(e=>a.send(s?.(e)??e)):a.send(s?.(p)??p)},p=(e,t)=>(...n)=>{let r=u.findIndex(t=>t.id===e);return r!==-1&&(clearTimeout(u[r].timeout),u.splice(r,1)),t(...n)};return t((e,t,r)=>{let i={timeout:1e4,...n,...r},{promise:s,resolve:c,reject:m}=Promise.withResolvers(),h=l();return u.push({id:h,method:e,params:t,options:i,resolve:p(h,c),reject:p(h,m),timeout:setTimeout(p(h,m),i.timeout),pending:!1}),u.length>=a?f():d===null&&(d=setTimeout(f,o)),s})}function a(e){return t((t,n,r)=>{let i=e.pick(t,n,r),a=t.split(`/`).filter(Boolean),o=i;for(let e of a)o[e]&&(o=o[e]);return o(n,r)})}export{r as createHTTPClient,a as createSuperClient,i as createWebSocketClient};
@@ -0,0 +1,5 @@
1
+ //#region src/compression.d.ts
2
+ declare function compress(data: BufferSource, format?: CompressionFormat): Promise<Uint8Array<ArrayBuffer>>;
3
+ declare function decompress(data: BufferSource, format?: CompressionFormat): Promise<Uint8Array<ArrayBuffer>>;
4
+ //#endregion
5
+ export { compress, decompress };
@@ -0,0 +1 @@
1
+ async function e(e,t){let n=e.writable.getWriter();n.write(t),n.close();let r=e.readable.getReader(),i=[];for(;;){let{done:e,value:t}=await r.read();if(e)break;i.push(...t)}return new Uint8Array(i)}function t(t,n=`deflate-raw`){return e(new CompressionStream(n),t)}function n(t,n=`deflate-raw`){return e(new DecompressionStream(n),t)}export{t as compress,n as decompress};
@@ -1,4 +1,4 @@
1
- import { s as Promisable } from "./types-DshrwR9G.mjs";
1
+ import { s as Promisable } from "./types-DDhVsVEu.mjs";
2
2
  import { BunRequest, Server, ServerWebSocket } from "bun";
3
3
 
4
4
  //#region src/context.d.ts
@@ -1,2 +1,2 @@
1
- import { a as DeriveValue, c as HTTPContext, d as isHTTP, f as isWS, i as DeriveUpgradeValue, l as ReplaceSocketData, n as DeriveRecord, o as GetDerived, r as DeriveUpgradePossibleValue, s as GetDerivedUpgradeData, t as BaseContext, u as WSContext } from "./context-CygqISTC.mjs";
1
+ import { a as DeriveValue, c as HTTPContext, d as isHTTP, f as isWS, i as DeriveUpgradeValue, l as ReplaceSocketData, n as DeriveRecord, o as GetDerived, r as DeriveUpgradePossibleValue, s as GetDerivedUpgradeData, t as BaseContext, u as WSContext } from "./context-BdPiiQY2.mjs";
2
2
  export { BaseContext, DeriveRecord, DeriveUpgradePossibleValue, DeriveUpgradeValue, DeriveValue, GetDerived, GetDerivedUpgradeData, HTTPContext, ReplaceSocketData, WSContext, isHTTP, isWS };
package/dist/cors.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { t as BaseContext } from "./context-CygqISTC.mjs";
2
- import "./http-CzPARBt4.mjs";
3
- import { t as Middleware } from "./middleware-C5N5WjuQ.mjs";
1
+ import { t as BaseContext } from "./context-BdPiiQY2.mjs";
2
+ import "./http-DW9-I0jB.mjs";
3
+ import { t as Middleware } from "./middleware-pLpb5aaJ.mjs";
4
4
 
5
5
  //#region src/cors.d.ts
6
6
  interface CorsConfig {
package/dist/cors.mjs CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./response-jq-JlZZH.mjs";import{isHTTP as t}from"./context.mjs";const n={"Access-Control-Allow-Methods":[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`OPTIONS`].join(`, `),"Access-Control-Allow-Headers":[`Accept-Language`,`Accept`,`Content-Type`,`Content-Language`,`Range`].join(`, `),"Access-Control-Expose-Headers":[`Cache-Control`,`Content-Language`,`Content-Type`,`Expires`,`Last-Modified`,`Pragma`].join(`, `),"Access-Control-Max-Age":`3600`};function r(r){let i={...n,...r.methods?.length&&{"Access-Control-Allow-Methods":r.methods.join(`, `)},...r.allowedHeaders?.length&&{"Access-Control-Allow-Headers":r.allowedHeaders.join(`, `)},...r.exposedHeaders?.length&&{"Access-Control-Expose-Headers":r.exposedHeaders.join(`, `)},...r.credentials&&!r.origin.includes(`*`)&&{"Access-Control-Allow-Credentials":`true`},...r.maxAge&&{"Access-Control-Max-Age":r.maxAge.toString()}};return async n=>{if(!t(n.context))return n.next();let a=n.context.request.headers.get(`Origin`);if(!a||!r.origin.includes(a))return n.next();if(n.context.request.method===`OPTIONS`)return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":a,...i}});let o;try{o=e(await n.next())}catch(t){o=e(t)}for(let e in o.headers.set(`Access-Control-Allow-Origin`,a),i)o.headers.set(e,i[e]);return o}}export{r as createCORSMiddleware};
1
+ import{t as e}from"./response-Cg3awmqM.mjs";import{isHTTP as t}from"./context.mjs";const n={"Access-Control-Allow-Methods":[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`OPTIONS`].join(`, `),"Access-Control-Allow-Headers":[`Accept-Language`,`Accept`,`Content-Type`,`Content-Language`,`Range`].join(`, `),"Access-Control-Expose-Headers":[`Cache-Control`,`Content-Language`,`Content-Type`,`Expires`,`Last-Modified`,`Pragma`].join(`, `),"Access-Control-Max-Age":`3600`};function r(r){let i={...n,...r.methods?.length&&{"Access-Control-Allow-Methods":r.methods.join(`, `)},...r.allowedHeaders?.length&&{"Access-Control-Allow-Headers":r.allowedHeaders.join(`, `)},...r.exposedHeaders?.length&&{"Access-Control-Expose-Headers":r.exposedHeaders.join(`, `)},...r.credentials&&!r.origin.includes(`*`)&&{"Access-Control-Allow-Credentials":`true`},...r.maxAge&&{"Access-Control-Max-Age":r.maxAge.toString()}};return async n=>{if(!t(n.context))return n.next();let a=n.context.request.headers.get(`Origin`);if(!a||!r.origin.includes(a))return n.next();if(n.context.request.method===`OPTIONS`)return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":a,...i}});let o;try{o=e(await n.next())}catch(t){o=e(t)}for(let e in o.headers.set(`Access-Control-Allow-Origin`,a),i)o.headers.set(e,i[e]);return o}}export{r as createCORSMiddleware};
package/dist/error.mjs CHANGED
@@ -1 +1 @@
1
- import{a as e,i as t,n,r,t as i}from"./error-CvEWFOYT.mjs";export{i as NotFoundError,n as UltraError,r as UnauthorizedError,t as UnsupportedProtocolError,e as ValidationError};
1
+ import{a as e,i as t,n,r,t as i}from"./error-45bzsfk8.mjs";export{i as NotFoundError,n as UltraError,r as UnauthorizedError,t as UnsupportedProtocolError,e as ValidationError};
@@ -1,4 +1,4 @@
1
- import { s as Promisable } from "./types-DshrwR9G.mjs";
1
+ import { s as Promisable } from "./types-DDhVsVEu.mjs";
2
2
  import { BunRequest, Server } from "bun";
3
3
 
4
4
  //#region src/http.d.ts
package/dist/http.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as BunRoutes, r as HTTPMethod, t as BunRouteHandler } from "./http-CzPARBt4.mjs";
1
+ import { n as BunRoutes, r as HTTPMethod, t as BunRouteHandler } from "./http-DW9-I0jB.mjs";
2
2
  export { BunRouteHandler, BunRoutes, HTTPMethod };
@@ -1,6 +1,6 @@
1
- import { s as Promisable } from "./types-DshrwR9G.mjs";
2
- import { r as HTTPMethod } from "./http-CzPARBt4.mjs";
3
- import { c as StandardSchemaV1 } from "./validation-DzxNLrxi.mjs";
1
+ import { s as Promisable } from "./types-DDhVsVEu.mjs";
2
+ import { r as HTTPMethod } from "./http-DW9-I0jB.mjs";
3
+ import { c as StandardSchemaV1 } from "./validation-CBofLqUN.mjs";
4
4
 
5
5
  //#region src/procedure.d.ts
6
6
  interface ProcedureOptions<I, C> {
@@ -1,3 +1,3 @@
1
- import "./http-CzPARBt4.mjs";
2
- import { n as MiddlewareOptions, t as Middleware } from "./middleware-C5N5WjuQ.mjs";
1
+ import "./http-DW9-I0jB.mjs";
2
+ import { n as MiddlewareOptions, t as Middleware } from "./middleware-pLpb5aaJ.mjs";
3
3
  export { Middleware, MiddlewareOptions };
@@ -1 +1 @@
1
- import{t as e}from"./validation-s1s8P8HO.mjs";var t=class{middlewares=new Set;inputSchema;outputSchema;handlerFunction;httpOptions;input(e){return e&&(this.inputSchema=e),this}output(e){return e&&(this.outputSchema=e),this}handler(e){return this.handlerFunction=e,this}http(e){switch(typeof e){case`boolean`:this.httpOptions={enabled:e};break;case`string`:this.httpOptions={enabled:!0,method:e};break;default:this.httpOptions={enabled:!0,...e??{}}}return this}use(e){return this.middlewares.add(e),this}compile(){if(!this.handlerFunction)throw Error(`Procedure handler is not defined`);if(!this.inputSchema&&!this.outputSchema)return this.handlerFunction;let t=this.handlerFunction;switch(!0){case!this.inputSchema:{let n=t;t=async t=>e(this.outputSchema,await n(t));break}case!this.outputSchema:{let n=t;t=async t=>n({...t,input:await e(this.inputSchema,t.input)});break}default:{let n=t;t=async t=>{let r=await n({...t,input:await e(this.inputSchema,t.input)});return e(this.outputSchema,r)}}}return t}metadata(){return{http:this.httpOptions,middlewares:this.middlewares,has:{handler:!!this.handlerFunction,middleware:this.middlewares.size>0,input:!!this.inputSchema,output:!!this.outputSchema}}}};export{t};
1
+ import{t as e}from"./validation-DdDXJNvN.mjs";var t=class{middlewares=new Set;inputSchema;outputSchema;handlerFunction;httpOptions;input(e){return e&&(this.inputSchema=e),this}output(e){return e&&(this.outputSchema=e),this}handler(e){return this.handlerFunction=e,this}http(e){switch(typeof e){case`boolean`:this.httpOptions={enabled:e};break;case`string`:this.httpOptions={enabled:!0,method:e};break;default:this.httpOptions={enabled:!0,...e??{}}}return this}use(e){return this.middlewares.add(e),this}compile(){if(!this.handlerFunction)throw Error(`Procedure handler is not defined`);if(!this.inputSchema&&!this.outputSchema)return this.handlerFunction;let t=this.handlerFunction;switch(!0){case!this.inputSchema:{let n=t;t=async t=>e(this.outputSchema,await n(t));break}case!this.outputSchema:{let n=t;t=async t=>n({...t,input:await e(this.inputSchema,t.input)});break}default:{let n=t;t=async t=>{let r=await n({...t,input:await e(this.inputSchema,t.input)});return e(this.outputSchema,r)}}}return t}metadata(){return{http:this.httpOptions,middlewares:this.middlewares,has:{handler:!!this.handlerFunction,middleware:this.middlewares.size>0,input:!!this.inputSchema,output:!!this.outputSchema}}}};export{t};
@@ -1,3 +1,3 @@
1
- import "./http-CzPARBt4.mjs";
2
- import { a as ProcedureHandler, i as Procedure, o as ProcedureOptions, r as HTTPOptions } from "./middleware-C5N5WjuQ.mjs";
1
+ import "./http-DW9-I0jB.mjs";
2
+ import { a as ProcedureHandler, i as Procedure, o as ProcedureOptions, r as HTTPOptions } from "./middleware-pLpb5aaJ.mjs";
3
3
  export { HTTPOptions, Procedure, ProcedureHandler, ProcedureOptions };
@@ -1 +1 @@
1
- import{t as e}from"./procedure-DXkuVTmF.mjs";export{e as Procedure};
1
+ import{t as e}from"./procedure-DqhXrslI.mjs";export{e as Procedure};
@@ -1 +1 @@
1
- import{n as e}from"./error-CvEWFOYT.mjs";function t(t){switch(!0){case t instanceof Response:return t;case t instanceof e:return t.toResponse();case t instanceof Error:return new Response(t.message,{status:500});case typeof t==`object`:return Response.json(t);case!t:return new Response(null,{status:204});default:return new Response(String(t))}}function n(t,n){let r;switch(!0){case n instanceof e:r={id:t,error:{code:n.status,message:n.message}};break;case n instanceof Error:r={id:t,error:{code:500,message:n.message}};break;case n instanceof Response:r={id:t,error:{code:n.status,message:n.statusText}};break;case typeof n==`object`||typeof n==`number`||typeof n==`boolean`:r={id:t,result:n};break;default:r={id:t,result:String(n)}}return JSON.stringify(r)}export{n,t};
1
+ import{n as e}from"./error-45bzsfk8.mjs";function t(t){switch(!0){case t instanceof Response:return t;case t instanceof e:return t.toResponse();case t instanceof Error:return new Response(t.message,{status:500});case typeof t==`object`:return Response.json(t);case!t:return new Response(null,{status:204});default:return new Response(String(t))}}function n(t,n){let r;switch(!0){case n instanceof e:r={id:t,error:{code:n.status,message:n.message}};break;case n instanceof Error:r={id:t,error:{code:500,message:n.message}};break;case n instanceof Response:r={id:t,error:{code:n.status,message:n.statusText}};break;case typeof n==`object`||typeof n==`number`||typeof n==`boolean`:r={id:t,result:n};break;default:r={id:t,result:String(n)}}return JSON.stringify(r)}export{n,t};
package/dist/response.mjs CHANGED
@@ -1 +1 @@
1
- import{n as e,t}from"./response-jq-JlZZH.mjs";export{t as toHTTPResponse,e as toRPCResponse};
1
+ import{n as e,t}from"./response-Cg3awmqM.mjs";export{t as toHTTPResponse,e as toRPCResponse};
@@ -0,0 +1,23 @@
1
+ import { o as JSONValue } from "./types-DDhVsVEu.mjs";
2
+
3
+ //#region src/rpc.d.ts
4
+ interface ErrorResult {
5
+ id: string;
6
+ error: {
7
+ code: number;
8
+ message: string;
9
+ };
10
+ }
11
+ interface SuccessResult {
12
+ id: string;
13
+ result: JSONValue;
14
+ }
15
+ type Result = ErrorResult | SuccessResult;
16
+ interface Payload {
17
+ id: string;
18
+ method: string;
19
+ params?: JSONValue;
20
+ }
21
+ declare function isRPC(value: any): value is Payload;
22
+ //#endregion
23
+ export { isRPC as a, SuccessResult as i, Payload as n, Result as r, ErrorResult as t };
package/dist/rpc.d.mts CHANGED
@@ -1,23 +1,2 @@
1
- import { o as JSONValue } from "./types-DshrwR9G.mjs";
2
-
3
- //#region src/rpc.d.ts
4
- interface ErrorResult {
5
- id: string;
6
- error: {
7
- code: number;
8
- message: string;
9
- };
10
- }
11
- interface SuccessResult {
12
- id: string;
13
- result: JSONValue;
14
- }
15
- type Result = ErrorResult | SuccessResult;
16
- interface Payload {
17
- id: string;
18
- method: string;
19
- params?: JSONValue;
20
- }
21
- declare function isRPC(value: any): value is Payload;
22
- //#endregion
1
+ import { a as isRPC, i as SuccessResult, n as Payload, r as Result, t as ErrorResult } from "./rpc-BzGFmZuu.mjs";
23
2
  export { ErrorResult, Payload, Result, SuccessResult, isRPC };
package/dist/rpc.mjs CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./rpc-D9H6IkRD.mjs";export{e as isRPC};
1
+ import{t as e}from"./rpc-Hr71rqEs.mjs";export{e as isRPC};
@@ -1,7 +1,7 @@
1
- import { i as JSONObject, o as JSONValue, s as Promisable, t as DeepReadonly } from "./types-DshrwR9G.mjs";
2
- import { n as DeriveRecord, t as BaseContext } from "./context-CygqISTC.mjs";
3
- import "./http-CzPARBt4.mjs";
4
- import { i as Procedure } from "./middleware-C5N5WjuQ.mjs";
1
+ import { i as JSONObject, o as JSONValue, s as Promisable, t as DeepReadonly } from "./types-DDhVsVEu.mjs";
2
+ import { n as DeriveRecord, t as BaseContext } from "./context-BdPiiQY2.mjs";
3
+ import "./http-DW9-I0jB.mjs";
4
+ import { i as Procedure } from "./middleware-pLpb5aaJ.mjs";
5
5
  import { ProceduresMap, Ultra } from "./ultra.mjs";
6
6
  import { BunRequest, CookieSameSite, RedisClient } from "bun";
7
7
 
package/dist/session.mjs CHANGED
@@ -1 +1 @@
1
- import{i as e}from"./error-CvEWFOYT.mjs";import{Ultra as t}from"./ultra.mjs";import{isHTTP as n,isWS as r}from"./context.mjs";import{sign as i,unsign as a}from"./crypto.mjs";import{Cookie as o}from"bun";import{randomBytes as s}from"node:crypto";function c(e){return{...e,cookie:{path:`/`,httpOnly:!0,secure:!0,sameSite:`lax`,maxAge:e.ttlSec,...e?.cookie}}}function l(e){return new t().deriveUpgrade(t=>{let n=u.getOrCreateId(t.request,e);return{headers:{"Set-Cookie":new o(e.name,i(n,e.secret),e.cookie).toString()},data:{sessionId:n}}}).derive(t=>({session:new u(e,t)})).use(async({context:e,next:t})=>{await e.session.initiate();let n=await t();return await e.session.commit(),n})}var u=class t{static makeId(){return s(16).toString(`base64url`)}static getOrCreateId(e,n){let r=e.cookies.get(n.name);return r&&a(r,n.secret)||t.makeId()}config;context;store;sessionIdFromClient=null;sessionId;sessionState=null;modified=!1;constructor(i,o){switch(this.config=i,this.context=o,this.store=i.stores[i.store](i,o),!0){case n(o):{let e=o.request.cookies.get(i.name);e&&(this.sessionIdFromClient=a(e,i.secret));break}case r(o):this.sessionIdFromClient=o.ws.data.sessionId||null;break;default:throw new e(`Session management is only supported for HTTP and WebSocket protocols.`)}this.sessionId=this.sessionIdFromClient||t.makeId()}get id(){return this.sessionId}async initiate(){this.sessionState||=await this.store.read(this.sessionId)||{}}async commit(){if(this.touch(),this.isEmpty&&this.sessionIdFromClient)return this.store.destroy(this.sessionIdFromClient);this.sessionIdFromClient&&this.sessionIdFromClient!==this.sessionId?(await this.store.destroy(this.sessionIdFromClient),await this.store.write(this.sessionId,this.state)):this.modified?await this.store.write(this.sessionId,this.state):await this.store.touch(this.sessionId)}regenerate(){this.sessionId=t.makeId()}get(e,t){return this.state[e]??t??null}set(e,t){this.state[e]=t,this.modified=!0}has(e){return Object.hasOwn(this.state,e)}all(){return this.state}delete(e){delete this.state[e],this.modified=!0}clear(){this.sessionState={},this.modified=!0}get state(){if(!this.sessionState)throw Error(`Session is not initiated yet.`);return this.sessionState}get isEmpty(){return Object.keys(this.state).length===0}touch(){n(this.context)&&this.context.request.cookies.set(this.config.name,i(this.sessionId,this.config.secret),this.config.cookie)}},d=class{config;connection;constructor(e,t){this.config=e,this.connection=t}async read(e){let t=await this.connection.get(`${this.config.name}:${e}`);return t?JSON.parse(t):null}async write(e,t){await this.connection.set(`${this.config.name}:${e}`,JSON.stringify(t),`EX`,this.config.ttlSec)}async destroy(e){await this.connection.del(`${this.config.name}:${e}`)}async touch(e){await this.connection.expire(`${this.config.name}:${e}`,this.config.ttlSec)}};const f=new Map;var p=class{config;sweepIntervalMs;ttlMs;lastSweepAt=Date.now();constructor(e,t=e.ttlSec){this.config=e,this.sweepIntervalMs=t*1e3,this.ttlMs=e.ttlSec*1e3}read(e){return this.maybeSweep(),f.get(e)?.data??null}write(e,t){this.maybeSweep(),f.set(e,{data:t,touched:Date.now()})}destroy(e){this.maybeSweep(),f.delete(e)}touch(e){this.maybeSweep();let t=f.get(e);t&&(t.touched=Date.now())}maybeSweep(e=Date.now()){if(!(e-this.lastSweepAt<this.sweepIntervalMs)){this.lastSweepAt=e;for(let[t,n]of f)e-n.touched>this.ttlMs&&f.delete(t)}}};export{p as MemorySessionStore,d as RedisSessionStore,u as Session,l as createSessionModule,c as defineConfig};
1
+ import{i as e}from"./error-45bzsfk8.mjs";import{Ultra as t}from"./ultra.mjs";import{isHTTP as n,isWS as r}from"./context.mjs";import{sign as i,unsign as a}from"./crypto.mjs";import{Cookie as o}from"bun";import{randomBytes as s}from"node:crypto";function c(e){return{...e,cookie:{path:`/`,httpOnly:!0,secure:!0,sameSite:`lax`,maxAge:e.ttlSec,...e?.cookie}}}function l(e){return new t().deriveUpgrade(t=>{let n=u.getOrCreateId(t.request,e);return{headers:{"Set-Cookie":new o(e.name,i(n,e.secret),e.cookie).toString()},data:{sessionId:n}}}).derive(t=>({session:new u(e,t)})).use(async({context:e,next:t})=>{await e.session.initiate();let n=await t();return await e.session.commit(),n})}var u=class t{static makeId(){return s(16).toString(`base64url`)}static getOrCreateId(e,n){let r=e.cookies.get(n.name);return r&&a(r,n.secret)||t.makeId()}config;context;store;sessionIdFromClient=null;sessionId;sessionState=null;modified=!1;constructor(i,o){switch(this.config=i,this.context=o,this.store=i.stores[i.store](i,o),!0){case n(o):{let e=o.request.cookies.get(i.name);e&&(this.sessionIdFromClient=a(e,i.secret));break}case r(o):this.sessionIdFromClient=o.ws.data.sessionId||null;break;default:throw new e(`Session management is only supported for HTTP and WebSocket protocols.`)}this.sessionId=this.sessionIdFromClient||t.makeId()}get id(){return this.sessionId}async initiate(){this.sessionState||=await this.store.read(this.sessionId)||{}}async commit(){if(this.touch(),this.isEmpty&&this.sessionIdFromClient)return this.store.destroy(this.sessionIdFromClient);this.sessionIdFromClient&&this.sessionIdFromClient!==this.sessionId?(await this.store.destroy(this.sessionIdFromClient),await this.store.write(this.sessionId,this.state)):this.modified?await this.store.write(this.sessionId,this.state):await this.store.touch(this.sessionId)}regenerate(){this.sessionId=t.makeId()}get(e,t){return this.state[e]??t??null}set(e,t){this.state[e]=t,this.modified=!0}has(e){return Object.hasOwn(this.state,e)}all(){return this.state}delete(e){delete this.state[e],this.modified=!0}clear(){this.sessionState={},this.modified=!0}get state(){if(!this.sessionState)throw Error(`Session is not initiated yet.`);return this.sessionState}get isEmpty(){return Object.keys(this.state).length===0}touch(){n(this.context)&&this.context.request.cookies.set(this.config.name,i(this.sessionId,this.config.secret),this.config.cookie)}},d=class{config;connection;constructor(e,t){this.config=e,this.connection=t}async read(e){let t=await this.connection.get(`${this.config.name}:${e}`);return t?JSON.parse(t):null}async write(e,t){await this.connection.set(`${this.config.name}:${e}`,JSON.stringify(t),`EX`,this.config.ttlSec)}async destroy(e){await this.connection.del(`${this.config.name}:${e}`)}async touch(e){await this.connection.expire(`${this.config.name}:${e}`,this.config.ttlSec)}};const f=new Map;var p=class{config;sweepIntervalMs;ttlMs;lastSweepAt=Date.now();constructor(e,t=e.ttlSec){this.config=e,this.sweepIntervalMs=t*1e3,this.ttlMs=e.ttlSec*1e3}read(e){return this.maybeSweep(),f.get(e)?.data??null}write(e,t){this.maybeSweep(),f.set(e,{data:t,touched:Date.now()})}destroy(e){this.maybeSweep(),f.delete(e)}touch(e){this.maybeSweep();let t=f.get(e);t&&(t.touched=Date.now())}maybeSweep(e=Date.now()){if(!(e-this.lastSweepAt<this.sweepIntervalMs)){this.lastSweepAt=e;for(let[t,n]of f)e-n.touched>this.ttlMs&&f.delete(t)}}};export{p as MemorySessionStore,d as RedisSessionStore,u as Session,l as createSessionModule,c as defineConfig};
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as JSONPrimitive, c as ResetRecursion, i as JSONObject, l as Simplify, n as GetReturn, o as JSONValue, r as JSONArray, s as Promisable, t as DeepReadonly } from "./types-DshrwR9G.mjs";
1
+ import { a as JSONPrimitive, c as ResetRecursion, i as JSONObject, l as Simplify, n as GetReturn, o as JSONValue, r as JSONArray, s as Promisable, t as DeepReadonly } from "./types-DDhVsVEu.mjs";
2
2
  export { DeepReadonly, GetReturn, JSONArray, JSONObject, JSONPrimitive, JSONValue, Promisable, ResetRecursion, Simplify };
package/dist/ultra.d.mts CHANGED
@@ -1,8 +1,9 @@
1
- import { l as Simplify } from "./types-DshrwR9G.mjs";
2
- import { a as DeriveValue, i as DeriveUpgradeValue, l as ReplaceSocketData, n as DeriveRecord, o as GetDerived, s as GetDerivedUpgradeData, t as BaseContext } from "./context-CygqISTC.mjs";
3
- import { n as BunRoutes } from "./http-CzPARBt4.mjs";
4
- import { c as StandardSchemaV1 } from "./validation-DzxNLrxi.mjs";
5
- import { a as ProcedureHandler, i as Procedure, t as Middleware } from "./middleware-C5N5WjuQ.mjs";
1
+ import { l as Simplify } from "./types-DDhVsVEu.mjs";
2
+ import { a as DeriveValue, i as DeriveUpgradeValue, l as ReplaceSocketData, n as DeriveRecord, o as GetDerived, s as GetDerivedUpgradeData, t as BaseContext } from "./context-BdPiiQY2.mjs";
3
+ import { n as BunRoutes } from "./http-DW9-I0jB.mjs";
4
+ import { c as StandardSchemaV1 } from "./validation-CBofLqUN.mjs";
5
+ import { a as ProcedureHandler, i as Procedure, t as Middleware } from "./middleware-pLpb5aaJ.mjs";
6
+ import { n as Payload } from "./rpc-BzGFmZuu.mjs";
6
7
  import { BunRequest, ErrorLike, Server, ServerWebSocket } from "bun";
7
8
 
8
9
  //#region src/ultra.d.ts
@@ -53,6 +54,7 @@ declare class Ultra<const Procedures extends ProceduresMap = ProceduresMap, cons
53
54
  on<E extends keyof ServerEventMap<SocketData>>(event: E, listener: ServerEventListener<SocketData, E>): this;
54
55
  off<E extends keyof ServerEventMap<SocketData>>(event: E, listener: ServerEventListener<SocketData, E>): this;
55
56
  emit<E extends keyof ServerEventMap<SocketData>>(event: E, ...args: ServerEventMap<SocketData>[E]): this;
57
+ protected handleRPC(handler: ProcedureHandler<unknown, unknown, Context> | undefined, ws: ServerWebSocket<SocketData>, rpc: Payload, context: Context): Promise<void>;
56
58
  /** Enrich context with derived values */
57
59
  protected enrichContext<const C extends BaseContext>(context: C): Promise<Context>;
58
60
  /** Enrich upgrade options with derived values */
package/dist/ultra.mjs CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./procedure-DXkuVTmF.mjs";import{n as t,t as n}from"./response-jq-JlZZH.mjs";import{t as r}from"./rpc-D9H6IkRD.mjs";import{serve as i}from"bun";var a=class{initializers=new Map;events=new Map;middlewares=new Set;derived=new Set;derivedUpgrade=new Set;options={http:{enableByDefault:!1}};httpEnabled=!1;server;constructor(e){e&&(this.options={...this.options,...e}),this.httpEnabled=this.options.http?.enableByDefault??!1}routes(e,t){let n=this.initializers.get(e);return n?t?.forEach(e=>n.add(e)):this.initializers.set(e,new Set(t)),this}use(e){return typeof e==`function`?(this.middlewares.add(e),this):(this.merge(e),this)}derive(e){return this.derived.add(e),this}deriveUpgrade(e){return this.derivedUpgrade.add(e),this}start(e){if(this.server)return console.warn(`Server is already running`),this.server;let{routes:n,handlers:a}=this.build(),o=this.wrapHandler(()=>new Response(`Not Found`,{status:404}),this.middlewares);return this.server=i({...this.httpEnabled&&{routes:{...n,"/ws":async(e,t)=>{if(this.emit(`http:request`,e,t),!this.derivedUpgrade.size)return t.upgrade(e)?void 0:new Response(`WebSocket upgrade failed`,{status:500});if(!t.upgrade(e,await this.enrichUpgrade(this.derived.size?await this.enrichContext({server:t,request:e}):{server:t,request:e})))return new Response(`WebSocket upgrade failed`,{status:500})},"/*":async(e,t)=>(this.emit(`http:request`,e,t),o({input:null,context:this.derived.size?await this.enrichContext({server:t,request:e}):{server:t,request:e}}))}},websocket:{data:{},open:e=>{this.emit(`ws:open`,e)},close:(e,t,n)=>{this.emit(`ws:close`,e,t,n)},message:async(e,n)=>{if(this.emit(`ws:message`,e,n),typeof n!=`string`)return;let i=JSON.parse(n);if(!r(i))return;let o=a.get(i.method);if(!o){e.send(`{"id": "${i.id}", "error": {"code": 404, "message": "Not found"}}`);return}try{e.send(t(i.id,await o({input:i.params,context:this.derived.size?await this.enrichContext({server:this.server,ws:e}):{server:this.server,ws:e}})))}catch(n){this.emit(`error`,n),e.send(t(i.id,n))}}},error:e=>(this.emit(`unhandled:error`,e),console.error(`Unhandled server error:`,e),new Response(`Internal server error`,{status:500})),...e}),this.emit(`server:started`,this.server),this.server}async stop(e=!1){if(!this.server)return console.error(`Server is not running`);await this.server.stop(e),this.emit(`server:stopped`,this.server,e)}on(e,t){return this.events.has(e)||this.events.set(e,new Set),this.events.get(e).add(t),this}off(e,t){return this.events.get(e)?.delete(t),this}emit(e,...t){return this.events.get(e)?.forEach(e=>e(...t)),this}async enrichContext(e){for(let t of this.derived)Object.assign(e,typeof t==`function`?await t(e):t);return e}async enrichUpgrade(e){let t={data:{},headers:new Headers};for(let n of this.derivedUpgrade){let r=typeof n==`function`?await n(e):n;if(`data`in r&&Object.assign(t.data,r.data),`headers`in r)for(let[e,n]of Object.entries(r.headers))t.headers.set(e,n)}return t}merge(e){for(let[t,n]of e.initializers){let e=this.initializers.get(t);e?n.forEach(t=>e.add(t)):this.initializers.set(t,new Set(n))}e.derived.forEach(e=>this.derived.add(e)),e.derivedUpgrade.forEach(e=>this.derivedUpgrade.add(e)),e.middlewares.forEach(e=>this.middlewares.add(e)),e.events.forEach((e,t)=>{this.events.has(t)||this.events.set(t,new Set);let n=this.events.get(t);e.forEach(e=>n.add(e))})}wrapHandler(e,t){if(!t.size)return e;let n=Array.from(t),r=n.length;return async t=>{let i=0,a=()=>i===r?e(t):n[i++]({...t,next:a});return a()}}build(){let t=new Map,r={},i=t=>{let n=new e;return t&&n.input(t),this.options.http?.enableByDefault&&n.http(),n};for(let[a,o]of this.initializers){let s=a(i),c=[];for(let e in s)c.push({path:e,value:s[e]});for(;c.length;){let{path:i,value:a}=c.pop();if(a instanceof e){if(t.has(i))throw Error(`Procedure "${i}" already exists`);let e=a.metadata();!this.httpEnabled&&e.http?.enabled&&(this.httpEnabled=!0);let s=new Set([...this.middlewares,...o,...e.middlewares]),c=this.wrapHandler(a.compile(),s);if(t.set(i,c),!e.http?.enabled)continue;let l=`/${i}`,u=async(e,t)=>{this.emit(`http:request`,e,t);let r=e.body;if(r){if(e.method===`GET`){let t=e.url.indexOf(`?`);t!==-1&&t<e.url.length-1&&(r=Object.fromEntries(new URLSearchParams(e.url.slice(t+1)).entries()))}else if(e.headers.get(`Content-Length`)!==`0`){let t=e.headers.get(`Content-Type`);if(t)switch(!0){case t.startsWith(`application/json`):r=await e.json();break;case t.startsWith(`text`):r=await e.text();break;case t.startsWith(`multipart/form-data`):r=await e.formData();break;default:console.error(`Unsupported Content-Type for procedure ${i}: ${t}`);break}}}try{return n(await c({input:r,context:this.derived.size?await this.enrichContext({server:t,request:e}):{server:t,request:e}}))}catch(e){return this.emit(`error`,e),n(e)}};if(!e.http.method){r[l]=u;continue}r[l]||(r[l]={}),r[l][e.http.method]=u;continue}for(let[e,t]of Object.entries(a)){let n=i?`${i}/${e}`:e;c.push({path:n,value:t})}}}return{handlers:t,routes:r}}};export{a as Ultra};
1
+ import{t as e}from"./procedure-DqhXrslI.mjs";import{n as t,t as n}from"./response-Cg3awmqM.mjs";import{t as r}from"./rpc-Hr71rqEs.mjs";import{inflateSync as i,serve as a}from"bun";var o=class{initializers=new Map;events=new Map;middlewares=new Set;derived=new Set;derivedUpgrade=new Set;options={http:{enableByDefault:!1}};httpEnabled=!1;server;constructor(e){e&&(this.options={...this.options,...e}),this.httpEnabled=this.options.http?.enableByDefault??!1}routes(e,t){let n=this.initializers.get(e);return n?t?.forEach(e=>n.add(e)):this.initializers.set(e,new Set(t)),this}use(e){return typeof e==`function`?(this.middlewares.add(e),this):(this.merge(e),this)}derive(e){return this.derived.add(e),this}deriveUpgrade(e){return this.derivedUpgrade.add(e),this}start(e){if(this.server)return console.warn(`Server is already running`),this.server;let{routes:t,handlers:n}=this.build(),o=new TextDecoder,s=this.wrapHandler(()=>new Response(`Not Found`,{status:404}),this.middlewares);return this.server=a({...this.httpEnabled&&{routes:{...t,"/ws":async(e,t)=>{if(this.emit(`http:request`,e,t),!this.derivedUpgrade.size)return t.upgrade(e)?void 0:new Response(`WebSocket upgrade failed`,{status:500});if(!t.upgrade(e,await this.enrichUpgrade(this.derived.size?await this.enrichContext({server:t,request:e}):{server:t,request:e})))return new Response(`WebSocket upgrade failed`,{status:500})},"/*":async(e,t)=>(this.emit(`http:request`,e,t),s({input:null,context:this.derived.size?await this.enrichContext({server:t,request:e}):{server:t,request:e}}))}},websocket:{data:{},open:e=>{this.emit(`ws:open`,e)},close:(e,t,n)=>{this.emit(`ws:close`,e,t,n)},message:async(e,t)=>{this.emit(`ws:message`,e,t);let a=null;try{a=typeof t==`string`?JSON.parse(t):JSON.parse(o.decode(i(t)))}catch(e){console.error(`Message payload parsing failed`,e);return}let s=Array.isArray(a)?a.filter(r):r(a)?[a]:null;if(!s||!s.length)return;let c=this.derived.size?await this.enrichContext({server:this.server,ws:e}):{server:this.server,ws:e};for(let t of s)this.handleRPC(n.get(t.method),e,t,c)}},error:e=>(this.emit(`unhandled:error`,e),console.error(`Unhandled server error:`,e),new Response(`Internal server error`,{status:500})),...e}),this.emit(`server:started`,this.server),this.server}async stop(e=!1){if(!this.server)return console.error(`Server is not running`);await this.server.stop(e),this.emit(`server:stopped`,this.server,e)}on(e,t){return this.events.has(e)||this.events.set(e,new Set),this.events.get(e).add(t),this}off(e,t){return this.events.get(e)?.delete(t),this}emit(e,...t){return this.events.get(e)?.forEach(e=>e(...t)),this}async handleRPC(e,n,r,i){if(!e){n.send(`{"id": "${r.id}", "error": {"code": 404, "message": "Not found"}}`);return}try{n.send(t(r.id,await e({input:r.params,context:i})))}catch(e){this.emit(`error`,e),n.send(t(r.id,e))}}async enrichContext(e){for(let t of this.derived)Object.assign(e,typeof t==`function`?await t(e):t);return e}async enrichUpgrade(e){let t={data:{},headers:new Headers};for(let n of this.derivedUpgrade){let r=typeof n==`function`?await n(e):n;if(`data`in r&&Object.assign(t.data,r.data),`headers`in r)for(let[e,n]of Object.entries(r.headers))t.headers.set(e,n)}return t}merge(e){for(let[t,n]of e.initializers){let e=this.initializers.get(t);e?n.forEach(t=>e.add(t)):this.initializers.set(t,new Set(n))}e.derived.forEach(e=>this.derived.add(e)),e.derivedUpgrade.forEach(e=>this.derivedUpgrade.add(e)),e.middlewares.forEach(e=>this.middlewares.add(e)),e.events.forEach((e,t)=>{this.events.has(t)||this.events.set(t,new Set);let n=this.events.get(t);e.forEach(e=>n.add(e))})}wrapHandler(e,t){if(!t.size)return e;let n=Array.from(t),r=n.length;return async t=>{let i=0,a=()=>i===r?e(t):n[i++]({...t,next:a});return a()}}build(){let t=new Map,r={},i=t=>{let n=new e;return t&&n.input(t),this.options.http?.enableByDefault&&n.http(),n};for(let[a,o]of this.initializers){let s=a(i),c=[];for(let e in s)c.push({path:e,value:s[e]});for(;c.length;){let{path:i,value:a}=c.pop();if(a instanceof e){if(t.has(i))throw Error(`Procedure "${i}" already exists`);let e=a.metadata();!this.httpEnabled&&e.http?.enabled&&(this.httpEnabled=!0);let s=new Set([...this.middlewares,...o,...e.middlewares]),c=this.wrapHandler(a.compile(),s);if(t.set(i,c),!e.http?.enabled)continue;let l=`/${i}`,u=async(e,t)=>{this.emit(`http:request`,e,t);let r=e.body;if(r){if(e.method===`GET`){let t=e.url.indexOf(`?`);t!==-1&&t<e.url.length-1&&(r=Object.fromEntries(new URLSearchParams(e.url.slice(t+1)).entries()))}else if(e.headers.get(`Content-Length`)!==`0`){let t=e.headers.get(`Content-Type`);if(t)switch(!0){case t.startsWith(`application/json`):r=await e.json();break;case t.startsWith(`text`):r=await e.text();break;case t.startsWith(`multipart/form-data`):r=await e.formData();break;default:console.error(`Unsupported Content-Type for procedure ${i}: ${t}`);break}}}try{return n(await c({input:r,context:this.derived.size?await this.enrichContext({server:t,request:e}):{server:t,request:e}}))}catch(e){return this.emit(`error`,e),n(e)}};if(!e.http.method){r[l]=u;continue}r[l]||(r[l]={}),r[l][e.http.method]=u;continue}for(let[e,t]of Object.entries(a)){let n=i?`${i}/${e}`:e;c.push({path:n,value:t})}}}return{handlers:t,routes:r}}};export{o as Ultra};
@@ -1 +1 @@
1
- import{a as e}from"./error-CvEWFOYT.mjs";async function t(t,n){let r=t[`~standard`].validate(n);if(r instanceof Promise&&(r=await r),r.issues)throw new e(JSON.stringify(r.issues,null,2));return r.value}export{t};
1
+ import{a as e}from"./error-45bzsfk8.mjs";async function t(t,n){let r=t[`~standard`].validate(n);if(r instanceof Promise&&(r=await r),r.issues)throw new e(JSON.stringify(r.issues,null,2));return r.value}export{t};
@@ -1,2 +1,2 @@
1
- import { a as PathSegment, c as StandardSchemaV1, d as validate, i as Issue, l as SuccessResult, n as InferInput, o as Props, r as InferOutput, s as Result, t as FailureResult, u as Types } from "./validation-DzxNLrxi.mjs";
1
+ import { a as PathSegment, c as StandardSchemaV1, d as validate, i as Issue, l as SuccessResult, n as InferInput, o as Props, r as InferOutput, s as Result, t as FailureResult, u as Types } from "./validation-CBofLqUN.mjs";
2
2
  export { FailureResult, InferInput, InferOutput, Issue, PathSegment, Props, Result, StandardSchemaV1, SuccessResult, Types, validate };
@@ -1 +1 @@
1
- import{t as e}from"./validation-s1s8P8HO.mjs";export{e as validate};
1
+ import{t as e}from"./validation-DdDXJNvN.mjs";export{e as validate};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sx3/ultra",
3
3
  "type": "module",
4
- "version": "0.1.4",
4
+ "version": "0.2.1",
5
5
  "private": false,
6
6
  "description": "Type-safe RPC over HTTP/WebSocket for Bun",
7
7
  "author": "SX3",
File without changes
File without changes