@gorth-io/structure 0.0.0-alpha.7 → 0.0.0-alpha.9

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 (115) hide show
  1. package/dist/cores/ably/spaces/index.cjs +1 -1
  2. package/dist/cores/ably/spaces/index.d.cts +1 -3
  3. package/dist/cores/ably/spaces/index.d.ts +1 -3
  4. package/dist/cores/ably/spaces/index.js +1 -1
  5. package/dist/modules/auth/server/bearer.cjs +1 -0
  6. package/dist/modules/auth/server/bearer.d.cts +25 -0
  7. package/dist/modules/auth/server/bearer.d.cts.map +1 -0
  8. package/dist/modules/auth/server/bearer.d.ts +25 -0
  9. package/dist/modules/auth/server/bearer.d.ts.map +1 -0
  10. package/dist/modules/auth/server/bearer.js +2 -0
  11. package/dist/modules/auth/server/bearer.js.map +1 -0
  12. package/dist/modules/auth/server/claims.cjs +1 -0
  13. package/dist/modules/auth/server/claims.d.cts +37 -0
  14. package/dist/modules/auth/server/claims.d.cts.map +1 -0
  15. package/dist/modules/auth/server/claims.d.ts +37 -0
  16. package/dist/modules/auth/server/claims.d.ts.map +1 -0
  17. package/dist/modules/auth/server/claims.js +2 -0
  18. package/dist/modules/auth/server/claims.js.map +1 -0
  19. package/dist/modules/auth/server/grant-guard.cjs +1 -1
  20. package/dist/modules/auth/server/grant-guard.d.cts.map +1 -1
  21. package/dist/modules/auth/server/grant-guard.d.ts.map +1 -1
  22. package/dist/modules/auth/server/grant-guard.js +1 -1
  23. package/dist/modules/auth/server/grant-guard.js.map +1 -1
  24. package/dist/modules/auth/server/index.cjs +1 -1
  25. package/dist/modules/auth/server/index.d.cts +7 -2
  26. package/dist/modules/auth/server/index.d.ts +7 -2
  27. package/dist/modules/auth/server/index.js +1 -1
  28. package/dist/modules/auth/server/machine.cjs +1 -0
  29. package/dist/modules/auth/server/machine.d.cts +28 -0
  30. package/dist/modules/auth/server/machine.d.cts.map +1 -0
  31. package/dist/modules/auth/server/machine.d.ts +28 -0
  32. package/dist/modules/auth/server/machine.d.ts.map +1 -0
  33. package/dist/modules/auth/server/machine.js +2 -0
  34. package/dist/modules/auth/server/machine.js.map +1 -0
  35. package/dist/modules/auth/server/proof.cjs +1 -1
  36. package/dist/modules/auth/server/proof.d.cts +17 -0
  37. package/dist/modules/auth/server/proof.d.cts.map +1 -1
  38. package/dist/modules/auth/server/proof.d.ts +17 -0
  39. package/dist/modules/auth/server/proof.d.ts.map +1 -1
  40. package/dist/modules/auth/server/proof.js +1 -1
  41. package/dist/modules/auth/server/proof.js.map +1 -1
  42. package/dist/modules/auth/server/provider.cjs +1 -0
  43. package/dist/modules/auth/server/provider.d.cts +9 -0
  44. package/dist/modules/auth/server/provider.d.cts.map +1 -0
  45. package/dist/modules/auth/server/provider.d.ts +9 -0
  46. package/dist/modules/auth/server/provider.d.ts.map +1 -0
  47. package/dist/modules/auth/server/provider.js +2 -0
  48. package/dist/modules/auth/server/provider.js.map +1 -0
  49. package/dist/modules/auth/server/user-info.cjs +1 -0
  50. package/dist/modules/auth/server/user-info.d.cts +19 -0
  51. package/dist/modules/auth/server/user-info.d.cts.map +1 -0
  52. package/dist/modules/auth/server/user-info.d.ts +19 -0
  53. package/dist/modules/auth/server/user-info.d.ts.map +1 -0
  54. package/dist/modules/auth/server/user-info.js +2 -0
  55. package/dist/modules/auth/server/user-info.js.map +1 -0
  56. package/dist/modules/database/index.cjs +1 -0
  57. package/dist/modules/database/index.d.cts +18 -0
  58. package/dist/modules/database/index.d.cts.map +1 -0
  59. package/dist/modules/database/index.d.ts +18 -0
  60. package/dist/modules/database/index.d.ts.map +1 -0
  61. package/dist/modules/database/index.js +2 -0
  62. package/dist/modules/database/index.js.map +1 -0
  63. package/dist/modules/database/postgres.cjs +1 -0
  64. package/dist/modules/database/postgres.d.cts +5 -0
  65. package/dist/modules/database/postgres.d.cts.map +1 -0
  66. package/dist/modules/database/postgres.d.ts +5 -0
  67. package/dist/modules/database/postgres.d.ts.map +1 -0
  68. package/dist/modules/database/postgres.js +2 -0
  69. package/dist/modules/database/postgres.js.map +1 -0
  70. package/dist/modules/desktop/index.cjs +1 -1
  71. package/dist/modules/desktop/index.d.cts +4 -2
  72. package/dist/modules/desktop/index.d.ts +4 -2
  73. package/dist/modules/desktop/index.js +1 -1
  74. package/dist/modules/desktop/proxy.cjs +1 -0
  75. package/dist/modules/desktop/proxy.d.cts +22 -0
  76. package/dist/modules/desktop/proxy.d.cts.map +1 -0
  77. package/dist/modules/desktop/proxy.d.ts +22 -0
  78. package/dist/modules/desktop/proxy.d.ts.map +1 -0
  79. package/dist/modules/desktop/proxy.js +2 -0
  80. package/dist/modules/desktop/proxy.js.map +1 -0
  81. package/dist/modules/desktop/release.cjs +1 -0
  82. package/dist/modules/desktop/release.d.cts +5 -0
  83. package/dist/modules/desktop/release.d.cts.map +1 -0
  84. package/dist/modules/desktop/release.d.ts +5 -0
  85. package/dist/modules/desktop/release.d.ts.map +1 -0
  86. package/dist/modules/desktop/release.js +2 -0
  87. package/dist/modules/desktop/release.js.map +1 -0
  88. package/dist/modules/desktop/rpc.cjs +1 -1
  89. package/dist/modules/desktop/rpc.d.cts +8 -1
  90. package/dist/modules/desktop/rpc.d.cts.map +1 -1
  91. package/dist/modules/desktop/rpc.d.ts +8 -1
  92. package/dist/modules/desktop/rpc.d.ts.map +1 -1
  93. package/dist/modules/desktop/rpc.js +1 -1
  94. package/dist/modules/desktop/rpc.js.map +1 -1
  95. package/dist/modules/http/failure.cjs +1 -0
  96. package/dist/modules/http/failure.d.cts +14 -0
  97. package/dist/modules/http/failure.d.cts.map +1 -0
  98. package/dist/modules/http/failure.d.ts +14 -0
  99. package/dist/modules/http/failure.d.ts.map +1 -0
  100. package/dist/modules/http/failure.js +2 -0
  101. package/dist/modules/http/failure.js.map +1 -0
  102. package/dist/modules/http/index.cjs +1 -1
  103. package/dist/modules/http/index.d.cts +2 -1
  104. package/dist/modules/http/index.d.ts +2 -1
  105. package/dist/modules/http/index.js +1 -1
  106. package/dist/utils/normalization.cjs +1 -0
  107. package/dist/utils/normalization.d.cts +10 -0
  108. package/dist/utils/normalization.d.cts.map +1 -0
  109. package/dist/utils/normalization.d.ts +10 -0
  110. package/dist/utils/normalization.d.ts.map +1 -0
  111. package/dist/utils/normalization.js +2 -0
  112. package/dist/utils/normalization.js.map +1 -0
  113. package/docs/auth.md +6 -0
  114. package/docs/modules.md +65 -1
  115. package/package.json +14 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","names":["createOAuthProviderConfig","config","options","scopes","scope","parseHttpEndpoint","endpoint","authorizationUrl","url","all","resources","resource","AuthError"],"sources":["../../../../src/modules/auth/server/provider.ts"],"sourcesContent":["import { AuthError } from \"@/modules/auth/interface\";\nimport { parseHttpEndpoint } from \"@/utils/normalization\";\nimport type { GenericOAuthConfig } from \"better-auth/plugins/generic-oauth\";\n\nexport interface OAuthProviderConfigOptions extends Omit<\n GenericOAuthConfig,\n \"scopes\" | \"pkce\" | \"requireIdTokenVerification\" | \"responseType\"\n> {\n scopes: readonly string[];\n resources?: readonly string[];\n allowLoopbackHttp?: boolean;\n}\n\n/** Returns native options, not a plugin/auth instance. The app calls genericOAuth. */\nexport function createOAuthProviderConfig(\n options: OAuthProviderConfigOptions,\n): GenericOAuthConfig {\n const { resources = [], scopes, allowLoopbackHttp, ...config } = options;\n try {\n if (\n !config.providerId ||\n !config.clientId ||\n !config.discoveryUrl ||\n scopes.some((scope) => !/^[\\x21\\x23-\\x5B\\x5D-\\x7E]+$/.test(scope))\n )\n throw new Error();\n parseHttpEndpoint(config.discoveryUrl, { allowLoopbackHttp });\n for (const endpoint of [\n config.tokenUrl,\n config.userInfoUrl,\n config.endSessionEndpoint,\n ])\n if (endpoint) parseHttpEndpoint(endpoint, { allowLoopbackHttp });\n let authorizationUrl = config.authorizationUrl;\n if (authorizationUrl) {\n const url = parseHttpEndpoint(authorizationUrl, {\n allowLoopbackHttp,\n allowQuery: true,\n });\n const all = new Set([...url.searchParams.getAll(\"resource\"), ...resources]);\n url.searchParams.delete(\"resource\");\n for (const resource of all) {\n parseHttpEndpoint(resource, { allowLoopbackHttp });\n url.searchParams.append(\"resource\", resource);\n }\n authorizationUrl = url.href;\n } else if (resources.length) throw new Error();\n return {\n ...config,\n authorizationUrl,\n scopes: [...new Set(scopes)],\n pkce: true,\n responseType: \"code\",\n requireIdTokenVerification: true,\n };\n } catch {\n throw new AuthError(\"invalid_configuration\");\n }\n}\n"],"mappings":"A,gHAcA,SAAgBA,EACd,EACoB,CACpB,GAAM,CAAE,YAAY,CAAC,EAAG,SAAQ,oBAAmB,GAAGC,GAAWC,EACjE,GAAI,CACF,GACE,CAACD,EAAO,YACR,CAACA,EAAO,UACR,CAACA,EAAO,cACRE,EAAO,KAAM,GAAU,CAAC,8BAA8B,KAAKC,CAAK,CAAC,EAEjE,MAAU,MAAM,EAClBC,EAAkBJ,EAAO,aAAc,CAAE,mBAAkB,CAAC,EAC5D,IAAK,IAAMK,IAAY,CACrBL,EAAO,SACPA,EAAO,YACPA,EAAO,kBACT,EACMK,GAAUD,EAAkBC,EAAU,CAAE,mBAAkB,CAAC,EACjE,IAAIC,EAAmBN,EAAO,iBAC9B,GAAIM,EAAkB,CACpB,IAAMC,EAAMH,EAAkBE,EAAkB,CAC9C,oBACA,WAAY,EACd,CAAC,EACKE,kBAAM,IAAI,IAAI,CAAC,GAAGD,EAAI,aAAa,OAAO,UAAU,EAAG,GAAGE,CAAS,CAAC,EAC1EF,EAAI,aAAa,OAAO,UAAU,EAClC,IAAK,IAAMG,KAAYF,EACrBJ,EAAkBM,EAAU,CAAE,mBAAkB,CAAC,EACjDH,EAAI,aAAa,OAAO,WAAYG,CAAQ,EAE9C,EAAmBH,EAAI,IACzB,MAAO,GAAIE,EAAU,OAAQ,MAAU,MAAM,EAC7C,MAAO,CACL,GAAGT,EACH,mBACA,OAAQ,CAAC,GAAG,IAAI,IAAIE,CAAM,CAAC,EAC3B,KAAM,GACN,aAAc,OACd,2BAA4B,EAC9B,CACF,MAAQ,CACN,MAAM,IAAIS,EAAU,uBAAuB,CAC7C,CACF,C"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../interface.cjs"),t=require("./identity-cache.cjs"),n=require("./claims.cjs");function r(r){let i=t.createIdentityCache({...r,async load(t){let i=await r.load(t),a;try{if(a=r.parse(i),!n.oauthUserInfoSchema.shape.sub.safeParse(a.sub).success)throw Error()}catch{throw new e.AuthError(`rejected`)}if(r.allowed&&!await r.allowed(a))throw new e.AuthError(`forbidden`);return Object.freeze(a)}});return{...i,async get(t,n={}){let r=await i.get(t,n);if(n.subject!==void 0&&r.sub!==n.subject)throw new e.AuthError(`rejected`);return r}}}exports.createUserInfoCache=r;
