@fhevm/sdk 1.1.0-alpha.2 → 1.1.0-alpha.4

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 (86) hide show
  1. package/_cjs/core/_version.js +1 -1
  2. package/_cjs/core/base/auth.js +8 -6
  3. package/_cjs/core/base/auth.js.map +1 -1
  4. package/_cjs/core/base/errors/InvalidUrlError.js +17 -0
  5. package/_cjs/core/base/errors/InvalidUrlError.js.map +1 -0
  6. package/_cjs/core/base/fetch.js +37 -0
  7. package/_cjs/core/base/fetch.js.map +1 -1
  8. package/_cjs/core/base/string.js +10 -0
  9. package/_cjs/core/base/string.js.map +1 -1
  10. package/_cjs/core/modules/decrypt/module/api-p.js +1 -2
  11. package/_cjs/core/modules/decrypt/module/api-p.js.map +1 -1
  12. package/_cjs/core/modules/relayer/module/RelayerAsyncRequest.js +16 -7
  13. package/_cjs/core/modules/relayer/module/RelayerAsyncRequest.js.map +1 -1
  14. package/_cjs/core/modules/relayer/module/fetchCoprocessorSignatures.js +5 -2
  15. package/_cjs/core/modules/relayer/module/fetchCoprocessorSignatures.js.map +1 -1
  16. package/_cjs/core/modules/relayer/module/fetchDelegatedUserDecrypt.js +5 -1
  17. package/_cjs/core/modules/relayer/module/fetchDelegatedUserDecrypt.js.map +1 -1
  18. package/_cjs/core/modules/relayer/module/fetchFheEncryptionKeySource.js +10 -5
  19. package/_cjs/core/modules/relayer/module/fetchFheEncryptionKeySource.js.map +1 -1
  20. package/_cjs/core/modules/relayer/module/fetchPublicDecrypt.js +5 -1
  21. package/_cjs/core/modules/relayer/module/fetchPublicDecrypt.js.map +1 -1
  22. package/_cjs/core/modules/relayer/module/fetchUserDecrypt.js +5 -1
  23. package/_cjs/core/modules/relayer/module/fetchUserDecrypt.js.map +1 -1
  24. package/_cjs/core/modules/relayer/module/relayerUrl.js +33 -27
  25. package/_cjs/core/modules/relayer/module/relayerUrl.js.map +1 -1
  26. package/_cjs/wasm/tfhe/loadTfheLib.js.map +1 -1
  27. package/_cjs/wasm/tkms/loadKmsLib.js.map +1 -1
  28. package/_esm/core/_version.js +1 -1
  29. package/_esm/core/base/auth.js +8 -6
  30. package/_esm/core/base/auth.js.map +1 -1
  31. package/_esm/core/base/errors/InvalidUrlError.js +13 -0
  32. package/_esm/core/base/errors/InvalidUrlError.js.map +1 -0
  33. package/_esm/core/base/fetch.js +96 -0
  34. package/_esm/core/base/fetch.js.map +1 -1
  35. package/_esm/core/base/string.js +9 -0
  36. package/_esm/core/base/string.js.map +1 -1
  37. package/_esm/core/modules/decrypt/module/api-p.js +18 -2
  38. package/_esm/core/modules/decrypt/module/api-p.js.map +1 -1
  39. package/_esm/core/modules/relayer/module/RelayerAsyncRequest.js +17 -13
  40. package/_esm/core/modules/relayer/module/RelayerAsyncRequest.js.map +1 -1
  41. package/_esm/core/modules/relayer/module/fetchCoprocessorSignatures.js +5 -2
  42. package/_esm/core/modules/relayer/module/fetchCoprocessorSignatures.js.map +1 -1
  43. package/_esm/core/modules/relayer/module/fetchDelegatedUserDecrypt.js +6 -2
  44. package/_esm/core/modules/relayer/module/fetchDelegatedUserDecrypt.js.map +1 -1
  45. package/_esm/core/modules/relayer/module/fetchFheEncryptionKeySource.js +12 -7
  46. package/_esm/core/modules/relayer/module/fetchFheEncryptionKeySource.js.map +1 -1
  47. package/_esm/core/modules/relayer/module/fetchPublicDecrypt.js +6 -2
  48. package/_esm/core/modules/relayer/module/fetchPublicDecrypt.js.map +1 -1
  49. package/_esm/core/modules/relayer/module/fetchUserDecrypt.js +6 -2
  50. package/_esm/core/modules/relayer/module/fetchUserDecrypt.js.map +1 -1
  51. package/_esm/core/modules/relayer/module/relayerUrl.js +55 -27
  52. package/_esm/core/modules/relayer/module/relayerUrl.js.map +1 -1
  53. package/_types/core/base/auth.d.ts.map +1 -1
  54. package/_types/core/base/errors/InvalidUrlError.d.ts +14 -0
  55. package/_types/core/base/errors/InvalidUrlError.d.ts.map +1 -0
  56. package/_types/core/base/fetch.d.ts +57 -0
  57. package/_types/core/base/fetch.d.ts.map +1 -1
  58. package/_types/core/base/string.d.ts +1 -0
  59. package/_types/core/base/string.d.ts.map +1 -1
  60. package/_types/core/modules/decrypt/module/api-p.d.ts.map +1 -1
  61. package/_types/core/modules/relayer/module/RelayerAsyncRequest.d.ts +1 -0
  62. package/_types/core/modules/relayer/module/RelayerAsyncRequest.d.ts.map +1 -1
  63. package/_types/core/modules/relayer/module/fetchCoprocessorSignatures.d.ts.map +1 -1
  64. package/_types/core/modules/relayer/module/fetchDelegatedUserDecrypt.d.ts.map +1 -1
  65. package/_types/core/modules/relayer/module/fetchFheEncryptionKeySource.d.ts.map +1 -1
  66. package/_types/core/modules/relayer/module/fetchPublicDecrypt.d.ts.map +1 -1
  67. package/_types/core/modules/relayer/module/fetchUserDecrypt.d.ts.map +1 -1
  68. package/_types/core/modules/relayer/module/relayerUrl.d.ts +24 -5
  69. package/_types/core/modules/relayer/module/relayerUrl.d.ts.map +1 -1
  70. package/_types/core/types/relayer.d.ts +1 -0
  71. package/_types/core/types/relayer.d.ts.map +1 -1
  72. package/core/_version.ts +1 -1
  73. package/core/base/auth.ts +8 -6
  74. package/core/base/errors/InvalidUrlError.ts +24 -0
  75. package/core/base/fetch.ts +102 -0
  76. package/core/base/string.ts +10 -0
  77. package/core/modules/decrypt/module/api-p.ts +20 -3
  78. package/core/modules/relayer/module/RelayerAsyncRequest.ts +19 -17
  79. package/core/modules/relayer/module/fetchCoprocessorSignatures.ts +6 -2
  80. package/core/modules/relayer/module/fetchDelegatedUserDecrypt.ts +7 -2
  81. package/core/modules/relayer/module/fetchFheEncryptionKeySource.ts +12 -7
  82. package/core/modules/relayer/module/fetchPublicDecrypt.ts +7 -2
  83. package/core/modules/relayer/module/fetchUserDecrypt.ts +7 -2
  84. package/core/modules/relayer/module/relayerUrl.ts +66 -27
  85. package/core/types/relayer.ts +1 -0
  86. package/package.json +1 -1
