@zeke-02/tinfoil 0.0.11 → 0.11.7

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 (105) hide show
  1. package/dist/ai-sdk-provider.browser.d.ts +12 -0
  2. package/dist/ai-sdk-provider.browser.d.ts.map +1 -0
  3. package/dist/{esm/ai-sdk-provider.mjs → ai-sdk-provider.browser.js} +9 -5
  4. package/dist/ai-sdk-provider.browser.js.map +1 -0
  5. package/dist/ai-sdk-provider.d.ts +6 -1
  6. package/dist/ai-sdk-provider.d.ts.map +1 -0
  7. package/dist/ai-sdk-provider.js +12 -11
  8. package/dist/ai-sdk-provider.js.map +1 -0
  9. package/dist/config.d.ts +2 -1
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +3 -5
  12. package/dist/config.js.map +1 -0
  13. package/dist/encrypted-body-fetch.d.ts +8 -2
  14. package/dist/encrypted-body-fetch.d.ts.map +1 -0
  15. package/dist/encrypted-body-fetch.js +27 -26
  16. package/dist/encrypted-body-fetch.js.map +1 -0
  17. package/dist/env.d.ts +1 -0
  18. package/dist/env.d.ts.map +1 -0
  19. package/dist/env.js +2 -4
  20. package/dist/env.js.map +1 -0
  21. package/dist/index.browser.d.ts +8 -7
  22. package/dist/index.browser.d.ts.map +1 -0
  23. package/dist/index.browser.js +8 -28
  24. package/dist/index.browser.js.map +1 -0
  25. package/dist/index.d.ts +9 -8
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +10 -47
  28. package/dist/index.js.map +1 -0
  29. package/dist/pinned-tls-fetch.d.ts +1 -0
  30. package/dist/pinned-tls-fetch.d.ts.map +1 -0
  31. package/dist/pinned-tls-fetch.js +13 -17
  32. package/dist/pinned-tls-fetch.js.map +1 -0
  33. package/dist/router.d.ts +1 -0
  34. package/dist/router.d.ts.map +1 -0
  35. package/dist/router.js +6 -7
  36. package/dist/router.js.map +1 -0
  37. package/dist/{esm/secure-client.d.ts → secure-client.browser.d.ts} +2 -1
  38. package/dist/secure-client.browser.d.ts.map +1 -0
  39. package/dist/{esm/secure-client.mjs → secure-client.browser.js} +46 -56
  40. package/dist/secure-client.browser.js.map +1 -0
  41. package/dist/secure-client.d.ts +2 -1
  42. package/dist/secure-client.d.ts.map +1 -0
  43. package/dist/secure-client.js +51 -65
  44. package/dist/secure-client.js.map +1 -0
  45. package/dist/secure-fetch.browser.d.ts +1 -0
  46. package/dist/secure-fetch.browser.d.ts.map +1 -0
  47. package/dist/secure-fetch.browser.js +4 -6
  48. package/dist/secure-fetch.browser.js.map +1 -0
  49. package/dist/secure-fetch.d.ts +1 -0
  50. package/dist/secure-fetch.d.ts.map +1 -0
  51. package/dist/secure-fetch.js +16 -8
  52. package/dist/secure-fetch.js.map +1 -0
  53. package/dist/{tinfoilai.d.ts → tinfoil-ai.browser.d.ts} +5 -2
  54. package/dist/tinfoil-ai.browser.d.ts.map +1 -0
  55. package/dist/{tinfoilai.js → tinfoil-ai.browser.js} +50 -39
  56. package/dist/tinfoil-ai.browser.js.map +1 -0
  57. package/dist/{esm/tinfoilai.d.ts → tinfoil-ai.d.ts} +5 -2
  58. package/dist/tinfoil-ai.d.ts.map +1 -0
  59. package/dist/{esm/tinfoilai.mjs → tinfoil-ai.js} +29 -11
  60. package/dist/tinfoil-ai.js.map +1 -0
  61. package/dist/unverified-client.d.ts +1 -2
  62. package/dist/unverified-client.d.ts.map +1 -0
  63. package/dist/unverified-client.js +10 -13
  64. package/dist/unverified-client.js.map +1 -0
  65. package/dist/verifier.d.ts +2 -141
  66. package/dist/verifier.d.ts.map +1 -0
  67. package/dist/verifier.js +2 -570
  68. package/dist/verifier.js.map +1 -0
  69. package/package.json +48 -41
  70. package/LICENSE +0 -661
  71. package/README.md +0 -183
  72. package/dist/__tests__/test-utils.d.ts +0 -1
  73. package/dist/__tests__/test-utils.js +0 -44
  74. package/dist/esm/__tests__/test-utils.d.ts +0 -1
  75. package/dist/esm/__tests__/test-utils.mjs +0 -38
  76. package/dist/esm/ai-sdk-provider.d.ts +0 -7
  77. package/dist/esm/config.d.ts +0 -13
  78. package/dist/esm/config.mjs +0 -13
  79. package/dist/esm/encrypted-body-fetch.d.ts +0 -13
  80. package/dist/esm/encrypted-body-fetch.mjs +0 -105
  81. package/dist/esm/env.d.ts +0 -5
  82. package/dist/esm/env.mjs +0 -17
  83. package/dist/esm/fetch-adapter.d.ts +0 -21
  84. package/dist/esm/fetch-adapter.mjs +0 -23
  85. package/dist/esm/index.browser.d.ts +0 -7
  86. package/dist/esm/index.browser.mjs +0 -8
  87. package/dist/esm/index.d.ts +0 -9
  88. package/dist/esm/index.mjs +0 -13
  89. package/dist/esm/pinned-tls-fetch.d.ts +0 -1
  90. package/dist/esm/pinned-tls-fetch.mjs +0 -110
  91. package/dist/esm/router.d.ts +0 -11
  92. package/dist/esm/router.mjs +0 -33
  93. package/dist/esm/secure-fetch.browser.d.ts +0 -1
  94. package/dist/esm/secure-fetch.browser.mjs +0 -10
  95. package/dist/esm/secure-fetch.d.ts +0 -1
  96. package/dist/esm/secure-fetch.mjs +0 -12
  97. package/dist/esm/unverified-client.d.ts +0 -18
  98. package/dist/esm/unverified-client.mjs +0 -61
  99. package/dist/esm/verifier.d.ts +0 -141
  100. package/dist/esm/verifier.mjs +0 -532
  101. package/dist/esm/wasm-exec.js +0 -668
  102. package/dist/esm/wasm-exec.mjs +0 -668
  103. package/dist/fetch-adapter.d.ts +0 -21
  104. package/dist/fetch-adapter.js +0 -27
  105. package/dist/wasm-exec.js +0 -668