@@ -0,0 +1,19 @@
1
+ import { OAuthUserInfo } from "./claims.cjs";
2
+ import { D as IdentityCacheInput, O as IdentityCacheOptions } from "../../../interface-BR9QNgXO.cjs";
3
+ export interface UserInfoCacheOptions<Profile extends {
4
+ sub: string;
5
+ }> extends Omit<IdentityCacheOptions<Profile>, "load"> {
6
+ load(credential: string): Promise<unknown>;
7
+ parse(value: unknown): Profile;
8
+ allowed?(profile: Profile): boolean | Promise<boolean>;
9
+ }
10
+ export declare function createUserInfoCache<Profile extends {
11
+ sub: string;
12
+ } = OAuthUserInfo>(options: UserInfoCacheOptions<Profile>): {
13
+ get(credential: string, input?: IdentityCacheInput & {
14
+ subject?: string;
15
+ }): Promise<Readonly<Profile>>;
16
+ forget(credential: string): Promise<void>;
17
+ clear(): void;
18
+ };
19
+ //# sourceMappingURL=user-info.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-info.d.cts","names":[],"sources":["../../../../src/modules/auth/server/user-info.ts"],"mappings":";;iBAKiB,qBAAqB;EAAkB;WAAuB,KAC7E,qBAAqB;EAGrB,KAAK,qBAAqB;EAC1B,MAAM,iBAAiB;EACvB,SAAS,SAAS,oBAAoB;;wBAGxB,oBAAoB;EAAkB;IAAgB,eACpE,SAAS,qBAAqB;EAsBd,IAAA,oBAAM,QACX;IAAuB;MAAkB,QAAA,SAAA"}
@@ -0,0 +1,19 @@
1
+ import { OAuthUserInfo } from "./claims.js";
2
+ import { D as IdentityCacheInput, O as IdentityCacheOptions } from "../../../interface-ii8DV63k.js";
3
+ export interface UserInfoCacheOptions<Profile extends {
4
+ sub: string;
5
+ }> extends Omit<IdentityCacheOptions<Profile>, "load"> {
6
+ load(credential: string): Promise<unknown>;
7
+ parse(value: unknown): Profile;
8
+ allowed?(profile: Profile): boolean | Promise<boolean>;
9
+ }
10
+ export declare function createUserInfoCache<Profile extends {
11
+ sub: string;
12
+ } = OAuthUserInfo>(options: UserInfoCacheOptions<Profile>): {
13
+ get(credential: string, input?: IdentityCacheInput & {
14
+ subject?: string;
15
+ }): Promise<Readonly<Profile>>;
16
+ forget(credential: string): Promise<void>;
17
+ clear(): void;
18
+ };
19
+ //# sourceMappingURL=user-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-info.d.ts","names":[],"sources":["../../../../src/modules/auth/server/user-info.ts"],"mappings":";;iBAKiB,qBAAqB;EAAkB;WAAuB,KAC7E,qBAAqB;EAGrB,KAAK,qBAAqB;EAC1B,MAAM,iBAAiB;EACvB,SAAS,SAAS,oBAAoB;;wBAGxB,oBAAoB;EAAkB;IAAgB,eACpE,SAAS,qBAAqB;EAsBd,IAAA,oBAAM,QACX;IAAuB;MAAkB,QAAA,SAAA"}
@@ -0,0 +1,2 @@
1
+ import{AuthError as e}from"../interface.js";import{createIdentityCache as t}from"./identity-cache.js";import{oauthUserInfoSchema as n}from"./claims.js";function r(r){let i=t({...r,async load(t){let i=await r.load(t),a;try{if(a=r.parse(i),!n.shape.sub.safeParse(a.sub).success)throw Error()}catch{throw new e(`rejected`)}if(r.allowed&&!await r.allowed(a))throw new e(`forbidden`);return Object.freeze(a)}});return{...i,async get(t,n={}){let r=await i.get(t,n);if(n.subject!==void 0&&r.sub!==n.subject)throw new e(`rejected`);return r}}}export{r as createUserInfoCache};
2
+ //# sourceMappingURL=user-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-info.js","names":["createUserInfoCache","cache","createIdentityCache","options","raw","credential","profile","oauthUserInfoSchema","AuthError","input"],"sources":["../../../../src/modules/auth/server/user-info.ts"],"sourcesContent":["import { AuthError } from \"@/modules/auth/interface\";\nimport { createIdentityCache } from \"@/modules/auth/server/identity-cache\";\nimport { oauthUserInfoSchema, type OAuthUserInfo } from \"@/modules/auth/server/claims\";\nimport type { IdentityCacheOptions, IdentityCacheInput } from \"@/utils/interface\";\n\nexport interface UserInfoCacheOptions<Profile extends { sub: string }> extends Omit<\n IdentityCacheOptions<Profile>,\n \"load\"\n> {\n load(credential: string): Promise<unknown>;\n parse(value: unknown): Profile;\n allowed?(profile: Profile): boolean | Promise<boolean>;\n}\n\nexport function createUserInfoCache<Profile extends { sub: string } = OAuthUserInfo>(\n options: UserInfoCacheOptions<Profile>,\n) {\n const cache = createIdentityCache<Readonly<Profile>>({\n ...options,\n async load(credential) {\n const raw = await options.load(credential);\n let profile: Profile;\n try {\n profile = options.parse(raw);\n if (!oauthUserInfoSchema.shape.sub.safeParse(profile.sub).success)\n throw new Error();\n } catch {\n throw new AuthError(\"rejected\");\n }\n if (options.allowed && !(await options.allowed(profile)))\n throw new AuthError(\"forbidden\");\n return Object.freeze(profile);\n },\n });\n return {\n ...cache,\n async get(\n credential: string,\n input: IdentityCacheInput & { subject?: string } = {},\n ) {\n const profile = await cache.get(credential, input);\n if (input.subject !== undefined && profile.sub !== input.subject)\n throw new AuthError(\"rejected\");\n return profile;\n },\n };\n}\n"],"mappings":"A,wJAcA,SAAgBA,EACd,EACA,CACA,IAAMC,EAAQC,EAAuC,CACnD,GAAGC,EACH,MAAM,KAAK,EAAY,CACrB,IAAMC,EAAM,MAAMD,EAAQ,KAAKE,CAAU,EACrCC,EACJ,GAAI,CAEF,GADA,EAAUH,EAAQ,MAAMC,CAAG,EACvB,CAACG,EAAoB,MAAM,IAAI,UAAUD,EAAQ,GAAG,CAAC,CAAC,QACxD,MAAU,MAAM,CACpB,MAAQ,CACN,MAAM,IAAIE,EAAU,UAAU,CAChC,CACA,GAAIL,EAAQ,SAAW,CAAE,MAAMA,EAAQ,QAAQG,CAAO,EACpD,MAAM,IAAIE,EAAU,WAAW,EACjC,OAAO,OAAO,OAAOF,CAAO,CAC9B,CACF,CAAC,EACD,MAAO,CACL,GAAGL,EACH,MAAM,IACJ,EACA,EAAmD,CAAC,EACpD,CACA,IAAMK,EAAU,MAAML,EAAM,IAAII,EAAYI,CAAK,EACjD,GAAIA,EAAM,UAAY,IAAA,IAAaH,EAAQ,MAAQG,EAAM,QACvD,MAAM,IAAID,EAAU,UAAU,EAChC,OAAOF,CACT,CACF,CACF,C"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){try{if(typeof e.connectionString!=`string`)throw Error();let t=new URL(e.connectionString);if(![`postgres:`,`postgresql:`].includes(t.protocol)||!t.hostname||t.hash)throw Error();let n=e.max??e.defaultMax??5,r=typeof n==`string`&&/^\d+$/.test(n)?Number(n):n;if(typeof r!=`number`||!Number.isSafeInteger(r)||r<1)throw Error();for(let t of[e.idleTimeoutMillis,e.connectionTimeoutMillis])if(t!==void 0&&(!Number.isSafeInteger(t)||t<0))throw Error();return{connectionString:e.connectionString,max:r,...e.idleTimeoutMillis===void 0?{}:{idleTimeoutMillis:e.idleTimeoutMillis},...e.connectionTimeoutMillis===void 0?{}:{connectionTimeoutMillis:e.connectionTimeoutMillis}}}catch{throw TypeError(`Invalid database pool configuration`)}}function t(t){return n=>t(e(n))}exports.createDatabasePoolFactory=t,exports.parseDatabasePoolOptions=e;
@@ -0,0 +1,18 @@
1
+ export interface DatabasePoolOptions {
2
+ connectionString: string;
3
+ max: number;
4
+ idleTimeoutMillis?: number;
5
+ connectionTimeoutMillis?: number;
6
+ }
7
+ export interface DatabasePoolInput {
8
+ connectionString: unknown;
9
+ max?: unknown;
10
+ defaultMax?: number;
11
+ idleTimeoutMillis?: number;
12
+ connectionTimeoutMillis?: number;
13
+ }
14
+ /** Parse app-supplied values; never read env or embed connection values in errors. */
15
+ export declare function parseDatabasePoolOptions(input: DatabasePoolInput): DatabasePoolOptions;
16
+ /** App owns memoization, error listeners, connection lifetime and shutdown. */
17
+ export declare function createDatabasePoolFactory<Pool>(create: (options: DatabasePoolOptions) => Pool): (input: DatabasePoolInput) => Pool;
18
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/modules/database/index.ts"],"mappings":"A,iBAAiB;EACf;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;EACA;;;wBAIc,yBACd,OAAO,oBACN;;wBAiCa,0BAA0B,MACxC,SAAS,SAAS,wBAAwB,QAElC,OAAO,sBAAoB"}
@@ -0,0 +1,18 @@
1
+ export interface DatabasePoolOptions {
2
+ connectionString: string;
3
+ max: number;
4
+ idleTimeoutMillis?: number;
5
+ connectionTimeoutMillis?: number;
6
+ }
7
+ export interface DatabasePoolInput {
8
+ connectionString: unknown;
9
+ max?: unknown;
10
+ defaultMax?: number;
11
+ idleTimeoutMillis?: number;
12
+ connectionTimeoutMillis?: number;
13
+ }
14
+ /** Parse app-supplied values; never read env or embed connection values in errors. */
15
+ export declare function parseDatabasePoolOptions(input: DatabasePoolInput): DatabasePoolOptions;
16
+ /** App owns memoization, error listeners, connection lifetime and shutdown. */
17
+ export declare function createDatabasePoolFactory<Pool>(create: (options: DatabasePoolOptions) => Pool): (input: DatabasePoolInput) => Pool;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/modules/database/index.ts"],"mappings":"A,iBAAiB;EACf;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;EACA;;;wBAIc,yBACd,OAAO,oBACN;;wBAiCa,0BAA0B,MACxC,SAAS,SAAS,wBAAwB,QAElC,OAAO,sBAAoB"}
@@ -0,0 +1,2 @@
1
+ function e(e){try{if(typeof e.connectionString!=`string`)throw Error();let t=new URL(e.connectionString);if(![`postgres:`,`postgresql:`].includes(t.protocol)||!t.hostname||t.hash)throw Error();let n=e.max??e.defaultMax??5,r=typeof n==`string`&&/^\d+$/.test(n)?Number(n):n;if(typeof r!=`number`||!Number.isSafeInteger(r)||r<1)throw Error();for(let t of[e.idleTimeoutMillis,e.connectionTimeoutMillis])if(t!==void 0&&(!Number.isSafeInteger(t)||t<0))throw Error();return{connectionString:e.connectionString,max:r,...e.idleTimeoutMillis===void 0?{}:{idleTimeoutMillis:e.idleTimeoutMillis},...e.connectionTimeoutMillis===void 0?{}:{connectionTimeoutMillis:e.connectionTimeoutMillis}}}catch{throw TypeError(`Invalid database pool configuration`)}}function t(t){return n=>t(e(n))}export{t as createDatabasePoolFactory,e as parseDatabasePoolOptions};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["parseDatabasePoolOptions","input","url","raw","max","value","createDatabasePoolFactory","create"],"sources":["../../../src/modules/database/index.ts"],"sourcesContent":["export interface DatabasePoolOptions {\n connectionString: string;\n max: number;\n idleTimeoutMillis?: number;\n connectionTimeoutMillis?: number;\n}\n\nexport interface DatabasePoolInput {\n connectionString: unknown;\n max?: unknown;\n defaultMax?: number;\n idleTimeoutMillis?: number;\n connectionTimeoutMillis?: number;\n}\n\n/** Parse app-supplied values; never read env or embed connection values in errors. */\nexport function parseDatabasePoolOptions(\n input: DatabasePoolInput,\n): DatabasePoolOptions {\n try {\n if (typeof input.connectionString !== \"string\") throw new Error();\n const url = new URL(input.connectionString);\n if (\n ![\"postgres:\", \"postgresql:\"].includes(url.protocol) ||\n !url.hostname ||\n url.hash\n )\n throw new Error();\n const raw = input.max ?? input.defaultMax ?? 5;\n const max = typeof raw === \"string\" && /^\\d+$/.test(raw) ? Number(raw) : raw;\n if (typeof max !== \"number\" || !Number.isSafeInteger(max) || max < 1)\n throw new Error();\n for (const value of [input.idleTimeoutMillis, input.connectionTimeoutMillis])\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))\n throw new Error();\n return {\n connectionString: input.connectionString,\n max,\n ...(input.idleTimeoutMillis === undefined\n ? {}\n : { idleTimeoutMillis: input.idleTimeoutMillis }),\n ...(input.connectionTimeoutMillis === undefined\n ? {}\n : { connectionTimeoutMillis: input.connectionTimeoutMillis }),\n };\n } catch {\n throw new TypeError(\"Invalid database pool configuration\");\n }\n}\n\n/** App owns memoization, error listeners, connection lifetime and shutdown. */\nexport function createDatabasePoolFactory<Pool>(\n create: (options: DatabasePoolOptions) => Pool,\n) {\n return (input: DatabasePoolInput): Pool => create(parseDatabasePoolOptions(input));\n}\n"],"mappings":"AAgBA,SAAgBA,EACd,EACqB,CACrB,GAAI,CACF,GAAI,OAAOC,EAAM,kBAAqB,SAAU,MAAU,MAAM,EAChE,IAAMC,EAAM,IAAI,IAAID,EAAM,gBAAgB,EAC1C,GACE,CAAC,CAAC,YAAa,aAAa,CAAC,CAAC,SAASC,EAAI,QAAQ,GACnD,CAACA,EAAI,UACLA,EAAI,KAEJ,MAAU,MAAM,EAClB,IAAMC,EAAMF,EAAM,KAAOA,EAAM,YAAc,EACvCG,EAAM,OAAOD,GAAQ,UAAY,QAAQ,KAAKA,CAAG,EAAI,OAAOA,CAAG,EAAIA,EACzE,GAAI,OAAOC,GAAQ,UAAY,CAAC,OAAO,cAAcA,CAAG,GAAKA,EAAM,EACjE,MAAU,MAAM,EAClB,IAAK,IAAMC,IAAS,CAACJ,EAAM,kBAAmBA,EAAM,uBAAuB,EACzE,GAAII,IAAU,IAAA,KAAc,CAAC,OAAO,cAAcA,CAAK,GAAKA,EAAQ,GAClE,MAAU,MAAM,EACpB,MAAO,CACL,iBAAkBJ,EAAM,iBACxB,MACA,GAAIA,EAAM,oBAAsB,IAAA,GAC5B,CAAC,EACD,CAAE,kBAAmBA,EAAM,iBAAkB,EACjD,GAAIA,EAAM,0BAA4B,IAAA,GAClC,CAAC,EACD,CAAE,wBAAyBA,EAAM,uBAAwB,CAC/D,CACF,MAAQ,CACN,MAAU,UAAU,qCAAqC,CAC3D,CACF,CAGA,SAAgBK,EACd,EACA,CACA,MAAQ,IAAmCC,EAAOP,EAAyBC,CAAK,CAAC,CACnF,C"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./index.cjs");let t=require("pg");function n(n){return new t.Pool(e.parseDatabasePoolOptions(n))}exports.createPostgresPool=n;
@@ -0,0 +1,5 @@
1
+ import { DatabasePoolInput } from "./index.cjs";
2
+ import { Pool } from "pg";
3
+ /** Call explicitly in the host composition root; no eager connection on import. */
4
+ export declare function createPostgresPool(input: DatabasePoolInput): Pool;
5
+ //# sourceMappingURL=postgres.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.cts","names":[],"sources":["../../../src/modules/database/postgres.ts"],"mappings":";;;wBAOgB,mBAAmB,OAAO,oBAAoB"}
@@ -0,0 +1,5 @@
1
+ import { DatabasePoolInput } from "./index.js";
2
+ import { Pool } from "pg";
3
+ /** Call explicitly in the host composition root; no eager connection on import. */
4
+ export declare function createPostgresPool(input: DatabasePoolInput): Pool;
5
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","names":[],"sources":["../../../src/modules/database/postgres.ts"],"mappings":";;;wBAOgB,mBAAmB,OAAO,oBAAoB"}
@@ -0,0 +1,2 @@
1
+ import{parseDatabasePoolOptions as e}from"./index.js";import{Pool as t}from"pg";function n(n){return new t(e(n))}export{n as createPostgresPool};
2
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","names":["createPostgresPool","Pool","parseDatabasePoolOptions","input"],"sources":["../../../src/modules/database/postgres.ts"],"sourcesContent":["import { Pool } from \"pg\";\nimport {\n parseDatabasePoolOptions,\n type DatabasePoolInput,\n} from \"@/modules/database/index\";\n\n/** Call explicitly in the host composition root; no eager connection on import. */\nexport function createPostgresPool(input: DatabasePoolInput): Pool {\n return new Pool(parseDatabasePoolOptions(input));\n}\n"],"mappings":"A,gFAOA,SAAgBA,EAAmB,EAAgC,CACjE,OAAO,IAAIC,EAAKC,EAAyBC,CAAK,CAAC,CACjD,C"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../utils/formatter.cjs"),t=require("./rpc.cjs"),n=require("./shortcut.cjs");exports.createDesktopRpcHandler=t.createDesktopRpcHandler,exports.createDesktopRpcTransport=t.createDesktopRpcTransport,exports.createShortcutValidator=n.createShortcutValidator,exports.normalizeAccelerator=e.normalizeAccelerator,exports.shortcutIdentity=e.shortcutIdentity;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../utils/formatter.cjs"),t=require("./rpc.cjs"),n=require("./shortcut.cjs"),r=require("./release.cjs"),i=require("./proxy.cjs");exports.createDesktopRpcHandler=t.createDesktopRpcHandler,exports.createDesktopRpcTransport=t.createDesktopRpcTransport,exports.createShortcutValidator=n.createShortcutValidator,exports.electronProxyConfig=i.electronProxyConfig,exports.isNewerRelease=r.isNewerRelease,exports.normalizeAccelerator=e.normalizeAccelerator,exports.parseRelease=r.parseRelease,exports.proxySettingsSchema=i.proxySettingsSchema,exports.releaseVersion=r.releaseVersion,exports.resolveDesktopRpcPolicy=t.resolveDesktopRpcPolicy,exports.shortcutIdentity=e.shortcutIdentity;
@@ -1,6 +1,8 @@
1
1
  import { C as DesktopRpcRequest, L as Shortcut, R as ShortcutDefinition, S as DesktopRpcPolicy, w as DesktopRpcResponse, z as ShortcutPolicy } from "../../interface-BR9QNgXO.cjs";