@@ -1,38 +1,77 @@
1
- import { removeSuffix } from '../../../base/string.js';
1
+ import { assert } from '../../../base/errors/InternalError.js';
2
+ import { InvalidUrlError } from '../../../base/errors/InvalidUrlError.js';
3
+ import { removePrefix, removeSuffix } from '../../../base/string.js';
2
4
 
3
- export const ZamaMainnetRelayerBaseUrl = 'https://relayer.mainnet.zama.org';
4
- export const ZamaMainnetRelayerUrlV2 = `${ZamaMainnetRelayerBaseUrl}/v2`;
5
+ /**
6
+ * Validates and normalizes a relayer URL before it's used to build the request.
7
+ *
8
+ * Validation:
9
+ * - non-empty string
10
+ * - parses as a URL
11
+ * - protocol is `http:` or `https:`
12
+ * - contains no userinfo (`user:pass@host`)
13
+ * - contains no query string or fragment (they would corrupt path concatenation)
14
+ * - if `hasAuth` is true, requires `https:` unless the host is localhost
15
+ *
16
+ * Normalization (via WHATWG `URL`):
17
+ * - scheme and host lower-cased
18
+ * - default ports collapsed (`:443` for https, `:80` for http)
19
+ * - path percent-encoded canonically
20
+ * - bare-origin URLs get a single trailing `/` (`https://x` → `https://x/`)
21
+ *
22
+ * Throws {@link InvalidUrlError} on any failure so the caller surfaces a
23
+ * uniform error type.
24
+ *
25
+ * @returns The normalized URL object.
26
+ */
27
+ export function validateRelayerBaseUrl(relayerUrl: unknown, hasAuth: boolean): URL {
28
+ if (typeof relayerUrl !== 'string' || relayerUrl.length === 0) {
29
+ throw new InvalidUrlError({ message: 'Invalid relayerUrl: must be a non-empty string.' }, {});
30
+ }
5
31
 
6
- export const ZamaSepoliaRelayerBaseUrl = 'https://relayer.testnet.zama.org';
7
- export const ZamaSepoliaRelayerUrlV2 = `${ZamaSepoliaRelayerBaseUrl}/v2`;
32
+ let parsed: URL;
33
+ try {
34
+ parsed = new URL(relayerUrl);
35
+ } catch (cause) {
36
+ throw new InvalidUrlError({ message: `Invalid relayerUrl: cannot parse as URL}.`, cause }, {});
37
+ }
8
38
 
9
- export function parseZamaRelayerUrl(relayerUrl: unknown): string | null {
10
- if (relayerUrl === undefined || relayerUrl === null || typeof relayerUrl !== 'string') {
11
- return null;
39
+ if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
40
+ throw new InvalidUrlError(
41
+ { message: `Invalid relayerUrl protocol: ${parsed.protocol} (expected http: or https:).` },
42
+ {},
43
+ );
12
44
  }
13
45
 
14
- const urlNoSlash = removeSuffix(relayerUrl, '/');
15
- if (!URL.canParse(urlNoSlash)) {
16
- return null;
46
+ if (parsed.username !== '' || parsed.password !== '') {
47
+ throw new InvalidUrlError(
48
+ { message: 'Invalid relayerUrl: URL must not contain credentials (user:pass@host).' },
49
+ {},
50
+ );
17
51
  }
18
52
 
19
- if (urlNoSlash.startsWith(ZamaMainnetRelayerBaseUrl) || urlNoSlash.startsWith(ZamaSepoliaRelayerBaseUrl)) {
20
- const zamaUrls = [
21
- ZamaSepoliaRelayerBaseUrl,
22
- ZamaSepoliaRelayerUrlV2,
23
- ZamaMainnetRelayerBaseUrl,
24
- ZamaMainnetRelayerUrlV2,
25
- ];
26
- const isZamaUrl = zamaUrls.includes(urlNoSlash);
27
- if (isZamaUrl) {
28
- if (urlNoSlash.endsWith('/v2')) {
29
- return urlNoSlash;
30
- }
31
- return `${urlNoSlash}/v2`;
53
+ if (hasAuth && parsed.protocol === 'http:') {
54
+ const isLocalhost =
55
+ parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';
56
+ if (!isLocalhost) {
57
+ throw new InvalidUrlError(
58
+ { message: 'Invalid relayerUrl: HTTPS is required when auth credentials are provided.' },
59
+ {},
60
+ );
32
61
  }
33
- // malformed Zama url
34
- return null;
35
62
  }
36
63
 
37
- return urlNoSlash;
64
+ // At the end of validateRelayerUrl, just before `return parsed;`
65
+ if (!parsed.pathname.endsWith('/')) {
66
+ parsed.pathname += '/';
67
+ }
68
+
69
+ return parsed;
70
+ }
71
+
72
+ export function buildRelayerUrlString(relayerBaseUrl: URL, path: string): string {
73
+ assert(relayerBaseUrl.pathname.endsWith('/'));
74
+ const sanitizedPath = removeSuffix(removePrefix(path, '/'), '/');
75
+ const url = new URL(sanitizedPath, relayerBaseUrl).toString();
76
+ return removeSuffix(url, '/');
38
77
  }
@@ -34,6 +34,7 @@ export type FetchDelegatedUserDecryptResult = readonly FetchUserDecryptResultIte
34
34
 
35
35
  export type RelayerCommonOptions = {
36
36
  auth?: Auth | undefined;
37
+ headers?: Record<string, string>;
37
38
  debug?: boolean | undefined;
38
39
  fetchRetries?: number | undefined;
39
40
  fetchRetryDelayInMilliseconds?: number | undefined;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fhevm/sdk",
3
3
  "description": "TypeScript Interface for FHEVM",
4
- "version": "1.1.0-alpha.2",
4
+ "version": "1.1.0-alpha.4",
5
5
  "type": "module",
6
6
  "main": "./_cjs/index.js",
7
7
  "module": "./_esm/index.js",