@@ -0,0 +1,12 @@
1
+ import { SecureClient } from "./secure-client.browser.js";
2
+ interface CreateTinfoilAIOptions {
3
+ baseURL?: string;
4
+ enclaveURL?: string;
5
+ configRepo?: string;
6
+ }
7
+ export declare function createTinfoilAI(apiKey: string, options?: CreateTinfoilAIOptions): Promise<{
8
+ provider: import("@ai-sdk/openai-compatible").OpenAICompatibleProvider<string, string, string, string>;
9
+ secureClient: SecureClient;
10
+ }>;
11
+ export {};
12
+ //# sourceMappingURL=ai-sdk-provider.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-provider.browser.d.ts","sourceRoot":"","sources":["../src/ai-sdk-provider.browser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,UAAU,sBAAsB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;;;GA8BzF"}
@@ -1,7 +1,7 @@
1
1
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
2
- import { TINFOIL_CONFIG } from "./config.mjs";
3
- import { SecureClient } from "./secure-client.mjs";
4
- export async function createTinfoilAI(apiKey, options = {}, headers = {}) {
2
+ import { TINFOIL_CONFIG } from "./config.js";
3
+ import { SecureClient } from "./secure-client.browser.js";
4
+ export async function createTinfoilAI(apiKey, options = {}) {
5
5
  const baseURL = options.baseURL;
6
6
  const enclaveURL = options.enclaveURL;
7
7
  const configRepo = options.configRepo || TINFOIL_CONFIG.INFERENCE_PROXY_REPO;
@@ -16,11 +16,15 @@ export async function createTinfoilAI(apiKey, options = {}, headers = {}) {
16
16
  if (!finalBaseURL) {
17
17
  throw new Error("Unable to determine baseURL for AI SDK provider");
18
18
  }
19
- return createOpenAICompatible({
19
+ const provider = createOpenAICompatible({
20
20
  name: "tinfoil",
21
21
  baseURL: finalBaseURL,
22
22
  apiKey: apiKey,
23
23
  fetch: secureClient.fetch,
24
- headers,
25
24
  });
25
+ return {
26
+ provider,
27
+ secureClient,
28
+ };
26
29
  }
30
+ //# sourceMappingURL=ai-sdk-provider.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-provider.browser.js","sourceRoot":"","sources":["../src/ai-sdk-provider.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ1D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,UAAkC,EAAE;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC,oBAAoB,CAAC;IAE7E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;QACpC,OAAO;QACP,UAAU;QACV,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAE3B,yDAAyD;IACzD,MAAM,YAAY,GAAG,OAAO,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;IAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACtC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,YAAY,CAAC,KAAK;KAC1B,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -1,7 +1,12 @@
1
+ import { SecureClient } from "./secure-client.js";
1
2
  interface CreateTinfoilAIOptions {
2
3
  baseURL?: string;
3
4
  enclaveURL?: string;
4
5
  configRepo?: string;
5
6
  }
6
- export declare function createTinfoilAI(apiKey: string, options?: CreateTinfoilAIOptions, headers?: Record<string, string>): Promise<import("@ai-sdk/openai-compatible").OpenAICompatibleProvider<string, string, string, string>>;
7
+ export declare function createTinfoilAI(apiKey: string, options?: CreateTinfoilAIOptions): Promise<{
8
+ provider: import("@ai-sdk/openai-compatible").OpenAICompatibleProvider<string, string, string, string>;
9
+ secureClient: SecureClient;
10
+ }>;
7
11
  export {};
12
+ //# sourceMappingURL=ai-sdk-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-provider.d.ts","sourceRoot":"","sources":["../src/ai-sdk-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,UAAU,sBAAsB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;;;GA8BzF"}
@@ -1,14 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createTinfoilAI = createTinfoilAI;
4
- const openai_compatible_1 = require("@ai-sdk/openai-compatible");
5
- const config_1 = require("./config");
6
- const secure_client_1 = require("./secure-client");
7
- async function createTinfoilAI(apiKey, options = {}, headers = {}) {
1
+ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
2
+ import { TINFOIL_CONFIG } from "./config.js";
3
+ import { SecureClient } from "./secure-client.js";
4
+ export async function createTinfoilAI(apiKey, options = {}) {
8
5
  const baseURL = options.baseURL;
9
6
  const enclaveURL = options.enclaveURL;
10
- const configRepo = options.configRepo || config_1.TINFOIL_CONFIG.INFERENCE_PROXY_REPO;
11
- const secureClient = new secure_client_1.SecureClient({
7
+ const configRepo = options.configRepo || TINFOIL_CONFIG.INFERENCE_PROXY_REPO;
8
+ const secureClient = new SecureClient({
12
9
  baseURL,
13
10
  enclaveURL,
14
11
  configRepo,
@@ -19,11 +16,15 @@ async function createTinfoilAI(apiKey, options = {}, headers = {}) {
19
16
  if (!finalBaseURL) {
20
17
  throw new Error("Unable to determine baseURL for AI SDK provider");
21
18
  }
22
- return (0, openai_compatible_1.createOpenAICompatible)({
19
+ const provider = createOpenAICompatible({
23
20
  name: "tinfoil",
24
21
  baseURL: finalBaseURL,
25
22
  apiKey: apiKey,
26
23
  fetch: secureClient.fetch,
27
- headers,
28
24
  });
25
+ return {
26
+ provider,
27
+ secureClient,
28
+ };
29
29
  }
30
+ //# sourceMappingURL=ai-sdk-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-provider.js","sourceRoot":"","sources":["../src/ai-sdk-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,UAAkC,EAAE;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC,oBAAoB,CAAC;IAE7E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;QACpC,OAAO;QACP,UAAU;QACV,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAE3B,yDAAyD;IACzD,MAAM,YAAY,GAAG,OAAO,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;IAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACtC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,YAAY,CAAC,KAAK;KAC1B,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,YAAY;KACb,CAAC;AACJ,CAAC"}
package/dist/config.d.ts CHANGED
@@ -9,5 +9,6 @@ export declare const TINFOIL_CONFIG: {
9
9
  /**
10
10
  * The ATC (Attestation and Trust Center) API URL for fetching available routers
11
11
  */
12
- readonly ATC_API_URL: "https://atc.tinfoil.sh/routers";
12
+ readonly ATC_API_URL: "https://atc.tinfoil.sh/routers?platform=snp";
13
13
  };
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;;IAGH;;OAEG;;CAEK,CAAC"}
package/dist/config.js CHANGED
@@ -1,10 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TINFOIL_CONFIG = void 0;
4
1
  /**
5
2
  * Configuration constants for the Tinfoil Node SDK
6
3
  */
7
- exports.TINFOIL_CONFIG = {
4
+ export const TINFOIL_CONFIG = {
8
5
  /**
9
6
  * The GitHub repository for code attestation verification
10
7
  */
@@ -12,5 +9,6 @@ exports.TINFOIL_CONFIG = {
12
9
  /**
13
10
  * The ATC (Attestation and Trust Center) API URL for fetching available routers
14
11
  */
15
- ATC_API_URL: "https://atc.tinfoil.sh/routers",
12
+ ATC_API_URL: "https://atc.tinfoil.sh/routers?platform=snp",
16
13
  };
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B;;OAEG;IACH,oBAAoB,EAAE,qCAAqC;IAE3D;;OAEG;IACH,WAAW,EAAE,6CAA6C;CAClD,CAAC"}
@@ -1,5 +1,10 @@
1
- import type { Transport as EhbpTransport } from "@zeke-02/ehbp";
2
- export declare function getHPKEKey(enclaveURL: string): Promise<CryptoKey>;
1
+ import type { Transport as EhbpTransport } from "ehbp";
2
+ import { Identity } from "ehbp";
3
+ /**
4
+ * Fetch and parse server identity from the HPKE keys endpoint.
5
+ * Returns the server Identity which can be used to create a Transport.
6
+ */
7
+ export declare function getServerIdentity(enclaveURL: string): Promise<Identity>;
3
8
  export declare function normalizeEncryptedBodyRequestArgs(input: RequestInfo | URL, init?: RequestInit): {
4
9
  url: string;
5
10
  init?: RequestInit;
@@ -11,3 +16,4 @@ type FetchWithResponse = typeof fetch & {
11
16
  export declare function createEncryptedBodyFetch(baseURL: string, hpkePublicKey?: string, enclaveURL?: string): FetchWithResponse;
12
17
  export declare function getTransportForOrigin(origin: string, keyOrigin: string): Promise<EhbpTransport>;
13
18
  export {};
19
+ //# sourceMappingURL=encrypted-body-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypted-body-fetch.d.ts","sourceRoot":"","sources":["../src/encrypted-body-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAuB,MAAM,MAAM,CAAC;AAGrD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsB7E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,GACjB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAAE,CAuBrC;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,aAAa,CAAC,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,WAAW,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,aAAa,GAChC,OAAO,CAAC,QAAQ,CAAC,CA2BnB;AAGD,KAAK,iBAAiB,GAAG,OAAO,KAAK,GAAG;IAAE,QAAQ,EAAE,OAAO,QAAQ,CAAA;CAAE,CAAC;AAItE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,EACtB,UAAU,CAAC,EAAE,MAAM,GAClB,iBAAiB,CA4CnB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAiBxB"}
@@ -1,33 +1,26 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getHPKEKey = getHPKEKey;
4
- exports.normalizeEncryptedBodyRequestArgs = normalizeEncryptedBodyRequestArgs;
5
- exports.encryptedBodyRequest = encryptedBodyRequest;
6
- exports.createEncryptedBodyFetch = createEncryptedBodyFetch;
7
- exports.getTransportForOrigin = getTransportForOrigin;
8
- const ehbp_1 = require("@zeke-02/ehbp");
9
- const fetch_adapter_1 = require("./fetch-adapter");
10
- // Public API
11
- async function getHPKEKey(enclaveURL) {
12
- const url = new URL(enclaveURL);
13
- const keysURL = new URL(ehbp_1.PROTOCOL.KEYS_PATH, enclaveURL);
1
+ import { Identity, Transport, PROTOCOL } from "ehbp";
2
+ import { fetch as tauriFetch } from "@tauri-apps/plugin-http";
3
+ /**
4
+ * Fetch and parse server identity from the HPKE keys endpoint.
5
+ * Returns the server Identity which can be used to create a Transport.
6
+ */
7
+ export async function getServerIdentity(enclaveURL) {
8
+ const keysURL = new URL(PROTOCOL.KEYS_PATH, enclaveURL);
14
9
  if (keysURL.protocol !== "https:") {
15
10
  throw new Error(`HTTPS is required for remote key retrieval. Invalid protocol: ${keysURL.protocol}`);
16
11
  }
17
- const fetchFn = (0, fetch_adapter_1.getFetch)();
18
- const response = await fetchFn(keysURL.toString());
12
+ const response = await tauriFetch(keysURL.toString());
19
13
  if (!response.ok) {
20
14
  throw new Error(`Failed to get server public key: ${response.status}`);
21
15
  }
22
16
  const contentType = response.headers.get("content-type");
23
- if (contentType !== ehbp_1.PROTOCOL.KEYS_MEDIA_TYPE) {
17
+ if (contentType !== PROTOCOL.KEYS_MEDIA_TYPE) {
24
18
  throw new Error(`Invalid content type: ${contentType}`);
25
19
  }
26
20
  const keysData = new Uint8Array(await response.arrayBuffer());
27
- const serverIdentity = await ehbp_1.Identity.unmarshalPublicConfig(keysData);
28
- return serverIdentity.getPublicKey();
21
+ return await Identity.unmarshalPublicConfig(keysData);
29
22
  }
30
- function normalizeEncryptedBodyRequestArgs(input, init) {
23
+ export function normalizeEncryptedBodyRequestArgs(input, init) {
31
24
  if (typeof input === "string") {
32
25
  return { url: input, init };
33
26
  }
@@ -47,7 +40,7 @@ function normalizeEncryptedBodyRequestArgs(input, init) {
47
40
  init: { ...derivedInit, ...init },
48
41
  };
49
42
  }
50
- async function encryptedBodyRequest(input, hpkePublicKey, init, enclaveURL, transportInstance) {
43
+ export async function encryptedBodyRequest(input, hpkePublicKey, init, enclaveURL, transportInstance) {
51
44
  const { url: requestUrl, init: requestInit } = normalizeEncryptedBodyRequestArgs(input, init);
52
45
  let actualTransport;
53
46
  if (transportInstance) {
@@ -69,7 +62,8 @@ async function encryptedBodyRequest(input, hpkePublicKey, init, enclaveURL, tran
69
62
  }
70
63
  return actualTransport.request(requestUrl, requestInit);
71
64
  }
72
- function createEncryptedBodyFetch(baseURL, hpkePublicKey, enclaveURL) {
65
+ const ENCLAVE_URL_HEADER = "X-Tinfoil-Enclave-Url";
66
+ export function createEncryptedBodyFetch(baseURL, hpkePublicKey, enclaveURL) {
73
67
  // Create a dedicated transport instance for this fetch function
74
68
  let transportPromise = null;
75
69
  const getOrCreateTransport = async () => {
@@ -85,16 +79,23 @@ function createEncryptedBodyFetch(baseURL, hpkePublicKey, enclaveURL) {
85
79
  const secureFetch = (async (input, init) => {
86
80
  const normalized = normalizeEncryptedBodyRequestArgs(input, init);
87
81
  const targetUrl = new URL(normalized.url, baseURL);
82
+ // Add the enclave URL header so proxies know where to forward requests
83
+ // Only set if enclaveURL differs from baseURL (avoids CORS issues when hitting enclave directly)
84
+ const headers = new Headers(normalized.init?.headers);
85
+ if (enclaveURL && new URL(enclaveURL).origin !== new URL(baseURL).origin) {
86
+ headers.set(ENCLAVE_URL_HEADER, enclaveURL);
87
+ }
88
+ const initWithEnclaveHeader = { ...normalized.init, headers };
88
89
  // Get the dedicated transport instance for this fetch function
89
90
  const transportInstance = await getOrCreateTransport();
90
- return encryptedBodyRequest(targetUrl.toString(), hpkePublicKey, normalized.init, enclaveURL, transportInstance);
91
+ return encryptedBodyRequest(targetUrl.toString(), hpkePublicKey, initWithEnclaveHeader, enclaveURL, transportInstance);
91
92
  });
92
93
  // Expose Response constructor for OpenAI SDK's FormData support detection
93
94
  // This prevents the SDK from making a test request to 'data:,' which would fail through EHBP
94
95
  secureFetch.Response = Response;
95
96
  return secureFetch;
96
97
  }
97
- async function getTransportForOrigin(origin, keyOrigin) {
98
+ export async function getTransportForOrigin(origin, keyOrigin) {
98
99
  if (typeof globalThis !== "undefined") {
99
100
  const isSecure = globalThis.isSecureContext !== false;
100
101
  const hasSubtle = !!(globalThis.crypto && globalThis.crypto.subtle);
@@ -105,8 +106,8 @@ async function getTransportForOrigin(origin, keyOrigin) {
105
106
  throw new Error(`EHBP requires a secure browser context: ${reason}`);
106
107
  }
107
108
  }
108
- const clientIdentity = await ehbp_1.Identity.generate();
109
- const serverPublicKey = await getHPKEKey(keyOrigin);
109
+ const serverIdentity = await getServerIdentity(keyOrigin);
110
110
  const requestHost = new URL(origin).host;
111
- return new ehbp_1.Transport(clientIdentity, requestHost, serverPublicKey);
111
+ return new Transport(serverIdentity, requestHost);
112
112
  }
113
+ //# sourceMappingURL=encrypted-body-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypted-body-fetch.js","sourceRoot":"","sources":["../src/encrypted-body-fetch.ts"],"names":[],"mappings":"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"}
package/dist/env.d.ts CHANGED
@@ -3,3 +3,4 @@
3
3
  * Returns false for Node.js environments, even with WASM loaded.
4
4
  */
5
5
  export declare function isRealBrowser(): boolean;
6
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAgBvC"}
package/dist/env.js CHANGED
@@ -1,11 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRealBrowser = isRealBrowser;
4
1
  /**
5
2
  * Detects if the code is running in a real browser environment.
6
3
  * Returns false for Node.js environments, even with WASM loaded.
7
4
  */
8
- function isRealBrowser() {
5
+ export function isRealBrowser() {
9
6
  if (typeof process !== "undefined" &&
10
7
  process.versions &&
11
8
  process.versions.node) {
@@ -18,3 +15,4 @@ function isRealBrowser() {
18
15
  }
19
16
  return false;
20
17
  }
18
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,IACE,OAAO,OAAO,KAAK,WAAW;QAC7B,OAAe,CAAC,QAAQ;QACxB,OAAe,CAAC,QAAQ,CAAC,IAAI,EAC9B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC5E,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,7 +1,8 @@
1
- export { TinfoilAI } from "./tinfoilai";
2
- export { TinfoilAI as default } from "./tinfoilai";
3
- export * from "./verifier";
4
- export * from "./ai-sdk-provider";
5
- export * from "./config";
6
- export { SecureClient } from "./secure-client";
7
- export { UnverifiedClient } from "./unverified-client";
1
+ export { TinfoilAI } from "./tinfoil-ai.browser.js";
2
+ export { TinfoilAI as default } from "./tinfoil-ai.browser.js";
3
+ export * from "./verifier.js";
4
+ export * from "./ai-sdk-provider.browser.js";
5
+ export * from "./config.js";
6
+ export { SecureClient } from "./secure-client.browser.js";
7
+ export { UnverifiedClient } from "./unverified-client.js";
8
+ //# sourceMappingURL=index.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE/D,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,29 +1,9 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.UnverifiedClient = exports.SecureClient = exports.default = exports.TinfoilAI = void 0;
18
1
  // Browser-safe entry point: avoids Node built-ins
19
- var tinfoilai_1 = require("./tinfoilai");
20
- Object.defineProperty(exports, "TinfoilAI", { enumerable: true, get: function () { return tinfoilai_1.TinfoilAI; } });
21
- var tinfoilai_2 = require("./tinfoilai");
22
- Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tinfoilai_2.TinfoilAI; } });
23
- __exportStar(require("./verifier"), exports);
24
- __exportStar(require("./ai-sdk-provider"), exports);
25
- __exportStar(require("./config"), exports);
26
- var secure_client_1 = require("./secure-client");
27
- Object.defineProperty(exports, "SecureClient", { enumerable: true, get: function () { return secure_client_1.SecureClient; } });
28
- var unverified_client_1 = require("./unverified-client");
29
- Object.defineProperty(exports, "UnverifiedClient", { enumerable: true, get: function () { return unverified_client_1.UnverifiedClient; } });
2
+ export { TinfoilAI } from "./tinfoil-ai.browser.js";
3
+ export { TinfoilAI as default } from "./tinfoil-ai.browser.js";
4
+ export * from "./verifier.js";
5
+ export * from "./ai-sdk-provider.browser.js";
6
+ export * from "./config.js";
7
+ export { SecureClient } from "./secure-client.browser.js";
8
+ export { UnverifiedClient } from "./unverified-client.js";
9
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE/D,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- export { TinfoilAI } from "./tinfoilai";
2
- export { TinfoilAI as default } from "./tinfoilai";
3
- export * from "./verifier";
4
- export * from "./ai-sdk-provider";
5
- export * from "./config";
6
- export { SecureClient } from "./secure-client";
7
- export { UnverifiedClient } from "./unverified-client";
8
- export { fetchRouter } from "./router";
1
+ export { TinfoilAI } from "./tinfoil-ai.js";
2
+ export { TinfoilAI as default } from "./tinfoil-ai.js";
3
+ export * from "./verifier.js";
4
+ export * from "./ai-sdk-provider.js";
5
+ export * from "./config.js";
6
+ export { SecureClient } from "./secure-client.js";
7
+ export { UnverifiedClient } from "./unverified-client.js";
8
+ export { fetchRouter } from "./router.js";
9
9
  export { type Uploadable, toFile, APIPromise, PagePromise, OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, NotFoundError, ConflictError, RateLimitError, BadRequestError, AuthenticationError, InternalServerError, PermissionDeniedError, UnprocessableEntityError, } from "openai";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGvD,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,OAAO,EACL,KAAK,UAAU,EACf,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -1,51 +1,14 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.UnprocessableEntityError = exports.PermissionDeniedError = exports.InternalServerError = exports.AuthenticationError = exports.BadRequestError = exports.RateLimitError = exports.ConflictError = exports.NotFoundError = exports.APIUserAbortError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIError = exports.OpenAIError = exports.PagePromise = exports.APIPromise = exports.toFile = exports.fetchRouter = exports.UnverifiedClient = exports.SecureClient = exports.default = exports.TinfoilAI = void 0;
18
1
  // Re-export the TinfoilAI class
19
- var tinfoilai_1 = require("./tinfoilai");
20
- Object.defineProperty(exports, "TinfoilAI", { enumerable: true, get: function () { return tinfoilai_1.TinfoilAI; } });
21
- var tinfoilai_2 = require("./tinfoilai");
22
- Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tinfoilai_2.TinfoilAI; } });
2
+ export { TinfoilAI } from "./tinfoil-ai.js";
3
+ export { TinfoilAI as default } from "./tinfoil-ai.js";
23
4
  // Export verifier
24
- __exportStar(require("./verifier"), exports);
25
- __exportStar(require("./ai-sdk-provider"), exports);
26
- __exportStar(require("./config"), exports);
27
- var secure_client_1 = require("./secure-client");
28
- Object.defineProperty(exports, "SecureClient", { enumerable: true, get: function () { return secure_client_1.SecureClient; } });
29
- var unverified_client_1 = require("./unverified-client");
30
- Object.defineProperty(exports, "UnverifiedClient", { enumerable: true, get: function () { return unverified_client_1.UnverifiedClient; } });
31
- var router_1 = require("./router");
32
- Object.defineProperty(exports, "fetchRouter", { enumerable: true, get: function () { return router_1.fetchRouter; } });
5
+ export * from "./verifier.js";
6
+ export * from "./ai-sdk-provider.js";
7
+ export * from "./config.js";
8
+ export { SecureClient } from "./secure-client.js";
9
+ export { UnverifiedClient } from "./unverified-client.js";
10
+ export { fetchRouter } from "./router.js";
33
11
  // Re-export OpenAI utility types and classes that users might need
34
12
  // Using public exports from the main OpenAI package instead of deep imports
35
- var openai_1 = require("openai");
36
- Object.defineProperty(exports, "toFile", { enumerable: true, get: function () { return openai_1.toFile; } });
37
- Object.defineProperty(exports, "APIPromise", { enumerable: true, get: function () { return openai_1.APIPromise; } });
38
- Object.defineProperty(exports, "PagePromise", { enumerable: true, get: function () { return openai_1.PagePromise; } });
39
- Object.defineProperty(exports, "OpenAIError", { enumerable: true, get: function () { return openai_1.OpenAIError; } });
40
- Object.defineProperty(exports, "APIError", { enumerable: true, get: function () { return openai_1.APIError; } });
41
- Object.defineProperty(exports, "APIConnectionError", { enumerable: true, get: function () { return openai_1.APIConnectionError; } });
42
- Object.defineProperty(exports, "APIConnectionTimeoutError", { enumerable: true, get: function () { return openai_1.APIConnectionTimeoutError; } });
43
- Object.defineProperty(exports, "APIUserAbortError", { enumerable: true, get: function () { return openai_1.APIUserAbortError; } });
44
- Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return openai_1.NotFoundError; } });
45
- Object.defineProperty(exports, "ConflictError", { enumerable: true, get: function () { return openai_1.ConflictError; } });
46
- Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return openai_1.RateLimitError; } });
47
- Object.defineProperty(exports, "BadRequestError", { enumerable: true, get: function () { return openai_1.BadRequestError; } });
48
- Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return openai_1.AuthenticationError; } });
49
- Object.defineProperty(exports, "InternalServerError", { enumerable: true, get: function () { return openai_1.InternalServerError; } });
50
- Object.defineProperty(exports, "PermissionDeniedError", { enumerable: true, get: function () { return openai_1.PermissionDeniedError; } });
51
- Object.defineProperty(exports, "UnprocessableEntityError", { enumerable: true, get: function () { return openai_1.UnprocessableEntityError; } });
13
+ export { toFile, APIPromise, PagePromise, OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, NotFoundError, ConflictError, RateLimitError, BadRequestError, AuthenticationError, InternalServerError, PermissionDeniedError, UnprocessableEntityError, } from "openai";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEvD,kBAAkB;AAClB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,mEAAmE;AACnE,4EAA4E;AAC5E,OAAO,EAEL,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,QAAQ,CAAC"}
@@ -1 +1,2 @@
1
1
  export declare function createPinnedTlsFetch(baseURL: string, expectedFingerprintHex: string): typeof fetch;
2
+ //# sourceMappingURL=pinned-tls-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinned-tls-fetch.d.ts","sourceRoot":"","sources":["../src/pinned-tls-fetch.ts"],"names":[],"mappings":"AAMA,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,GAAG,OAAO,KAAK,CAyGlG"}
@@ -1,14 +1,9 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createPinnedTlsFetch = createPinnedTlsFetch;
7
- const https_1 = __importDefault(require("https"));
8
- const tls_1 = require("tls");
9
- const crypto_1 = require("crypto");
10
- const stream_1 = require("stream");
11
- function createPinnedTlsFetch(baseURL, expectedFingerprintHex) {
1
+ import https from "https";
2
+ import tls, { checkServerIdentity as tlsCheckServerIdentity } from "tls";
3
+ import { X509Certificate, createHash } from "crypto";
4
+ import { Readable } from "stream";
5
+ import { ReadableStream as NodeReadableStream } from "stream/web";
6
+ export function createPinnedTlsFetch(baseURL, expectedFingerprintHex) {
12
7
  return (async (input, init) => {
13
8
  // Normalize URL with base URL support
14
9
  const makeURL = (value) => {
@@ -42,7 +37,7 @@ function createPinnedTlsFetch(baseURL, expectedFingerprintHex) {
42
37
  }
43
38
  // Convert web streams to Node streams if needed
44
39
  if (body && typeof body.getReader === "function") {
45
- body = stream_1.Readable.fromWeb(body);
40
+ body = Readable.fromWeb(body);
46
41
  }
47
42
  if (body instanceof ArrayBuffer) {
48
43
  body = Buffer.from(body);
@@ -62,18 +57,18 @@ function createPinnedTlsFetch(baseURL, expectedFingerprintHex) {
62
57
  if (!raw) {
63
58
  return new Error("Certificate raw bytes are unavailable for pinning");
64
59
  }
65
- const x509 = new crypto_1.X509Certificate(raw);
60
+ const x509 = new X509Certificate(raw);
66
61
  const publicKeyDer = x509.publicKey.export({ type: "spki", format: "der" });
67
- const fp = (0, crypto_1.createHash)("sha256").update(publicKeyDer).digest("hex");
62
+ const fp = createHash("sha256").update(publicKeyDer).digest("hex");
68
63
  if (fp !== expectedFingerprintHex) {
69
64
  return new Error(`Certificate public key fingerprint mismatch. Expected: ${expectedFingerprintHex}, Got: ${fp}`);
70
65
  }
71
- return (0, tls_1.checkServerIdentity)(host, cert);
66
+ return tlsCheckServerIdentity(host, cert);
72
67
  },
73
68
  };
74
69
  const { signal } = init || {};
75
70
  const res = await new Promise((resolve, reject) => {
76
- const req = https_1.default.request(requestOptions, resolve);
71
+ const req = https.request(requestOptions, resolve);
77
72
  req.on("error", reject);
78
73
  if (signal) {
79
74
  if (signal.aborted) {
@@ -106,7 +101,7 @@ function createPinnedTlsFetch(baseURL, expectedFingerprintHex) {
106
101
  }
107
102
  }
108
103
  // Convert Node stream to Web ReadableStream
109
- const webStream = stream_1.Readable.toWeb(res);
104
+ const webStream = Readable.toWeb(res);
110
105
  return new Response(webStream, {
111
106
  status: res.statusCode || 0,
112
107
  statusText: res.statusMessage || "",
@@ -114,3 +109,4 @@ function createPinnedTlsFetch(baseURL, expectedFingerprintHex) {
114
109
  });
115
110
  });
116
111
  }
112
+ //# sourceMappingURL=pinned-tls-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinned-tls-fetch.js","sourceRoot":"","sources":["../src/pinned-tls-fetch.ts"],"names":[],"mappings":"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"}
package/dist/router.d.ts CHANGED
@@ -9,3 +9,4 @@
9
9
  * @throws Error if no routers are found or if the request fails
10
10
  */
11
11
  export declare function fetchRouter(): Promise<string>;
12
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CA2BnD"}
package/dist/router.js CHANGED
@@ -1,7 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchRouter = fetchRouter;
4
- const config_1 = require("./config");
1
+ import { TINFOIL_CONFIG } from "./config.js";
2
+ import { fetch as tauriFetch } from "@tauri-apps/plugin-http";
5
3
  /**
6
4
  * Router utilities for fetching available Tinfoil routers
7
5
  */
@@ -12,10 +10,10 @@ const config_1 = require("./config");
12
10
  * @returns Promise<string> A randomly selected router address
13
11
  * @throws Error if no routers are found or if the request fails
14
12
  */
15
- async function fetchRouter() {
16
- const routersUrl = config_1.TINFOIL_CONFIG.ATC_API_URL;
13
+ export async function fetchRouter() {
14
+ const routersUrl = TINFOIL_CONFIG.ATC_API_URL;
17
15
  try {
18
- const response = await fetch(routersUrl);
16
+ const response = await tauriFetch(routersUrl);
19
17
  if (!response.ok) {
20
18
  throw new Error(`Failed to fetch routers: ${response.status} ${response.statusText}`);
21
19
  }
@@ -34,3 +32,4 @@ async function fetchRouter() {
34
32
  throw new Error("Failed to fetch router: Unknown error");
35
33
  }
36
34
  }
35
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;GAEG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE9C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACrE,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAa,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEhD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,oCAAoC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}