2
2
  import "./interface.cjs";
3
- import { createDesktopRpcHandler, createDesktopRpcTransport } from "./rpc.cjs";
3
+ import { createDesktopRpcHandler, createDesktopRpcTransport, resolveDesktopRpcPolicy } from "./rpc.cjs";
4
4
  import { o as normalizeAccelerator, s as shortcutIdentity } from "../../formatter-MMKFBkro.cjs";
5
5
  import { createShortcutValidator } from "./shortcut.cjs";
6
- export { type DesktopRpcPolicy, type DesktopRpcRequest, type DesktopRpcResponse, type Shortcut, type ShortcutDefinition, type ShortcutPolicy, createDesktopRpcHandler, createDesktopRpcTransport, createShortcutValidator, normalizeAccelerator, shortcutIdentity };
6
+ import { isNewerRelease, parseRelease, releaseVersion } from "./release.cjs";
7
+ import { ProxySettings, electronProxyConfig, proxySettingsSchema } from "./proxy.cjs";
8
+ export { type DesktopRpcPolicy, type DesktopRpcRequest, type DesktopRpcResponse, type ProxySettings, type Shortcut, type ShortcutDefinition, type ShortcutPolicy, createDesktopRpcHandler, createDesktopRpcTransport, createShortcutValidator, electronProxyConfig, isNewerRelease, normalizeAccelerator, parseRelease, proxySettingsSchema, releaseVersion, resolveDesktopRpcPolicy, shortcutIdentity };
@@ -1,6 +1,8 @@
1
1
  import { C as DesktopRpcRequest, L as Shortcut, R as ShortcutDefinition, S as DesktopRpcPolicy, w as DesktopRpcResponse, z as ShortcutPolicy } from "../../interface-ii8DV63k.js";
2
2
  import "./interface.js";
3
- import { createDesktopRpcHandler, createDesktopRpcTransport } from "./rpc.js";
3
+ import { createDesktopRpcHandler, createDesktopRpcTransport, resolveDesktopRpcPolicy } from "./rpc.js";
4
4
  import { o as normalizeAccelerator, s as shortcutIdentity } from "../../formatter-vjbCoK9k.js";
5
5
  import { createShortcutValidator } from "./shortcut.js";
6
- export { type DesktopRpcPolicy, type DesktopRpcRequest, type DesktopRpcResponse, type Shortcut, type ShortcutDefinition, type ShortcutPolicy, createDesktopRpcHandler, createDesktopRpcTransport, createShortcutValidator, normalizeAccelerator, shortcutIdentity };
6
+ import { isNewerRelease, parseRelease, releaseVersion } from "./release.js";
7
+ import { ProxySettings, electronProxyConfig, proxySettingsSchema } from "./proxy.js";
8
+ export { type DesktopRpcPolicy, type DesktopRpcRequest, type DesktopRpcResponse, type ProxySettings, type Shortcut, type ShortcutDefinition, type ShortcutPolicy, createDesktopRpcHandler, createDesktopRpcTransport, createShortcutValidator, electronProxyConfig, isNewerRelease, normalizeAccelerator, parseRelease, proxySettingsSchema, releaseVersion, resolveDesktopRpcPolicy, shortcutIdentity };
@@ -1 +1 @@
1
- import{normalizeAccelerator as e,shortcutIdentity as t}from"../../utils/formatter.js";import{createDesktopRpcHandler as n,createDesktopRpcTransport as r}from"./rpc.js";import{createShortcutValidator as i}from"./shortcut.js";export{n as createDesktopRpcHandler,r as createDesktopRpcTransport,i as createShortcutValidator,e as normalizeAccelerator,t as shortcutIdentity};
1
+ import{normalizeAccelerator as e,shortcutIdentity as t}from"../../utils/formatter.js";import{createDesktopRpcHandler as n,createDesktopRpcTransport as r,resolveDesktopRpcPolicy as i}from"./rpc.js";import{createShortcutValidator as a}from"./shortcut.js";import{isNewerRelease as o,parseRelease as s,releaseVersion as c}from"./release.js";import{electronProxyConfig as l,proxySettingsSchema as u}from"./proxy.js";export{n as createDesktopRpcHandler,r as createDesktopRpcTransport,a as createShortcutValidator,l as electronProxyConfig,o as isNewerRelease,e as normalizeAccelerator,s as parseRelease,u as proxySettingsSchema,c as releaseVersion,i as resolveDesktopRpcPolicy,t as shortcutIdentity};
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("zod");const t=e.z.object({mode:e.z.enum([`system`,`direct`,`http`,`socks5`]),host:e.z.string().trim().max(253).default(``),port:e.z.number().int().min(1).max(65535).default(8080)}).superRefine((e,t)=>{if(e.mode!==`system`&&e.mode!==`direct`)try{if(!e.host||/[\s/@?#;,\\]/.test(e.host))throw Error();let t=new URL(`http://`+e.host+`:`+e.port);if(t.hostname.toLowerCase()!==e.host.toLowerCase()||t.port&&Number(t.port)!==e.port)throw Error()}catch{t.addIssue({code:`custom`,path:[`host`],message:`Enter a hostname or IP address without a scheme or path.`})}});function n(e,n=`localhost;127.0.0.1;[::1]`){let r=t.parse(e);return r.mode===`system`||r.mode===`direct`?{mode:r.mode}:{mode:`fixed_servers`,proxyRules:`${r.mode}://${r.host}:${r.port}`,proxyBypassRules:n}}exports.electronProxyConfig=n,exports.proxySettingsSchema=t;
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ export declare const proxySettingsSchema: z.ZodObject<{
3
+ mode: z.ZodEnum<{
4
+ http: "http";
5
+ system: "system";
6
+ direct: "direct";
7
+ socks5: "socks5";
8
+ }>;
9
+ host: z.ZodDefault<z.ZodString>;
10
+ port: z.ZodDefault<z.ZodNumber>;
11
+ }, z.core.$strip>;
12
+ export type ProxySettings = z.infer<typeof proxySettingsSchema>;
13
+ export declare function electronProxyConfig(input: ProxySettings, proxyBypassRules?: string): {
14
+ mode: "system" | "direct";
15
+ proxyRules?: undefined;
16
+ proxyBypassRules?: undefined;
17
+ } | {
18
+ mode: "fixed_servers";
19
+ proxyRules: string;
20
+ proxyBypassRules: string;
21
+ };
22
+ //# sourceMappingURL=proxy.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.cts","names":[],"sources":["../../../src/modules/desktop/proxy.ts"],"mappings":";qBAEa,qBAAmB,EAAA;;;;;;;;;GAuB5B,EAAA,KAAA;YACQ,gBAAgB,EAAE,aAAa;wBAE3B,oBACd,OAAO,eACP"}
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ export declare const proxySettingsSchema: z.ZodObject<{
3
+ mode: z.ZodEnum<{
4
+ http: "http";
5
+ system: "system";
6
+ direct: "direct";
7
+ socks5: "socks5";
8
+ }>;
9
+ host: z.ZodDefault<z.ZodString>;
10
+ port: z.ZodDefault<z.ZodNumber>;
11
+ }, z.core.$strip>;
12
+ export type ProxySettings = z.infer<typeof proxySettingsSchema>;
13
+ export declare function electronProxyConfig(input: ProxySettings, proxyBypassRules?: string): {
14
+ mode: "system" | "direct";
15
+ proxyRules?: undefined;
16
+ proxyBypassRules?: undefined;
17
+ } | {
18
+ mode: "fixed_servers";
19
+ proxyRules: string;
20
+ proxyBypassRules: string;
21
+ };
22
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","names":[],"sources":["../../../src/modules/desktop/proxy.ts"],"mappings":";qBAEa,qBAAmB,EAAA;;;;;;;;;GAuB5B,EAAA,KAAA;YACQ,gBAAgB,EAAE,aAAa;wBAE3B,oBACd,OAAO,eACP"}
@@ -0,0 +1,2 @@
1
+ import{z as e}from"zod";const t=e.object({mode:e.enum([`system`,`direct`,`http`,`socks5`]),host:e.string().trim().max(253).default(``),port:e.number().int().min(1).max(65535).default(8080)}).superRefine((e,t)=>{if(e.mode!==`system`&&e.mode!==`direct`)try{if(!e.host||/[\s/@?#;,\\]/.test(e.host))throw Error();let t=new URL(`http://`+e.host+`:`+e.port);if(t.hostname.toLowerCase()!==e.host.toLowerCase()||t.port&&Number(t.port)!==e.port)throw Error()}catch{t.addIssue({code:`custom`,path:[`host`],message:`Enter a hostname or IP address without a scheme or path.`})}});function n(e,n=`localhost;127.0.0.1;[::1]`){let r=t.parse(e);return r.mode===`system`||r.mode===`direct`?{mode:r.mode}:{mode:`fixed_servers`,proxyRules:`${r.mode}://${r.host}:${r.port}`,proxyBypassRules:n}}export{n as electronProxyConfig,t as proxySettingsSchema};
2
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","names":["proxySettingsSchema","z","value","url","context","electronProxyConfig","settings","input"],"sources":["../../../src/modules/desktop/proxy.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const proxySettingsSchema = z\n .object({\n mode: z.enum([\"system\", \"direct\", \"http\", \"socks5\"]),\n host: z.string().trim().max(253).default(\"\"),\n port: z.number().int().min(1).max(65535).default(8080),\n })\n .superRefine((value, context) => {\n if (value.mode === \"system\" || value.mode === \"direct\") return;\n try {\n if (!value.host || /[\\s/@?#;,\\\\]/.test(value.host)) throw new Error();\n const url = new URL(\"http://\" + value.host + \":\" + value.port);\n if (\n url.hostname.toLowerCase() !== value.host.toLowerCase() ||\n (url.port && Number(url.port) !== value.port)\n )\n throw new Error();\n } catch {\n context.addIssue({\n code: \"custom\",\n path: [\"host\"],\n message: \"Enter a hostname or IP address without a scheme or path.\",\n });\n }\n });\nexport type ProxySettings = z.infer<typeof proxySettingsSchema>;\n\nexport function electronProxyConfig(\n input: ProxySettings,\n proxyBypassRules = \"localhost;127.0.0.1;[::1]\",\n) {\n const settings = proxySettingsSchema.parse(input);\n if (settings.mode === \"system\" || settings.mode === \"direct\")\n return { mode: settings.mode };\n return {\n mode: \"fixed_servers\" as const,\n proxyRules: `${settings.mode}://${settings.host}:${settings.port}`,\n proxyBypassRules,\n };\n}\n"],"mappings":"A,wBAEA,MAAaA,EAAsBC,EAChC,OAAO,CACN,KAAMA,EAAE,KAAK,CAAC,SAAU,SAAU,OAAQ,QAAQ,CAAC,EACnD,KAAMA,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,EAC3C,KAAMA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,IAAI,CACvD,CAAC,CAAC,CACD,aAAa,EAAO,IAAY,CAC/B,GAAIC,EAAM,OAAS,UAAYA,EAAM,OAAS,SAC9C,GAAI,CACF,GAAI,CAACA,EAAM,MAAQ,eAAe,KAAKA,EAAM,IAAI,EAAG,MAAU,MAAM,EACpE,IAAMC,EAAM,IAAI,IAAI,UAAYD,EAAM,KAAO,IAAMA,EAAM,IAAI,EAC7D,GACEC,EAAI,SAAS,YAAY,IAAMD,EAAM,KAAK,YAAY,GACrDC,EAAI,MAAQ,OAAOA,EAAI,IAAI,IAAMD,EAAM,KAExC,MAAU,MAAM,CACpB,MAAQ,CACNE,EAAQ,SAAS,CACf,KAAM,SACN,KAAM,CAAC,MAAM,EACb,QAAS,0DACX,CAAC,CACH,CACF,CAAC,EAGH,SAAgBC,EACd,EACA,EAAmB,4BACnB,CACA,IAAMC,EAAWN,EAAoB,MAAMO,CAAK,EAGhD,OAFID,EAAS,OAAS,UAAYA,EAAS,OAAS,SAC3C,CAAE,KAAMA,EAAS,IAAK,EACxB,CACL,KAAM,gBACN,WAAY,GAAGA,EAAS,KAAK,KAAKA,EAAS,KAAK,GAAGA,EAAS,OAC5D,kBACF,CACF,C"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){if(typeof e!=`string`||e.length>255)return;let t=/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.exec(e);return t?t.slice(1,4).join(`.`):void 0}function t(t,n){let r=e(t),i=e(n);if(!r||!i)return!1;let a=r.split(`.`).map(BigInt),o=i.split(`.`).map(BigInt);for(let e=0;e<3;e++){if(a[e]>o[e])return!0;if(a[e]<o[e])return!1}return!1}function n(t,n,r){if(![`darwin`,`win32`].includes(n)||![`x64`,`arm64`,`ia32`].includes(r)||!t||typeof t!=`object`)throw TypeError(`Invalid release target`);let i=t,a=e(i.tag_name);if(!a||i.draft!==!1||i.prerelease!==!1||!Array.isArray(i.assets))throw TypeError(`Invalid stable release`);let o=i.assets.map(e=>e&&typeof e==`object`&&`name`in e&&typeof e.name==`string`?e.name.toLowerCase():``);function s(e){let t=/-universal(?:[.-]|$)/.test(e)?`universal`:/-arm64(?:[.-]|$)/.test(e)?`arm64`:/-ia32(?:[.-]|$)/.test(e)?`ia32`:`x64`;return t===r||n===`darwin`&&t===`universal`}let c=o.some(e=>s(e)&&(n===`darwin`?/-(mac|darwin|osx)[.-]/.test(e)&&e.endsWith(`.zip`):e.endsWith(`.exe`))),l=n!==`win32`||o.includes(`releases`)&&o.some(e=>s(e)&&e.endsWith(`-full.nupkg`));if(!c||!l)throw TypeError(`No matching update artifact`);return a}exports.isNewerRelease=t,exports.parseRelease=n,exports.releaseVersion=e;
@@ -0,0 +1,5 @@
1
+ /** Stable SemVer only. This parses metadata, never verifies a signature or installs an artifact. */
2
+ export declare function releaseVersion(value: unknown): string | undefined;
3
+ export declare function isNewerRelease(candidate: unknown, current: string): boolean;
4
+ export declare function parseRelease(value: unknown, platform: string, arch: string): string;
5
+ //# sourceMappingURL=release.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.d.cts","names":[],"sources":["../../../src/modules/desktop/release.ts"],"mappings":";wBACgB,eAAe;wBASf,eAAe,oBAAoB;wBAanC,aAAa,gBAAgB,kBAAkB"}
@@ -0,0 +1,5 @@
1
+ /** Stable SemVer only. This parses metadata, never verifies a signature or installs an artifact. */
2
+ export declare function releaseVersion(value: unknown): string | undefined;
3
+ export declare function isNewerRelease(candidate: unknown, current: string): boolean;
4
+ export declare function parseRelease(value: unknown, platform: string, arch: string): string;
5
+ //# sourceMappingURL=release.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.d.ts","names":[],"sources":["../../../src/modules/desktop/release.ts"],"mappings":";wBACgB,eAAe;wBASf,eAAe,oBAAoB;wBAanC,aAAa,gBAAgB,kBAAkB"}
@@ -0,0 +1,2 @@
1
+ function e(e){if(typeof e!=`string`||e.length>255)return;let t=/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.exec(e);return t?t.slice(1,4).join(`.`):void 0}function t(t,n){let r=e(t),i=e(n);if(!r||!i)return!1;let a=r.split(`.`).map(BigInt),o=i.split(`.`).map(BigInt);for(let e=0;e<3;e++){if(a[e]>o[e])return!0;if(a[e]<o[e])return!1}return!1}function n(t,n,r){if(![`darwin`,`win32`].includes(n)||![`x64`,`arm64`,`ia32`].includes(r)||!t||typeof t!=`object`)throw TypeError(`Invalid release target`);let i=t,a=e(i.tag_name);if(!a||i.draft!==!1||i.prerelease!==!1||!Array.isArray(i.assets))throw TypeError(`Invalid stable release`);let o=i.assets.map(e=>e&&typeof e==`object`&&`name`in e&&typeof e.name==`string`?e.name.toLowerCase():``);function s(e){let t=/-universal(?:[.-]|$)/.test(e)?`universal`:/-arm64(?:[.-]|$)/.test(e)?`arm64`:/-ia32(?:[.-]|$)/.test(e)?`ia32`:`x64`;return t===r||n===`darwin`&&t===`universal`}let c=o.some(e=>s(e)&&(n===`darwin`?/-(mac|darwin|osx)[.-]/.test(e)&&e.endsWith(`.zip`):e.endsWith(`.exe`))),l=n!==`win32`||o.includes(`releases`)&&o.some(e=>s(e)&&e.endsWith(`-full.nupkg`));if(!c||!l)throw TypeError(`No matching update artifact`);return a}export{t as isNewerRelease,n as parseRelease,e as releaseVersion};
2
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","names":["releaseVersion","value","match","isNewerRelease","next","candidate","previous","current","b","index","parseRelease","platform","arch","release","version","names","asset","compatible","architecture","name","artifact","manifest"],"sources":["../../../src/modules/desktop/release.ts"],"sourcesContent":["/** Stable SemVer only. This parses metadata, never verifies a signature or installs an artifact. */\nexport function releaseVersion(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length > 255) return;\n const match =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/.exec(\n value,\n );\n return match ? match.slice(1, 4).join(\".\") : undefined;\n}\n\nexport function isNewerRelease(candidate: unknown, current: string): boolean {\n const next = releaseVersion(candidate),\n previous = releaseVersion(current);\n if (!next || !previous) return false;\n const a = next.split(\".\").map(BigInt),\n b = previous.split(\".\").map(BigInt);\n for (let index = 0; index < 3; index++) {\n if (a[index] > b[index]) return true;\n if (a[index] < b[index]) return false;\n }\n return false;\n}\n\nexport function parseRelease(value: unknown, platform: string, arch: string): string {\n if (\n ![\"darwin\", \"win32\"].includes(platform) ||\n ![\"x64\", \"arm64\", \"ia32\"].includes(arch) ||\n !value ||\n typeof value !== \"object\"\n )\n throw new TypeError(\"Invalid release target\");\n const release = value as Record<string, unknown>;\n const version = releaseVersion(release.tag_name);\n if (\n !version ||\n release.draft !== false ||\n release.prerelease !== false ||\n !Array.isArray(release.assets)\n )\n throw new TypeError(\"Invalid stable release\");\n const names = release.assets.map((asset: unknown) =>\n asset &&\n typeof asset === \"object\" &&\n \"name\" in asset &&\n typeof asset.name === \"string\"\n ? asset.name.toLowerCase()\n : \"\",\n );\n function compatible(name: string) {\n const architecture = /-universal(?:[.-]|$)/.test(name)\n ? \"universal\"\n : /-arm64(?:[.-]|$)/.test(name)\n ? \"arm64\"\n : /-ia32(?:[.-]|$)/.test(name)\n ? \"ia32\"\n : \"x64\";\n return (\n architecture === arch || (platform === \"darwin\" && architecture === \"universal\")\n );\n }\n const artifact = names.some(\n (name) =>\n compatible(name) &&\n (platform === \"darwin\"\n ? /-(mac|darwin|osx)[.-]/.test(name) && name.endsWith(\".zip\")\n : name.endsWith(\".exe\")),\n );\n const manifest =\n platform !== \"win32\" ||\n (names.includes(\"releases\") &&\n names.some((name) => compatible(name) && name.endsWith(\"-full.nupkg\")));\n if (!artifact || !manifest) throw new TypeError(\"No matching update artifact\");\n return version;\n}\n"],"mappings":"AACA,SAAgBA,EAAe,EAAoC,CACjE,GAAI,OAAOC,GAAU,UAAYA,EAAM,OAAS,IAAK,OACrD,IAAMC,EACJ,uFAAuF,KACrFD,CACF,EACF,OAAOC,EAAQA,EAAM,MAAM,EAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAI,IAAA,EAC/C,CAEA,SAAgBC,EAAe,EAAoB,EAA0B,CAC3E,IAAMC,EAAOJ,EAAeK,CAAS,EACnCC,EAAWN,EAAeO,CAAO,EACnC,GAAI,CAACH,GAAQ,CAACE,EAAU,MAAO,GAC/B,IAAM,EAAIF,EAAK,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,EAClCI,EAAIF,EAAS,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,EACpC,IAAK,IAAIG,EAAQ,EAAGA,EAAQ,EAAG,IAAS,CACtC,GAAI,EAAEA,GAASD,EAAEC,GAAQ,MAAO,GAChC,GAAI,EAAEA,GAASD,EAAEC,GAAQ,MAAO,EAClC,CACA,MAAO,EACT,CAEA,SAAgBC,EAAa,EAAgB,EAAkB,EAAsB,CACnF,GACE,CAAC,CAAC,SAAU,OAAO,CAAC,CAAC,SAASC,CAAQ,GACtC,CAAC,CAAC,MAAO,QAAS,MAAM,CAAC,CAAC,SAASC,CAAI,GACvC,CAACX,GACD,OAAOA,GAAU,SAEjB,MAAU,UAAU,wBAAwB,EAC9C,IAAMY,EAAUZ,EACVa,EAAUd,EAAea,EAAQ,QAAQ,EAC/C,GACE,CAACC,GACDD,EAAQ,QAAU,IAClBA,EAAQ,aAAe,IACvB,CAAC,MAAM,QAAQA,EAAQ,MAAM,EAE7B,MAAU,UAAU,wBAAwB,EAC9C,IAAME,EAAQF,EAAQ,OAAO,IAAK,GAChCG,GACA,OAAOA,GAAU,UACjB,SAAUA,GACV,OAAOA,EAAM,MAAS,SAClBA,EAAM,KAAK,YAAY,EACvB,EACN,EACA,SAASC,EAAW,EAAc,CAChC,IAAMC,EAAe,uBAAuB,KAAKC,CAAI,EACjD,YACA,mBAAmB,KAAKA,CAAI,EAC1B,QACA,kBAAkB,KAAKA,CAAI,EACzB,OACA,MACR,OACED,IAAiBN,GAASD,IAAa,UAAYO,IAAiB,WAExE,CACA,IAAME,EAAWL,EAAM,KACpB,GACCE,EAAWE,CAAI,IACdR,IAAa,SACV,wBAAwB,KAAKQ,CAAI,GAAKA,EAAK,SAAS,MAAM,EAC1DA,EAAK,SAAS,MAAM,EAC5B,EACME,EACJV,IAAa,SACZI,EAAM,SAAS,UAAU,GACxBA,EAAM,KAAM,GAASE,EAAWE,CAAI,GAAKA,EAAK,SAAS,aAAa,CAAC,EACzE,GAAI,CAACC,GAAY,CAACC,EAAU,MAAU,UAAU,6BAA6B,EAC7E,OAAOP,CACT,C"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../auth/client/retry.cjs"),t=require("../../utils/formatter.cjs");let n=require("zod");function r(e){let t=e.origin??`https://desktop.invalid`,n=e.endpoint??`/trpc`,r=e.maxUrlLength??2e6,i=e.maxBodyBytes??8e6,a=e.maxResponseBytes??8e6,o=new URL(t);if(o.origin!==t||o.protocol!==`https:`||!/^\/[a-zA-Z][a-zA-Z0-9/-]*$/.test(n)||n.endsWith(`/`)||![r,i,a].every(e=>Number.isSafeInteger(e)&&e>0&&e<=16e6))throw TypeError(`Invalid desktop RPC policy`);return{origin:t,endpoint:n,maxUrlLength:r,maxBodyBytes:i,maxResponseBytes:a}}function i(e){return n.z.object({url:n.z.string().max(e.maxUrlLength).refine(t=>{try{let n=new URL(t),r=n.pathname.slice(e.endpoint.length+1);return n.origin===e.origin&&n.pathname.startsWith(e.endpoint+`/`)&&/^[a-zA-Z][a-zA-Z0-9.]*$/.test(r)&&!n.username&&!n.password&&!n.hash}catch{return!1}}),method:n.z.enum([`GET`,`POST`]),body:n.z.string().max(e.maxBodyBytes).optional()}).strict().refine(t=>(t.method!==`GET`||t.body===void 0)&&(t.body===void 0||new TextEncoder().encode(t.body).length<=e.maxBodyBytes))}function a(e){let n=r(e),a=i(n);return async function(r){let i=a.safeParse(r);if(!i.success)return t.formatRpcFailure(400,`Invalid desktop RPC request.`,-32600,`BAD_REQUEST`);try{let t=await e.handle(new Request(i.data.url,{method:i.data.method,body:i.data.body,headers:{"content-type":`application/json`}})),r=await o(t,n.maxResponseBytes);if(t.status<200||t.status>599)throw Error();return{status:t.status,body:r}}catch{return t.formatRpcFailure(500,`Desktop RPC unavailable.`,-32603,`INTERNAL_SERVER_ERROR`)}}}async function o(e,t){if(!e.body)return``;let n=e.body.getReader(),r=[],i=0;try{for(;;){let e=await n.read();if(e.done)break;if(i+=e.value.byteLength,i>t)throw await n.cancel(),Error(`RPC response too large`);r.push(e.value)}}finally{n.releaseLock()}let a=new Uint8Array(i),o=0;for(let e of r)a.set(e,o),o+=e.length;return new TextDecoder().decode(a)}function s(t){let n=r(t),a=i(n);return async function(r,i){let s=i?.signal??(r instanceof Request?r.signal:void 0);s?.throwIfAborted();let c=(i?.method??(r instanceof Request?r.method:`GET`)).toUpperCase(),l=i?.body??(r instanceof Request&&c===`POST`?await o(new Response(r.body),n.maxBodyBytes):void 0);if(l!==void 0&&typeof l!=`string`)throw TypeError(`Desktop RPC body must be text`);let u=a.parse({url:r instanceof Request?r.url:String(r),method:c,...l===void 0?{}:{body:l}});s?.throwIfAborted();let d=await e.waitForAuthOperation(t.request(u,s??void 0),s??void 0);if(s?.throwIfAborted(),!Number.isInteger(d.status)||d.status<200||d.status>599||typeof d.body!=`string`||new TextEncoder().encode(d.body).length>n.maxResponseBytes)throw TypeError(`Invalid desktop RPC response`);return new Response([204,205,304].includes(d.status)?null:d.body,{status:d.status,headers:{"content-type":`application/json`}})}}exports.createDesktopRpcHandler=a,exports.createDesktopRpcTransport=s;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../auth/client/retry.cjs"),t=require("../../utils/formatter.cjs");let n=require("zod");function r(e={}){let t=e.origin??`https://desktop.invalid`,n=e.endpoint??`/trpc`,r=e.maxUrlLength??2e6,i=e.maxBodyBytes??8e6,a=e.maxResponseBytes??8e6,o=new URL(t);if(o.origin!==t||o.protocol!==`https:`||!/^\/[a-zA-Z][a-zA-Z0-9/-]*$/.test(n)||n.endsWith(`/`)||![r,i,a].every(e=>Number.isSafeInteger(e)&&e>0&&e<=16e6))throw TypeError(`Invalid desktop RPC policy`);return{origin:t,endpoint:n,maxUrlLength:r,maxBodyBytes:i,maxResponseBytes:a}}function i(e){return n.z.object({url:n.z.string().max(e.maxUrlLength).refine(t=>{try{let n=new URL(t),r=n.pathname.slice(e.endpoint.length+1);return n.origin===e.origin&&n.pathname.startsWith(e.endpoint+`/`)&&/^[a-zA-Z][a-zA-Z0-9.]*$/.test(r)&&!n.username&&!n.password&&!n.hash}catch{return!1}}),method:n.z.enum([`GET`,`POST`]),body:n.z.string().max(e.maxBodyBytes).optional()}).strict().refine(t=>(t.method!==`GET`||t.body===void 0)&&(t.body===void 0||new TextEncoder().encode(t.body).length<=e.maxBodyBytes))}function a(e){let n=r(e),a=i(n);return async function(r){let i=a.safeParse(r);if(!i.success)return t.formatRpcFailure(400,`Invalid desktop RPC request.`,-32600,`BAD_REQUEST`);try{let t=await e.handle(new Request(i.data.url,{method:i.data.method,body:i.data.body,headers:{"content-type":`application/json`}})),r=await o(t,n.maxResponseBytes);if(t.status<200||t.status>599)throw Error();return{status:t.status,body:r}}catch{return t.formatRpcFailure(500,`Desktop RPC unavailable.`,-32603,`INTERNAL_SERVER_ERROR`)}}}async function o(e,t){if(!e.body)return``;let n=e.body.getReader(),r=[],i=0;try{for(;;){let e=await n.read();if(e.done)break;if(i+=e.value.byteLength,i>t)throw await n.cancel(),Error(`RPC response too large`);r.push(e.value)}}finally{n.releaseLock()}let a=new Uint8Array(i),o=0;for(let e of r)a.set(e,o),o+=e.length;return new TextDecoder().decode(a)}function s(t){let n=r(t),a=i(n);return async function(r,i){let s=i?.signal??(r instanceof Request?r.signal:void 0);s?.throwIfAborted();let c=(i?.method??(r instanceof Request?r.method:`GET`)).toUpperCase(),l=i?.body??(r instanceof Request&&c===`POST`?await o(new Response(r.body),n.maxBodyBytes):void 0);if(l!==void 0&&typeof l!=`string`)throw TypeError(`Desktop RPC body must be text`);let u=a.parse({url:r instanceof Request?r.url:String(r),method:c,...l===void 0?{}:{body:l}});s?.throwIfAborted();let d=await e.waitForAuthOperation(t.request(u,s??void 0),s??void 0);if(s?.throwIfAborted(),!Number.isInteger(d.status)||d.status<200||d.status>599||typeof d.body!=`string`||new TextEncoder().encode(d.body).length>n.maxResponseBytes)throw TypeError(`Invalid desktop RPC response`);return new Response([204,205,304].includes(d.status)?null:d.body,{status:d.status,headers:{"content-type":`application/json`}})}}exports.createDesktopRpcHandler=a,exports.createDesktopRpcTransport=s,exports.resolveDesktopRpcPolicy=r;
@@ -1,5 +1,12 @@
1
1
  import "./interface.cjs";
2
- import { T as DesktopRpcTransportOptions, w as DesktopRpcResponse, x as DesktopRpcHandlerOptions } from "../../interface-BR9QNgXO.cjs";
2
+ import { S as DesktopRpcPolicy, T as DesktopRpcTransportOptions, w as DesktopRpcResponse, x as DesktopRpcHandlerOptions } from "../../interface-BR9QNgXO.cjs";
3
+ export declare function resolveDesktopRpcPolicy(options?: DesktopRpcPolicy): {
4
+ origin: string;
5
+ endpoint: string;
6
+ maxUrlLength: number;
7
+ maxBodyBytes: number;
8
+ maxResponseBytes: number;
9
+ };
3
10
  /** Main-process packet validation. Supply tRPC's fetchRequestHandler as handle. */
4
11
  export declare function createDesktopRpcHandler(options: DesktopRpcHandlerOptions): (input: unknown) => Promise<DesktopRpcResponse>;
5
12
  /** No network request: URL is protocol metadata passed to app-owned trusted IPC. */
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.cts","names":[],"sources":["../../../src/modules/desktop/rpc.ts"],"mappings":";;;wBAmEgB,wBAAwB,SAAS,4BAI7C,mBACC,QAAQ;;wBA2DG,0BAA0B,SAAS,8BAI/C,gBAAgB,MAAM,SACtB,OAAO,gBACN,QAAQ"}
1
+ {"version":3,"file":"rpc.d.cts","names":[],"sources":["../../../src/modules/desktop/rpc.ts"],"mappings":";;wBASgB,wBAAwB,UAAS;;;;;;;;wBAsDjC,wBAAwB,SAAS,4BAGR,mBAAiB,QAAQ;;wBA2DlD,0BAA0B,SAAS,8BAI/C,gBAAgB,MAAM,SACtB,OAAO,gBACN,QAAQ"}
@@ -1,5 +1,12 @@
1
1
  import "./interface.js";
2
- import { T as DesktopRpcTransportOptions, w as DesktopRpcResponse, x as DesktopRpcHandlerOptions } from "../../interface-ii8DV63k.js";
2
+ import { S as DesktopRpcPolicy, T as DesktopRpcTransportOptions, w as DesktopRpcResponse, x as DesktopRpcHandlerOptions } from "../../interface-ii8DV63k.js";
3
+ export declare function resolveDesktopRpcPolicy(options?: DesktopRpcPolicy): {
4
+ origin: string;
5
+ endpoint: string;
6
+ maxUrlLength: number;
7
+ maxBodyBytes: number;
8
+ maxResponseBytes: number;
9
+ };
3
10
  /** Main-process packet validation. Supply tRPC's fetchRequestHandler as handle. */
4
11
  export declare function createDesktopRpcHandler(options: DesktopRpcHandlerOptions): (input: unknown) => Promise<DesktopRpcResponse>;
5
12
  /** No network request: URL is protocol metadata passed to app-owned trusted IPC. */
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.ts","names":[],"sources":["../../../src/modules/desktop/rpc.ts"],"mappings":";;;wBAmEgB,wBAAwB,SAAS,4BAI7C,mBACC,QAAQ;;wBA2DG,0BAA0B,SAAS,8BAI/C,gBAAgB,MAAM,SACtB,OAAO,gBACN,QAAQ"}
1
+ {"version":3,"file":"rpc.d.ts","names":[],"sources":["../../../src/modules/desktop/rpc.ts"],"mappings":";;wBASgB,wBAAwB,UAAS;;;;;;;;wBAsDjC,wBAAwB,SAAS,4BAGR,mBAAiB,QAAQ;;wBA2DlD,0BAA0B,SAAS,8BAI/C,gBAAgB,MAAM,SACtB,OAAO,gBACN,QAAQ"}
@@ -1,2 +1,2 @@
1
- import{waitForAuthOperation as e}from"../auth/client/retry.js";import{formatRpcFailure as t}from"../../utils/formatter.js";import{z as n}from"zod";function r(e){let t=e.origin??`https://desktop.invalid`,n=e.endpoint??`/trpc`,r=e.maxUrlLength??2e6,i=e.maxBodyBytes??8e6,a=e.maxResponseBytes??8e6,o=new URL(t);if(o.origin!==t||o.protocol!==`https:`||!/^\/[a-zA-Z][a-zA-Z0-9/-]*$/.test(n)||n.endsWith(`/`)||![r,i,a].every(e=>Number.isSafeInteger(e)&&e>0&&e<=16e6))throw TypeError(`Invalid desktop RPC policy`);return{origin:t,endpoint:n,maxUrlLength:r,maxBodyBytes:i,maxResponseBytes:a}}function i(e){return n.object({url:n.string().max(e.maxUrlLength).refine(t=>{try{let n=new URL(t),r=n.pathname.slice(e.endpoint.length+1);return n.origin===e.origin&&n.pathname.startsWith(e.endpoint+`/`)&&/^[a-zA-Z][a-zA-Z0-9.]*$/.test(r)&&!n.username&&!n.password&&!n.hash}catch{return!1}}),method:n.enum([`GET`,`POST`]),body:n.string().max(e.maxBodyBytes).optional()}).strict().refine(t=>(t.method!==`GET`||t.body===void 0)&&(t.body===void 0||new TextEncoder().encode(t.body).length<=e.maxBodyBytes))}function a(e){let n=r(e),a=i(n);return async function(r){let i=a.safeParse(r);if(!i.success)return t(400,`Invalid desktop RPC request.`,-32600,`BAD_REQUEST`);try{let t=await e.handle(new Request(i.data.url,{method:i.data.method,body:i.data.body,headers:{"content-type":`application/json`}})),r=await o(t,n.maxResponseBytes);if(t.status<200||t.status>599)throw Error();return{status:t.status,body:r}}catch{return t(500,`Desktop RPC unavailable.`,-32603,`INTERNAL_SERVER_ERROR`)}}}async function o(e,t){if(!e.body)return``;let n=e.body.getReader(),r=[],i=0;try{for(;;){let e=await n.read();if(e.done)break;if(i+=e.value.byteLength,i>t)throw await n.cancel(),Error(`RPC response too large`);r.push(e.value)}}finally{n.releaseLock()}let a=new Uint8Array(i),o=0;for(let e of r)a.set(e,o),o+=e.length;return new TextDecoder().decode(a)}function s(t){let n=r(t),a=i(n);return async function(r,i){let s=i?.signal??(r instanceof Request?r.signal:void 0);s?.throwIfAborted();let c=(i?.method??(r instanceof Request?r.method:`GET`)).toUpperCase(),l=i?.body??(r instanceof Request&&c===`POST`?await o(new Response(r.body),n.maxBodyBytes):void 0);if(l!==void 0&&typeof l!=`string`)throw TypeError(`Desktop RPC body must be text`);let u=a.parse({url:r instanceof Request?r.url:String(r),method:c,...l===void 0?{}:{body:l}});s?.throwIfAborted();let d=await e(t.request(u,s??void 0),s??void 0);if(s?.throwIfAborted(),!Number.isInteger(d.status)||d.status<200||d.status>599||typeof d.body!=`string`||new TextEncoder().encode(d.body).length>n.maxResponseBytes)throw TypeError(`Invalid desktop RPC response`);return new Response([204,205,304].includes(d.status)?null:d.body,{status:d.status,headers:{"content-type":`application/json`}})}}export{a as createDesktopRpcHandler,s as createDesktopRpcTransport};
1
+ import{waitForAuthOperation as e}from"../auth/client/retry.js";import{formatRpcFailure as t}from"../../utils/formatter.js";import{z as n}from"zod";function r(e={}){let t=e.origin??`https://desktop.invalid`,n=e.endpoint??`/trpc`,r=e.maxUrlLength??2e6,i=e.maxBodyBytes??8e6,a=e.maxResponseBytes??8e6,o=new URL(t);if(o.origin!==t||o.protocol!==`https:`||!/^\/[a-zA-Z][a-zA-Z0-9/-]*$/.test(n)||n.endsWith(`/`)||![r,i,a].every(e=>Number.isSafeInteger(e)&&e>0&&e<=16e6))throw TypeError(`Invalid desktop RPC policy`);return{origin:t,endpoint:n,maxUrlLength:r,maxBodyBytes:i,maxResponseBytes:a}}function i(e){return n.object({url:n.string().max(e.maxUrlLength).refine(t=>{try{let n=new URL(t),r=n.pathname.slice(e.endpoint.length+1);return n.origin===e.origin&&n.pathname.startsWith(e.endpoint+`/`)&&/^[a-zA-Z][a-zA-Z0-9.]*$/.test(r)&&!n.username&&!n.password&&!n.hash}catch{return!1}}),method:n.enum([`GET`,`POST`]),body:n.string().max(e.maxBodyBytes).optional()}).strict().refine(t=>(t.method!==`GET`||t.body===void 0)&&(t.body===void 0||new TextEncoder().encode(t.body).length<=e.maxBodyBytes))}function a(e){let n=r(e),a=i(n);return async function(r){let i=a.safeParse(r);if(!i.success)return t(400,`Invalid desktop RPC request.`,-32600,`BAD_REQUEST`);try{let t=await e.handle(new Request(i.data.url,{method:i.data.method,body:i.data.body,headers:{"content-type":`application/json`}})),r=await o(t,n.maxResponseBytes);if(t.status<200||t.status>599)throw Error();return{status:t.status,body:r}}catch{return t(500,`Desktop RPC unavailable.`,-32603,`INTERNAL_SERVER_ERROR`)}}}async function o(e,t){if(!e.body)return``;let n=e.body.getReader(),r=[],i=0;try{for(;;){let e=await n.read();if(e.done)break;if(i+=e.value.byteLength,i>t)throw await n.cancel(),Error(`RPC response too large`);r.push(e.value)}}finally{n.releaseLock()}let a=new Uint8Array(i),o=0;for(let e of r)a.set(e,o),o+=e.length;return new TextDecoder().decode(a)}function s(t){let n=r(t),a=i(n);return async function(r,i){let s=i?.signal??(r instanceof Request?r.signal:void 0);s?.throwIfAborted();let c=(i?.method??(r instanceof Request?r.method:`GET`)).toUpperCase(),l=i?.body??(r instanceof Request&&c===`POST`?await o(new Response(r.body),n.maxBodyBytes):void 0);if(l!==void 0&&typeof l!=`string`)throw TypeError(`Desktop RPC body must be text`);let u=a.parse({url:r instanceof Request?r.url:String(r),method:c,...l===void 0?{}:{body:l}});s?.throwIfAborted();let d=await e(t.request(u,s??void 0),s??void 0);if(s?.throwIfAborted(),!Number.isInteger(d.status)||d.status<200||d.status>599||typeof d.body!=`string`||new TextEncoder().encode(d.body).length>n.maxResponseBytes)throw TypeError(`Invalid desktop RPC response`);return new Response([204,205,304].includes(d.status)?null:d.body,{status:d.status,headers:{"content-type":`application/json`}})}}export{a as createDesktopRpcHandler,s as createDesktopRpcTransport,r as resolveDesktopRpcPolicy};
2
2
  //# sourceMappingURL=rpc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.js","names":["rpcPolicy","origin","options","endpoint","maxUrlLength","maxBodyBytes","maxResponseBytes","url","value","requestSchema","z","policy","path","input","createDesktopRpcHandler","schema","parsed","formatRpcFailure","response","body","boundedResponseText","reader","chunks","size","next","limit","bytes","offset","chunk","createDesktopRpcTransport","signal","init","method","result","waitForAuthOperation"],"sources":["../../../src/modules/desktop/rpc.ts"],"sourcesContent":["import { waitForAuthOperation } from \"@/modules/auth/client/retry\";\nimport type {\n DesktopRpcPolicy,\n DesktopRpcResponse,\n} from \"@/modules/desktop/interface\";\nimport { formatRpcFailure } from \"@/utils/formatter\";\nimport type {\n DesktopRpcHandlerOptions,\n DesktopRpcTransportOptions,\n} from \"@/utils/interface\";\nimport { z } from \"zod\";\n\nfunction rpcPolicy(options: DesktopRpcPolicy) {\n const origin = options.origin ?? \"https://desktop.invalid\";\n const endpoint = options.endpoint ?? \"/trpc\";\n const maxUrlLength = options.maxUrlLength ?? 2_000_000;\n const maxBodyBytes = options.maxBodyBytes ?? 8_000_000;\n const maxResponseBytes = options.maxResponseBytes ?? 8_000_000;\n const url = new URL(origin);\n if (\n url.origin !== origin ||\n url.protocol !== \"https:\" ||\n !/^\\/[a-zA-Z][a-zA-Z0-9/-]*$/.test(endpoint) ||\n endpoint.endsWith(\"/\") ||\n ![maxUrlLength, maxBodyBytes, maxResponseBytes].every(\n (value) =>\n Number.isSafeInteger(value) && value > 0 && value <= 16_000_000,\n )\n )\n throw new TypeError(\"Invalid desktop RPC policy\");\n return { origin, endpoint, maxUrlLength, maxBodyBytes, maxResponseBytes };\n}\nfunction requestSchema(policy: ReturnType<typeof rpcPolicy>) {\n return z\n .object({\n url: z\n .string()\n .max(policy.maxUrlLength)\n .refine((value) => {\n try {\n const url = new URL(value);\n const path = url.pathname.slice(policy.endpoint.length + 1);\n return (\n url.origin === policy.origin &&\n url.pathname.startsWith(policy.endpoint + \"/\") &&\n /^[a-zA-Z][a-zA-Z0-9.]*$/.test(path) &&\n !url.username &&\n !url.password &&\n !url.hash\n );\n } catch {\n return false;\n }\n }),\n method: z.enum([\"GET\", \"POST\"]),\n body: z.string().max(policy.maxBodyBytes).optional(),\n })\n .strict()\n .refine(\n (input) =>\n (input.method !== \"GET\" || input.body === undefined) &&\n (input.body === undefined ||\n new TextEncoder().encode(input.body).length <= policy.maxBodyBytes),\n );\n}\n\n/** Main-process packet validation. Supply tRPC's fetchRequestHandler as handle. */\nexport function createDesktopRpcHandler(options: DesktopRpcHandlerOptions) {\n const policy = rpcPolicy(options);\n const schema = requestSchema(policy);\n return async function handleRpcRequest(\n input: unknown,\n ): Promise<DesktopRpcResponse> {\n const parsed = schema.safeParse(input);\n if (!parsed.success)\n return formatRpcFailure(\n 400,\n \"Invalid desktop RPC request.\",\n -32600,\n \"BAD_REQUEST\",\n );\n try {\n const response = await options.handle(\n new Request(parsed.data.url, {\n method: parsed.data.method,\n body: parsed.data.body,\n headers: { \"content-type\": \"application/json\" },\n }),\n );\n const body = await boundedResponseText(response, policy.maxResponseBytes);\n if (response.status < 200 || response.status > 599) throw new Error();\n return { status: response.status, body };\n } catch {\n return formatRpcFailure(\n 500,\n \"Desktop RPC unavailable.\",\n -32603,\n \"INTERNAL_SERVER_ERROR\",\n );\n }\n };\n}\nasync function boundedResponseText(response: Response, limit: number) {\n if (!response.body) return \"\";\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const next = await reader.read();\n if (next.done) break;\n size += next.value.byteLength;\n if (size > limit) {\n await reader.cancel();\n throw new Error(\"RPC response too large\");\n }\n chunks.push(next.value);\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return new TextDecoder().decode(bytes);\n}\n\n/** No network request: URL is protocol metadata passed to app-owned trusted IPC. */\nexport function createDesktopRpcTransport(options: DesktopRpcTransportOptions) {\n const policy = rpcPolicy(options);\n const schema = requestSchema(policy);\n return async function rpcFetch(\n input: string | URL | Request,\n init?: RequestInit,\n ): Promise<Response> {\n const signal =\n init?.signal ?? (input instanceof Request ? input.signal : undefined);\n signal?.throwIfAborted();\n const method = (\n init?.method ?? (input instanceof Request ? input.method : \"GET\")\n ).toUpperCase();\n const body =\n init?.body ??\n (input instanceof Request && method === \"POST\"\n ? await boundedResponseText(\n new Response(input.body),\n policy.maxBodyBytes,\n )\n : undefined);\n if (body !== undefined && typeof body !== \"string\")\n throw new TypeError(\"Desktop RPC body must be text\");\n const parsed = schema.parse({\n url: input instanceof Request ? input.url : String(input),\n method,\n ...(body === undefined ? {} : { body }),\n });\n signal?.throwIfAborted();\n const result = await waitForAuthOperation(\n options.request(parsed, signal ?? undefined),\n signal ?? undefined,\n );\n signal?.throwIfAborted();\n if (\n !Number.isInteger(result.status) ||\n result.status < 200 ||\n result.status > 599 ||\n typeof result.body !== \"string\" ||\n new TextEncoder().encode(result.body).length > policy.maxResponseBytes\n )\n throw new TypeError(\"Invalid desktop RPC response\");\n return new Response(\n [204, 205, 304].includes(result.status) ? null : result.body,\n {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n },\n );\n };\n}\n"],"mappings":"A,mJAYA,SAASA,EAAU,EAA2B,CAC5C,IAAMC,EAASC,EAAQ,QAAU,0BAC3BC,EAAWD,EAAQ,UAAY,QAC/BE,EAAeF,EAAQ,cAAgB,IACvCG,EAAeH,EAAQ,cAAgB,IACvCI,EAAmBJ,EAAQ,kBAAoB,IAC/CK,EAAM,IAAI,IAAIN,CAAM,EAC1B,GACEM,EAAI,SAAWN,GACfM,EAAI,WAAa,UACjB,CAAC,6BAA6B,KAAKJ,CAAQ,GAC3CA,EAAS,SAAS,GAAG,GACrB,CAAC,CAACC,EAAcC,EAAcC,CAAgB,CAAC,CAAC,MAC7C,GACC,OAAO,cAAcE,CAAK,GAAKA,EAAQ,GAAKA,GAAS,IACzD,EAEA,MAAU,UAAU,4BAA4B,EAClD,MAAO,CAAE,SAAQ,WAAU,eAAc,eAAc,kBAAiB,CAC1E,CACA,SAASC,EAAc,EAAsC,CAC3D,OAAOC,EACJ,OAAO,CACN,IAAKA,EACF,OAAO,CAAC,CACR,IAAIC,EAAO,YAAY,CAAC,CACxB,OAAQ,GAAU,CACjB,GAAI,CACF,IAAMJ,EAAM,IAAI,IAAIC,CAAK,EACnBI,EAAOL,EAAI,SAAS,MAAMI,EAAO,SAAS,OAAS,CAAC,EAC1D,OACEJ,EAAI,SAAWI,EAAO,QACtBJ,EAAI,SAAS,WAAWI,EAAO,SAAW,GAAG,GAC7C,0BAA0B,KAAKC,CAAI,GACnC,CAACL,EAAI,UACL,CAACA,EAAI,UACL,CAACA,EAAI,IAET,MAAQ,CACN,MAAO,EACT,CACF,CAAC,EACH,OAAQG,EAAE,KAAK,CAAC,MAAO,MAAM,CAAC,EAC9B,KAAMA,EAAE,OAAO,CAAC,CAAC,IAAIC,EAAO,YAAY,CAAC,CAAC,SAAS,CACrD,CAAC,CAAC,CACD,OAAO,CAAC,CACR,OACE,IACEE,EAAM,SAAW,OAASA,EAAM,OAAS,IAAA,MACzCA,EAAM,OAAS,IAAA,IACd,IAAI,YAAY,CAAC,CAAC,OAAOA,EAAM,IAAI,CAAC,CAAC,QAAUF,EAAO,aAC5D,CACJ,CAGA,SAAgBG,EAAwB,EAAmC,CACzE,IAAMH,EAASX,EAAUE,CAAO,EAC1Ba,EAASN,EAAcE,CAAM,EACnC,OAAO,eACL,EAC6B,CAC7B,IAAMK,EAASD,EAAO,UAAUF,CAAK,EACrC,GAAI,CAACG,EAAO,QACV,OAAOC,EACL,IACA,+BACA,OACA,aACF,EACF,GAAI,CACF,IAAMC,EAAW,MAAMhB,EAAQ,OAC7B,IAAI,QAAQc,EAAO,KAAK,IAAK,CAC3B,OAAQA,EAAO,KAAK,OACpB,KAAMA,EAAO,KAAK,KAClB,QAAS,CAAE,eAAgB,kBAAmB,CAChD,CAAC,CACH,EACMG,EAAO,MAAMC,EAAoBF,EAAUP,EAAO,gBAAgB,EACxE,GAAIO,EAAS,OAAS,KAAOA,EAAS,OAAS,IAAK,MAAU,MAAM,EACpE,MAAO,CAAE,OAAQA,EAAS,OAAQ,MAAK,CACzC,MAAQ,CACN,OAAOD,EACL,IACA,2BACA,OACA,uBACF,CACF,CACF,CACF,CACA,eAAeG,EAAoB,EAAoB,EAAe,CACpE,GAAI,CAACF,EAAS,KAAM,MAAO,GAC3B,IAAMG,EAASH,EAAS,KAAK,UAAU,EACjCI,EAAuB,CAAC,EAC1BC,EAAO,EACX,GAAI,CACF,OAAS,CACP,IAAMC,EAAO,MAAMH,EAAO,KAAK,EAC/B,GAAIG,EAAK,KAAM,MAEf,GADA,GAAQA,EAAK,MAAM,WACfD,EAAOE,EAET,MADA,MAAMJ,EAAO,OAAO,EACV,MAAM,wBAAwB,EAE1CC,EAAO,KAAKE,EAAK,KAAK,CACxB,CACF,QAAU,CACRH,EAAO,YAAY,CACrB,CACA,IAAMK,EAAQ,IAAI,WAAWH,CAAI,EAC7BI,EAAS,EACb,IAAK,IAAMC,KAASN,EAClBI,EAAM,IAAIE,EAAOD,CAAM,EACvB,GAAUC,EAAM,OAElB,OAAO,IAAI,YAAY,CAAC,CAAC,OAAOF,CAAK,CACvC,CAGA,SAAgBG,EAA0B,EAAqC,CAC7E,IAAMlB,EAASX,EAAUE,CAAO,EAC1Ba,EAASN,EAAcE,CAAM,EACnC,OAAO,eACL,EACA,EACmB,CACnB,IAAMmB,EACJC,GAAM,SAAWlB,aAAiB,QAAUA,EAAM,OAAS,IAAA,IAC7DiB,GAAQ,eAAe,EACvB,IAAME,GACJD,GAAM,SAAWlB,aAAiB,QAAUA,EAAM,OAAS,OAAA,CAC3D,YAAY,EACRM,EACJY,GAAM,OACLlB,aAAiB,SAAWmB,IAAW,OACpC,MAAMZ,EACJ,IAAI,SAASP,EAAM,IAAI,EACvBF,EAAO,YACT,EACA,IAAA,IACN,GAAIQ,IAAS,IAAA,IAAa,OAAOA,GAAS,SACxC,MAAU,UAAU,+BAA+B,EACrD,IAAMH,EAASD,EAAO,MAAM,CAC1B,IAAKF,aAAiB,QAAUA,EAAM,IAAM,OAAOA,CAAK,EACxD,SACA,GAAIM,IAAS,IAAA,GAAY,CAAC,EAAI,CAAE,MAAK,CACvC,CAAC,EACDW,GAAQ,eAAe,EACvB,IAAMG,EAAS,MAAMC,EACnBhC,EAAQ,QAAQc,EAAQc,GAAU,IAAA,EAAS,EAC3CA,GAAU,IAAA,EACZ,EAEA,GADAA,GAAQ,eAAe,EAErB,CAAC,OAAO,UAAUG,EAAO,MAAM,GAC/BA,EAAO,OAAS,KAChBA,EAAO,OAAS,KAChB,OAAOA,EAAO,MAAS,UACvB,IAAI,YAAY,CAAC,CAAC,OAAOA,EAAO,IAAI,CAAC,CAAC,OAAStB,EAAO,iBAEtD,MAAU,UAAU,8BAA8B,EACpD,OAAO,IAAI,SACT,CAAC,IAAK,IAAK,GAAG,CAAC,CAAC,SAASsB,EAAO,MAAM,EAAI,KAAOA,EAAO,KACxD,CACE,OAAQA,EAAO,OACf,QAAS,CAAE,eAAgB,kBAAmB,CAChD,CACF,CACF,CACF,C"}
1
+ {"version":3,"file":"rpc.js","names":["resolveDesktopRpcPolicy","origin","options","endpoint","maxUrlLength","maxBodyBytes","maxResponseBytes","url","value","requestSchema","z","policy","path","input","createDesktopRpcHandler","schema","parsed","formatRpcFailure","response","body","boundedResponseText","reader","chunks","size","next","limit","bytes","offset","chunk","createDesktopRpcTransport","signal","init","method","result","waitForAuthOperation"],"sources":["../../../src/modules/desktop/rpc.ts"],"sourcesContent":["import { waitForAuthOperation } from \"@/modules/auth/client/retry\";\nimport type { DesktopRpcPolicy, DesktopRpcResponse } from \"@/modules/desktop/interface\";\nimport { formatRpcFailure } from \"@/utils/formatter\";\nimport type {\n DesktopRpcHandlerOptions,\n DesktopRpcTransportOptions,\n} from \"@/utils/interface\";\nimport { z } from \"zod\";\n\nexport function resolveDesktopRpcPolicy(options: DesktopRpcPolicy = {}) {\n const origin = options.origin ?? \"https://desktop.invalid\";\n const endpoint = options.endpoint ?? \"/trpc\";\n const maxUrlLength = options.maxUrlLength ?? 2_000_000;\n const maxBodyBytes = options.maxBodyBytes ?? 8_000_000;\n const maxResponseBytes = options.maxResponseBytes ?? 8_000_000;\n const url = new URL(origin);\n if (\n url.origin !== origin ||\n url.protocol !== \"https:\" ||\n !/^\\/[a-zA-Z][a-zA-Z0-9/-]*$/.test(endpoint) ||\n endpoint.endsWith(\"/\") ||\n ![maxUrlLength, maxBodyBytes, maxResponseBytes].every(\n (value) => Number.isSafeInteger(value) && value > 0 && value <= 16_000_000,\n )\n )\n throw new TypeError(\"Invalid desktop RPC policy\");\n return { origin, endpoint, maxUrlLength, maxBodyBytes, maxResponseBytes };\n}\nfunction requestSchema(policy: ReturnType<typeof resolveDesktopRpcPolicy>) {\n return z\n .object({\n url: z\n .string()\n .max(policy.maxUrlLength)\n .refine((value) => {\n try {\n const url = new URL(value);\n const path = url.pathname.slice(policy.endpoint.length + 1);\n return (\n url.origin === policy.origin &&\n url.pathname.startsWith(policy.endpoint + \"/\") &&\n /^[a-zA-Z][a-zA-Z0-9.]*$/.test(path) &&\n !url.username &&\n !url.password &&\n !url.hash\n );\n } catch {\n return false;\n }\n }),\n method: z.enum([\"GET\", \"POST\"]),\n body: z.string().max(policy.maxBodyBytes).optional(),\n })\n .strict()\n .refine(\n (input) =>\n (input.method !== \"GET\" || input.body === undefined) &&\n (input.body === undefined ||\n new TextEncoder().encode(input.body).length <= policy.maxBodyBytes),\n );\n}\n\n/** Main-process packet validation. Supply tRPC's fetchRequestHandler as handle. */\nexport function createDesktopRpcHandler(options: DesktopRpcHandlerOptions) {\n const policy = resolveDesktopRpcPolicy(options);\n const schema = requestSchema(policy);\n return async function handleRpcRequest(input: unknown): Promise<DesktopRpcResponse> {\n const parsed = schema.safeParse(input);\n if (!parsed.success)\n return formatRpcFailure(\n 400,\n \"Invalid desktop RPC request.\",\n -32600,\n \"BAD_REQUEST\",\n );\n try {\n const response = await options.handle(\n new Request(parsed.data.url, {\n method: parsed.data.method,\n body: parsed.data.body,\n headers: { \"content-type\": \"application/json\" },\n }),\n );\n const body = await boundedResponseText(response, policy.maxResponseBytes);\n if (response.status < 200 || response.status > 599) throw new Error();\n return { status: response.status, body };\n } catch {\n return formatRpcFailure(\n 500,\n \"Desktop RPC unavailable.\",\n -32603,\n \"INTERNAL_SERVER_ERROR\",\n );\n }\n };\n}\nasync function boundedResponseText(response: Response, limit: number) {\n if (!response.body) return \"\";\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const next = await reader.read();\n if (next.done) break;\n size += next.value.byteLength;\n if (size > limit) {\n await reader.cancel();\n throw new Error(\"RPC response too large\");\n }\n chunks.push(next.value);\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return new TextDecoder().decode(bytes);\n}\n\n/** No network request: URL is protocol metadata passed to app-owned trusted IPC. */\nexport function createDesktopRpcTransport(options: DesktopRpcTransportOptions) {\n const policy = resolveDesktopRpcPolicy(options);\n const schema = requestSchema(policy);\n return async function rpcFetch(\n input: string | URL | Request,\n init?: RequestInit,\n ): Promise<Response> {\n const signal =\n init?.signal ?? (input instanceof Request ? input.signal : undefined);\n signal?.throwIfAborted();\n const method = (\n init?.method ?? (input instanceof Request ? input.method : \"GET\")\n ).toUpperCase();\n const body =\n init?.body ??\n (input instanceof Request && method === \"POST\"\n ? await boundedResponseText(new Response(input.body), policy.maxBodyBytes)\n : undefined);\n if (body !== undefined && typeof body !== \"string\")\n throw new TypeError(\"Desktop RPC body must be text\");\n const parsed = schema.parse({\n url: input instanceof Request ? input.url : String(input),\n method,\n ...(body === undefined ? {} : { body }),\n });\n signal?.throwIfAborted();\n const result = await waitForAuthOperation(\n options.request(parsed, signal ?? undefined),\n signal ?? undefined,\n );\n signal?.throwIfAborted();\n if (\n !Number.isInteger(result.status) ||\n result.status < 200 ||\n result.status > 599 ||\n typeof result.body !== \"string\" ||\n new TextEncoder().encode(result.body).length > policy.maxResponseBytes\n )\n throw new TypeError(\"Invalid desktop RPC response\");\n return new Response([204, 205, 304].includes(result.status) ? null : result.body, {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("zod");var t=class extends Error{code;status;constructor(e,t=500){if(!/^[a-z][a-z0-9_]{0,127}$/.test(e)||!Number.isInteger(t)||t<400||t>599)throw TypeError(`Invalid service error contract`);super(e),this.code=e,this.status=t,this.name=`ServiceError`}};function n(n){if(n instanceof t)return{status:n.status,code:n.code};if(n instanceof e.ZodError)return{status:400,code:`validation_error`,details:{issues:n.issues.map(e=>({code:e.code,path:e.path}))}}}exports.ServiceError=t,exports.serviceFailure=n;
@@ -0,0 +1,14 @@
1
+ export interface ServiceFailure {
2
+ status: number;
3
+ code: string;
4
+ headers?: HeadersInit;
5
+ details?: Record<string, unknown>;
6
+ }
7
+ /** Only public codes belong here; never pass provider messages or credentials. */
8
+ export declare class ServiceError extends Error {
9
+ readonly code: string;
10
+ readonly status: number;
11
+ constructor(code: string, status?: number);
12
+ }
13
+ export declare function serviceFailure(error: unknown): ServiceFailure | undefined;
14
+ //# sourceMappingURL=failure.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.d.cts","names":[],"sources":["../../../src/modules/http/failure.ts"],"mappings":"A,iBAEiB;EACf;EACA;EACA,UAAU;EACV,UAAU;;;qBAIC,qBAAqB;WAEd;WACA;EADA,YAAA,cACA;;wBAcJ,eAAe,iBAAiB"}
@@ -0,0 +1,14 @@
1
+ export interface ServiceFailure {
2
+ status: number;
3
+ code: string;
4
+ headers?: HeadersInit;
5
+ details?: Record<string, unknown>;
6
+ }
7
+ /** Only public codes belong here; never pass provider messages or credentials. */
8
+ export declare class ServiceError extends Error {
9
+ readonly code: string;
10
+ readonly status: number;
11
+ constructor(code: string, status?: number);
12
+ }
13
+ export declare function serviceFailure(error: unknown): ServiceFailure | undefined;
14
+ //# sourceMappingURL=failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.d.ts","names":[],"sources":["../../../src/modules/http/failure.ts"],"mappings":"A,iBAEiB;EACf;EACA;EACA,UAAU;EACV,UAAU;;;qBAIC,qBAAqB;WAEd;WACA;EADA,YAAA,cACA;;wBAcJ,eAAe,iBAAiB"}
@@ -0,0 +1,2 @@
1
+ import{ZodError as e}from"zod";var t=class extends Error{code;status;constructor(e,t=500){if(!/^[a-z][a-z0-9_]{0,127}$/.test(e)||!Number.isInteger(t)||t<400||t>599)throw TypeError(`Invalid service error contract`);super(e),this.code=e,this.status=t,this.name=`ServiceError`}};function n(n){if(n instanceof t)return{status:n.status,code:n.code};if(n instanceof e)return{status:400,code:`validation_error`,details:{issues:n.issues.map(e=>({code:e.code,path:e.path}))}}}export{t as ServiceError,n as serviceFailure};
2
+ //# sourceMappingURL=failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.js","names":["ServiceError","code","status","serviceFailure","error","ZodError","issue"],"sources":["../../../src/modules/http/failure.ts"],"sourcesContent":["import { ZodError } from \"zod\";\n\nexport interface ServiceFailure {\n status: number;\n code: string;\n headers?: HeadersInit;\n details?: Record<string, unknown>;\n}\n\n/** Only public codes belong here; never pass provider messages or credentials. */\nexport class ServiceError extends Error {\n constructor(\n public readonly code: string,\n public readonly status = 500,\n ) {\n if (\n !/^[a-z][a-z0-9_]{0,127}$/.test(code) ||\n !Number.isInteger(status) ||\n status < 400 ||\n status > 599\n )\n throw new TypeError(\"Invalid service error contract\");\n super(code);\n this.name = \"ServiceError\";\n }\n}\n\nexport function serviceFailure(error: unknown): ServiceFailure | undefined {\n if (error instanceof ServiceError) return { status: error.status, code: error.code };\n if (error instanceof ZodError)\n return {\n status: 400,\n code: \"validation_error\",\n details: {\n // Do not return custom messages, inputs or schema internals by default.\n issues: error.issues.map((issue) => ({ code: issue.code, path: issue.path })),\n },\n };\n}\n"],"mappings":"A,+BAUA,IAAaA,EAAb,cAAkC,KAAM,CAEpB,KACA,OAFlB,YACE,EACA,EAAyB,IACzB,CACA,GACE,CAAC,0BAA0B,KAAKC,CAAI,GACpC,CAAC,OAAO,UAAUC,CAAM,GACxBA,EAAS,KACTA,EAAS,IAET,MAAU,UAAU,gCAAgC,EACtD,MAAMD,CAAI,EAVM,KAAA,KAAAA,EACA,KAAA,OAAAC,EAUhB,KAAK,KAAO,cACd,CACF,EAEA,SAAgBC,EAAe,EAA4C,CACzE,GAAIC,aAAiBJ,EAAc,MAAO,CAAE,OAAQI,EAAM,OAAQ,KAAMA,EAAM,IAAK,EACnF,GAAIA,aAAiBC,EACnB,MAAO,CACL,OAAQ,IACR,KAAM,mBACN,QAAS,CAEP,OAAQD,EAAM,OAAO,IAAK,IAAW,CAAE,KAAME,EAAM,KAAM,KAAMA,EAAM,IAAK,EAAE,CAC9E,CACF,CACJ,C"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./caller.cjs"),t=require("./error.cjs"),n=require("./fetcher.cjs"),r=require("./response.cjs");exports.CallerError=t.CallerError,exports.createCaller=e.createCaller,exports.createFetcher=n.createFetcher,exports.normalizeCallerError=t.normalizeCallerError,exports.toWebResponse=r.toWebResponse;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./caller.cjs"),t=require("./error.cjs"),n=require("./fetcher.cjs"),r=require("./response.cjs"),i=require("./failure.cjs");exports.CallerError=t.CallerError,exports.ServiceError=i.ServiceError,exports.createCaller=e.createCaller,exports.createFetcher=n.createFetcher,exports.normalizeCallerError=t.normalizeCallerError,exports.serviceFailure=i.serviceFailure,exports.toWebResponse=r.toWebResponse;
@@ -2,4 +2,5 @@ import { createCaller } from "./caller.cjs";
2
2
  import { E as FetcherOptions, G as CallerError, K as normalizeCallerError, W as WebResponseOptions, _ as CallerToastOptions, f as CallerErrorOptions, g as CallerResponseHandler, h as CallerRequestOptions, m as CallerOptions } from "../../interface-BR9QNgXO.cjs";
3
3
  import { createFetcher } from "./fetcher.cjs";
4
4
  import { toWebResponse } from "./response.cjs";
5
- export { CallerError, type CallerErrorOptions, type CallerOptions, type CallerRequestOptions, type CallerResponseHandler, type CallerToastOptions, type FetcherOptions, type WebResponseOptions, createCaller, createFetcher, normalizeCallerError, toWebResponse };
5
+ import { ServiceError, ServiceFailure, serviceFailure } from "./failure.cjs";
6
+ export { CallerError, type CallerErrorOptions, type CallerOptions, type CallerRequestOptions, type CallerResponseHandler, type CallerToastOptions, type FetcherOptions, ServiceError, type ServiceFailure, type WebResponseOptions, createCaller, createFetcher, normalizeCallerError, serviceFailure, toWebResponse };
@@ -2,4 +2,5 @@ import { createCaller } from "./caller.js";
2
2
  import { E as FetcherOptions, G as CallerError, K as normalizeCallerError, W as WebResponseOptions, _ as CallerToastOptions, f as CallerErrorOptions, g as CallerResponseHandler, h as CallerRequestOptions, m as CallerOptions } from "../../interface-ii8DV63k.js";
3
3
  import { createFetcher } from "./fetcher.js";
4
4
  import { toWebResponse } from "./response.js";
5
- export { CallerError, type CallerErrorOptions, type CallerOptions, type CallerRequestOptions, type CallerResponseHandler, type CallerToastOptions, type FetcherOptions, type WebResponseOptions, createCaller, createFetcher, normalizeCallerError, toWebResponse };
5
+ import { ServiceError, ServiceFailure, serviceFailure } from "./failure.js";
6
+ export { CallerError, type CallerErrorOptions, type CallerOptions, type CallerRequestOptions, type CallerResponseHandler, type CallerToastOptions, type FetcherOptions, ServiceError, type ServiceFailure, type WebResponseOptions, createCaller, createFetcher, normalizeCallerError, serviceFailure, toWebResponse };
@@ -1 +1 @@
1
- import{createCaller as e}from"./caller.js";import{CallerError as t,normalizeCallerError as n}from"./error.js";import{createFetcher as r}from"./fetcher.js";import{toWebResponse as i}from"./response.js";export{t as CallerError,e as createCaller,r as createFetcher,n as normalizeCallerError,i as toWebResponse};
1
+ import{createCaller as e}from"./caller.js";import{CallerError as t,normalizeCallerError as n}from"./error.js";import{createFetcher as r}from"./fetcher.js";import{toWebResponse as i}from"./response.js";import{ServiceError as a,serviceFailure as o}from"./failure.js";export{t as CallerError,a as ServiceError,e as createCaller,r as createFetcher,n as normalizeCallerError,o as serviceFailure,i as toWebResponse};
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t={}){try{if(typeof e!=`string`||e!==e.trim())throw Error();let n=new URL(e);if(n.username||n.password||n.hash||!t.allowQuery&&n.search||t.originOnly&&n.pathname!==`/`||n.protocol!==`https:`&&!(t.allowLoopbackHttp&&n.protocol===`http:`&&[`localhost`,`127.0.0.1`,`[::1]`].includes(n.hostname)))throw Error();return n}catch{throw TypeError(`Invalid HTTP endpoint`)}}function t(e){let t=typeof e==`string`&&/^\d+$/.test(e)?Number(e):e;if(typeof t!=`number`||!Number.isSafeInteger(t)||t<0)throw TypeError(`Invalid byte count`);return t}function n(e){let t=e instanceof Date?e.getTime():typeof e==`string`?Date.parse(e):e;if(!Number.isSafeInteger(t)||t<0)throw TypeError(`Invalid timestamp`);return t}exports.parseByteCount=t,exports.parseEpochMilliseconds=n,exports.parseHttpEndpoint=e;
@@ -0,0 +1,10 @@
1
+ export interface HttpEndpointOptions {
2
+ allowLoopbackHttp?: boolean;
3
+ allowQuery?: boolean;
4
+ originOnly?: boolean;
5
+ }
6
+ /** Syntax/transport validation only; callers still own destination allowlists. */
7
+ export declare function parseHttpEndpoint(value: string, options?: HttpEndpointOptions): URL;
8
+ export declare function parseByteCount(value: unknown): number;
9
+ export declare function parseEpochMilliseconds(value: Date | string | number): number;
10
+ //# sourceMappingURL=normalization.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalization.d.cts","names":[],"sources":["../../src/utils/normalization.ts"],"mappings":"A,iBAAiB;EACf;EACA;EACA;;;wBAIc,kBACd,eACA,UAAS,sBACR;wBAwBa,eAAe;wBAQf,uBAAuB,OAAO"}