@worldcoin/idkit-core 4.0.1 → 4.0.2-dev.6541a3e

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.
package/dist/index.cjs CHANGED
@@ -1,10 +1,16 @@
1
1
  'use strict';
2
2
 
3
+ var sha3 = require('@noble/hashes/sha3');
4
+ var utils = require('@noble/hashes/utils');
5
+ var hmac = require('@noble/hashes/hmac');
6
+ var sha2 = require('@noble/hashes/sha2');
7
+ var secp256k1 = require('@noble/secp256k1');
8
+
3
9
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
4
10
  var __defProp = Object.defineProperty;
5
- var __export = (target, all2) => {
6
- for (var name in all2)
7
- __defProp(target, name, { get: all2[name], enumerable: true });
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
8
14
  };
9
15
 
10
16
  // src/types/result.ts
@@ -245,6 +251,22 @@ function _assertClass(instance, klass) {
245
251
  throw new Error(`expected instance of ${klass.name}`);
246
252
  }
247
253
  }
254
+ function createSession(app_id, rp_context, action_description, bridge_url, override_connect_base_url, environment) {
255
+ const ptr0 = passStringToWasm0(app_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);
256
+ const len0 = WASM_VECTOR_LEN;
257
+ _assertClass(rp_context, RpContextWasm);
258
+ var ptr1 = rp_context.__destroy_into_raw();
259
+ var ptr2 = isLikeNone(action_description) ? 0 : passStringToWasm0(action_description, wasm.__wbindgen_export, wasm.__wbindgen_export2);
260
+ var len2 = WASM_VECTOR_LEN;
261
+ var ptr3 = isLikeNone(bridge_url) ? 0 : passStringToWasm0(bridge_url, wasm.__wbindgen_export, wasm.__wbindgen_export2);
262
+ var len3 = WASM_VECTOR_LEN;
263
+ var ptr4 = isLikeNone(override_connect_base_url) ? 0 : passStringToWasm0(override_connect_base_url, wasm.__wbindgen_export, wasm.__wbindgen_export2);
264
+ var len4 = WASM_VECTOR_LEN;
265
+ var ptr5 = isLikeNone(environment) ? 0 : passStringToWasm0(environment, wasm.__wbindgen_export, wasm.__wbindgen_export2);
266
+ var len5 = WASM_VECTOR_LEN;
267
+ const ret = wasm.createSession(ptr0, len0, ptr1, ptr2, len2, ptr3, len3, ptr4, len4, ptr5, len5);
268
+ return IDKitBuilder.__wrap(ret);
269
+ }
248
270
  function request(app_id, action, rp_context, action_description, bridge_url, allow_legacy_proofs, override_connect_base_url, environment) {
249
271
  const ptr0 = passStringToWasm0(app_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);
250
272
  const len0 = WASM_VECTOR_LEN;
@@ -263,9 +285,6 @@ function request(app_id, action, rp_context, action_description, bridge_url, all
263
285
  const ret = wasm.idkitbuilder_new(ptr0, len0, ptr1, len1, ptr2, ptr3, len3, ptr4, len4, allow_legacy_proofs, ptr5, len5, ptr6, len6);
264
286
  return IDKitBuilder.__wrap(ret);
265
287
  }
266
- function init_wasm() {
267
- wasm.init_wasm();
268
- }
269
288
  function base64Decode(data) {
270
289
  try {
271
290
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
@@ -304,22 +323,6 @@ function proveSession(session_id, app_id, rp_context, action_description, bridge
304
323
  const ret = wasm.idkitbuilder_forProveSession(ptr0, len0, ptr1, len1, ptr2, ptr3, len3, ptr4, len4, ptr5, len5, ptr6, len6);
305
324
  return IDKitBuilder.__wrap(ret);
306
325
  }
307
- function createSession(app_id, rp_context, action_description, bridge_url, override_connect_base_url, environment) {
308
- const ptr0 = passStringToWasm0(app_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);
309
- const len0 = WASM_VECTOR_LEN;
310
- _assertClass(rp_context, RpContextWasm);
311
- var ptr1 = rp_context.__destroy_into_raw();
312
- var ptr2 = isLikeNone(action_description) ? 0 : passStringToWasm0(action_description, wasm.__wbindgen_export, wasm.__wbindgen_export2);
313
- var len2 = WASM_VECTOR_LEN;
314
- var ptr3 = isLikeNone(bridge_url) ? 0 : passStringToWasm0(bridge_url, wasm.__wbindgen_export, wasm.__wbindgen_export2);
315
- var len3 = WASM_VECTOR_LEN;
316
- var ptr4 = isLikeNone(override_connect_base_url) ? 0 : passStringToWasm0(override_connect_base_url, wasm.__wbindgen_export, wasm.__wbindgen_export2);
317
- var len4 = WASM_VECTOR_LEN;
318
- var ptr5 = isLikeNone(environment) ? 0 : passStringToWasm0(environment, wasm.__wbindgen_export, wasm.__wbindgen_export2);
319
- var len5 = WASM_VECTOR_LEN;
320
- const ret = wasm.createSession(ptr0, len0, ptr1, ptr2, len2, ptr3, len3, ptr4, len4, ptr5, len5);
321
- return IDKitBuilder.__wrap(ret);
322
- }
323
326
  function passArray8ToWasm0(arg, malloc) {
324
327
  const ptr = malloc(arg.length * 1, 1) >>> 0;
325
328
  getUint8ArrayMemory0().set(arg, ptr / 1);
@@ -344,6 +347,28 @@ function base64Encode(data) {
344
347
  wasm.__wbindgen_export4(deferred2_0, deferred2_1, 1);
345
348
  }
346
349
  }
350
+ function init_wasm() {
351
+ wasm.init_wasm();
352
+ }
353
+ function signRequest(action, signing_key_hex, ttl_seconds) {
354
+ try {
355
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
356
+ const ptr0 = passStringToWasm0(action, wasm.__wbindgen_export, wasm.__wbindgen_export2);
357
+ const len0 = WASM_VECTOR_LEN;
358
+ const ptr1 = passStringToWasm0(signing_key_hex, wasm.__wbindgen_export, wasm.__wbindgen_export2);
359
+ const len1 = WASM_VECTOR_LEN;
360
+ wasm.signRequest(retptr, ptr0, len0, ptr1, len1, !isLikeNone(ttl_seconds), isLikeNone(ttl_seconds) ? BigInt(0) : ttl_seconds);
361
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
362
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
363
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
364
+ if (r2) {
365
+ throw takeObject(r1);
366
+ }
367
+ return RpSignature.__wrap(r0);
368
+ } finally {
369
+ wasm.__wbindgen_add_to_stack_pointer(16);
370
+ }
371
+ }
347
372
  function hashSignal(signal) {
348
373
  let deferred2_0;
349
374
  let deferred2_1;
@@ -369,33 +394,14 @@ function hashSignal(signal) {
369
394
  wasm.__wbindgen_export4(deferred2_0, deferred2_1, 1);
370
395
  }
371
396
  }
372
- function signRequest(action, signing_key_hex, ttl_seconds) {
373
- try {
374
- const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
375
- const ptr0 = passStringToWasm0(action, wasm.__wbindgen_export, wasm.__wbindgen_export2);
376
- const len0 = WASM_VECTOR_LEN;
377
- const ptr1 = passStringToWasm0(signing_key_hex, wasm.__wbindgen_export, wasm.__wbindgen_export2);
378
- const len1 = WASM_VECTOR_LEN;
379
- wasm.signRequest(retptr, ptr0, len0, ptr1, len1, !isLikeNone(ttl_seconds), isLikeNone(ttl_seconds) ? BigInt(0) : ttl_seconds);
380
- var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
381
- var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
382
- var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
383
- if (r2) {
384
- throw takeObject(r1);
385
- }
386
- return RpSignature.__wrap(r0);
387
- } finally {
388
- wasm.__wbindgen_add_to_stack_pointer(16);
389
- }
390
- }
391
- function __wasm_bindgen_func_elem_960(arg0, arg1, arg2) {
392
- wasm.__wasm_bindgen_func_elem_960(arg0, arg1, addHeapObject(arg2));
397
+ function __wasm_bindgen_func_elem_959(arg0, arg1, arg2) {
398
+ wasm.__wasm_bindgen_func_elem_959(arg0, arg1, addHeapObject(arg2));
393
399
  }
394
- function __wasm_bindgen_func_elem_597(arg0, arg1) {
395
- wasm.__wasm_bindgen_func_elem_597(arg0, arg1);
400
+ function __wasm_bindgen_func_elem_596(arg0, arg1) {
401
+ wasm.__wasm_bindgen_func_elem_596(arg0, arg1);
396
402
  }
397
- function __wasm_bindgen_func_elem_1343(arg0, arg1, arg2, arg3) {
398
- wasm.__wasm_bindgen_func_elem_1343(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
403
+ function __wasm_bindgen_func_elem_1344(arg0, arg1, arg2, arg3) {
404
+ wasm.__wasm_bindgen_func_elem_1344(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
399
405
  }
400
406
  var __wbindgen_enum_RequestCache = ["default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached"];
401
407
  var __wbindgen_enum_RequestCredentials = ["omit", "same-origin", "include"];
@@ -772,6 +778,34 @@ var IDKitBuilder = class _IDKitBuilder {
772
778
  const ret = wasm.idkitbuilder_constraints(ptr, addHeapObject(constraints_json));
773
779
  return takeObject(ret);
774
780
  }
781
+ /**
782
+ * Builds the native payload for constraints (synchronous, no bridge connection).
783
+ *
784
+ * Used by the native transport to get the same payload format as the bridge
785
+ * without creating a network connection.
786
+ *
787
+ * # Errors
788
+ *
789
+ * Returns an error if constraints are invalid or payload construction fails.
790
+ * @param {any} constraints_json
791
+ * @returns {any}
792
+ */
793
+ nativePayload(constraints_json) {
794
+ try {
795
+ const ptr = this.__destroy_into_raw();
796
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
797
+ wasm.idkitbuilder_nativePayload(retptr, ptr, addHeapObject(constraints_json));
798
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
799
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
800
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
801
+ if (r2) {
802
+ throw takeObject(r1);
803
+ }
804
+ return takeObject(r0);
805
+ } finally {
806
+ wasm.__wbindgen_add_to_stack_pointer(16);
807
+ }
808
+ }
775
809
  /**
776
810
  * Creates a new builder for proving an existing session
777
811
  * @param {string} session_id
@@ -827,6 +861,34 @@ var IDKitBuilder = class _IDKitBuilder {
827
861
  const ret = wasm.createSession(ptr0, len0, ptr1, ptr2, len2, ptr3, len3, ptr4, len4, ptr5, len5);
828
862
  return _IDKitBuilder.__wrap(ret);
829
863
  }
864
+ /**
865
+ * Builds the native payload from a preset (synchronous, no bridge connection).
866
+ *
867
+ * Used by the native transport to get the same payload format as the bridge
868
+ * without creating a network connection.
869
+ *
870
+ * # Errors
871
+ *
872
+ * Returns an error if the preset is invalid or payload construction fails.
873
+ * @param {any} preset_json
874
+ * @returns {any}
875
+ */
876
+ nativePayloadFromPreset(preset_json) {
877
+ try {
878
+ const ptr = this.__destroy_into_raw();
879
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
880
+ wasm.idkitbuilder_nativePayloadFromPreset(retptr, ptr, addHeapObject(preset_json));
881
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
882
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
883
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
884
+ if (r2) {
885
+ throw takeObject(r1);
886
+ }
887
+ return takeObject(r0);
888
+ } finally {
889
+ wasm.__wbindgen_add_to_stack_pointer(16);
890
+ }
891
+ }
830
892
  /**
831
893
  * Creates a new builder for uniqueness requests
832
894
  * @param {string} app_id
@@ -1502,7 +1564,7 @@ function __wbg_get_imports() {
1502
1564
  const a = state0.a;
1503
1565
  state0.a = 0;
1504
1566
  try {
1505
- return __wasm_bindgen_func_elem_1343(a, state0.b, arg02, arg12);
1567
+ return __wasm_bindgen_func_elem_1344(a, state0.b, arg02, arg12);
1506
1568
  } finally {
1507
1569
  state0.a = a;
1508
1570
  }
@@ -1715,20 +1777,20 @@ function __wbg_get_imports() {
1715
1777
  const ret = getStringFromWasm0(arg0, arg1);
1716
1778
  return addHeapObject(ret);
1717
1779
  };
1718
- imports.wbg.__wbindgen_cast_4625c577ab2ec9ee = function(arg0) {
1719
- const ret = BigInt.asUintN(64, arg0);
1780
+ imports.wbg.__wbindgen_cast_2d12912bac8cf5ca = function(arg0, arg1) {
1781
+ const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_958, __wasm_bindgen_func_elem_959);
1720
1782
  return addHeapObject(ret);
1721
1783
  };
1722
- imports.wbg.__wbindgen_cast_91c43ecf1f8dafb8 = function(arg0, arg1) {
1723
- const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_596, __wasm_bindgen_func_elem_597);
1784
+ imports.wbg.__wbindgen_cast_4625c577ab2ec9ee = function(arg0) {
1785
+ const ret = BigInt.asUintN(64, arg0);
1724
1786
  return addHeapObject(ret);
1725
1787
  };
1726
1788
  imports.wbg.__wbindgen_cast_9ae0607507abb057 = function(arg0) {
1727
1789
  const ret = arg0;
1728
1790
  return addHeapObject(ret);
1729
1791
  };
1730
- imports.wbg.__wbindgen_cast_ab10518eebecf9a3 = function(arg0, arg1) {
1731
- const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_959, __wasm_bindgen_func_elem_960);
1792
+ imports.wbg.__wbindgen_cast_b8b1061c2d0ea705 = function(arg0, arg1) {
1793
+ const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_595, __wasm_bindgen_func_elem_596);
1732
1794
  return addHeapObject(ret);
1733
1795
  };
1734
1796
  imports.wbg.__wbindgen_cast_cb9088102bce6b30 = function(arg0, arg1) {
@@ -1814,27 +1876,230 @@ async function initIDKit() {
1814
1876
  })();
1815
1877
  return wasmInitPromise;
1816
1878
  }
1817
- async function initIDKitServer() {
1818
- if (wasmInitialized) {
1819
- return;
1879
+
1880
+ // src/transports/native.ts
1881
+ var MINIAPP_VERIFY_ACTION = "miniapp-verify-action";
1882
+ function isInWorldApp() {
1883
+ return typeof window !== "undefined" && Boolean(window.WorldApp);
1884
+ }
1885
+ var _requestCounter = 0;
1886
+ var _activeNativeRequest = null;
1887
+ function createNativeRequest(wasmPayload, config) {
1888
+ if (_activeNativeRequest?.isPending()) {
1889
+ console.warn(
1890
+ "IDKit native request already in flight. Reusing active request."
1891
+ );
1892
+ return _activeNativeRequest;
1820
1893
  }
1821
- if (wasmInitPromise) {
1822
- return wasmInitPromise;
1894
+ const request2 = new NativeIDKitRequest(wasmPayload, config);
1895
+ _activeNativeRequest = request2;
1896
+ return request2;
1897
+ }
1898
+ var NativeIDKitRequest = class {
1899
+ constructor(wasmPayload, config) {
1900
+ this.connectorURI = "";
1901
+ this.resolved = false;
1902
+ this.cancelled = false;
1903
+ this.settled = false;
1904
+ this.resolvedResult = null;
1905
+ this.messageHandler = null;
1906
+ this.miniKitHandler = null;
1907
+ this.rejectFn = null;
1908
+ this.requestId = crypto.randomUUID?.() ?? `native-${Date.now()}-${++_requestCounter}`;
1909
+ this.resultPromise = new Promise((resolve, reject) => {
1910
+ this.rejectFn = reject;
1911
+ const handleIncomingPayload = (responsePayload) => {
1912
+ if (this.cancelled || this.resolved || this.settled) return;
1913
+ if (responsePayload?.status === "error") {
1914
+ this.cleanup();
1915
+ reject(
1916
+ new NativeVerifyError(
1917
+ responsePayload.error_code ?? "generic_error" /* GenericError */
1918
+ )
1919
+ );
1920
+ return;
1921
+ }
1922
+ this.resolved = true;
1923
+ const result = nativeResultToIDKitResult(responsePayload, config);
1924
+ this.resolvedResult = result;
1925
+ this.cleanup();
1926
+ resolve(result);
1927
+ };
1928
+ const handler = (event) => {
1929
+ const data = event.data;
1930
+ if (data?.type === MINIAPP_VERIFY_ACTION || data?.command === MINIAPP_VERIFY_ACTION) {
1931
+ handleIncomingPayload(data.payload ?? data);
1932
+ }
1933
+ };
1934
+ this.messageHandler = handler;
1935
+ window.addEventListener("message", handler);
1936
+ try {
1937
+ const miniKit = window.MiniKit;
1938
+ if (typeof miniKit?.subscribe === "function") {
1939
+ const miniKitHandler = (payload) => {
1940
+ handleIncomingPayload(payload?.payload ?? payload);
1941
+ };
1942
+ this.miniKitHandler = miniKitHandler;
1943
+ miniKit.subscribe(MINIAPP_VERIFY_ACTION, miniKitHandler);
1944
+ }
1945
+ } catch {
1946
+ }
1947
+ const sendPayload = {
1948
+ command: "verify",
1949
+ version: 2,
1950
+ payload: wasmPayload
1951
+ };
1952
+ const w = window;
1953
+ if (w.webkit?.messageHandlers?.minikit) {
1954
+ w.webkit.messageHandlers.minikit.postMessage(sendPayload);
1955
+ } else if (w.Android) {
1956
+ w.Android.postMessage(JSON.stringify(sendPayload));
1957
+ } else {
1958
+ this.cleanup();
1959
+ reject(new Error("No WebView bridge available"));
1960
+ }
1961
+ });
1962
+ this.resultPromise.catch(() => {
1963
+ }).finally(() => {
1964
+ this.settled = true;
1965
+ this.cleanup();
1966
+ if (_activeNativeRequest === this) {
1967
+ _activeNativeRequest = null;
1968
+ }
1969
+ });
1823
1970
  }
1824
- wasmInitPromise = (async () => {
1971
+ /**
1972
+ * Cancel this request. Removes the message listener so it cannot consume
1973
+ * a response meant for a later request, and rejects the pending promise.
1974
+ */
1975
+ cancel() {
1976
+ if (this.resolved || this.cancelled) return;
1977
+ this.cancelled = true;
1978
+ this.cleanup();
1979
+ this.rejectFn?.(new NativeVerifyError("cancelled" /* Cancelled */));
1980
+ if (_activeNativeRequest === this) {
1981
+ _activeNativeRequest = null;
1982
+ }
1983
+ }
1984
+ cleanup() {
1985
+ if (this.messageHandler) {
1986
+ window.removeEventListener("message", this.messageHandler);
1987
+ this.messageHandler = null;
1988
+ }
1989
+ if (this.miniKitHandler) {
1990
+ try {
1991
+ const miniKit = window.MiniKit;
1992
+ miniKit?.unsubscribe?.(MINIAPP_VERIFY_ACTION);
1993
+ } catch {
1994
+ }
1995
+ this.miniKitHandler = null;
1996
+ }
1997
+ }
1998
+ isPending() {
1999
+ return !this.settled && !this.cancelled;
2000
+ }
2001
+ async pollOnce() {
2002
+ if (this.resolved && this.resolvedResult) {
2003
+ return { type: "confirmed", result: this.resolvedResult };
2004
+ }
2005
+ return { type: "awaiting_confirmation" };
2006
+ }
2007
+ async pollUntilCompletion(options) {
2008
+ const timeout = options?.timeout ?? 3e5;
2009
+ let timeoutId;
2010
+ let abortHandler = null;
2011
+ let waiterTerminationCode = null;
1825
2012
  try {
1826
- const { readFile } = await import('fs/promises');
1827
- const { fileURLToPath } = await import('url');
1828
- const wasmUrl = new URL("idkit_wasm_bg.wasm", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
1829
- const wasmBuffer = await readFile(fileURLToPath(wasmUrl));
1830
- await idkit_wasm_default({ module_or_path: wasmBuffer });
1831
- wasmInitialized = true;
2013
+ const result = await Promise.race([
2014
+ this.resultPromise,
2015
+ new Promise((_, reject) => {
2016
+ if (options?.signal) {
2017
+ abortHandler = () => {
2018
+ waiterTerminationCode = "cancelled" /* Cancelled */;
2019
+ reject(new NativeVerifyError("cancelled" /* Cancelled */));
2020
+ };
2021
+ if (options.signal.aborted) {
2022
+ abortHandler();
2023
+ return;
2024
+ }
2025
+ options.signal.addEventListener("abort", abortHandler, {
2026
+ once: true
2027
+ });
2028
+ }
2029
+ timeoutId = setTimeout(() => {
2030
+ waiterTerminationCode = "timeout" /* Timeout */;
2031
+ reject(new NativeVerifyError("timeout" /* Timeout */));
2032
+ }, timeout);
2033
+ })
2034
+ ]);
2035
+ return { success: true, result };
1832
2036
  } catch (error) {
1833
- wasmInitPromise = null;
1834
- throw new Error(`Failed to initialize IDKit WASM for server: ${error}`);
2037
+ if (error instanceof NativeVerifyError) {
2038
+ if (waiterTerminationCode === error.code && this.isPending()) {
2039
+ this.cancel();
2040
+ }
2041
+ return { success: false, error: error.code };
2042
+ }
2043
+ return { success: false, error: "generic_error" /* GenericError */ };
2044
+ } finally {
2045
+ if (timeoutId) {
2046
+ clearTimeout(timeoutId);
2047
+ }
2048
+ if (options?.signal && abortHandler) {
2049
+ options.signal.removeEventListener("abort", abortHandler);
2050
+ }
1835
2051
  }
1836
- })();
1837
- return wasmInitPromise;
2052
+ }
2053
+ };
2054
+ var NativeVerifyError = class extends Error {
2055
+ constructor(code) {
2056
+ super(code);
2057
+ this.code = code;
2058
+ }
2059
+ };
2060
+ function nativeResultToIDKitResult(payload, config) {
2061
+ const rpNonce = config.rp_context?.nonce ?? "";
2062
+ if ("responses" in payload && Array.isArray(payload.responses)) {
2063
+ return {
2064
+ protocol_version: payload.protocol_version ?? "4.0",
2065
+ nonce: payload.nonce ?? rpNonce,
2066
+ action: payload.action ?? config.action ?? "",
2067
+ action_description: payload.action_description,
2068
+ session_id: payload.session_id,
2069
+ responses: payload.responses,
2070
+ environment: payload.environment ?? config.environment ?? "production"
2071
+ };
2072
+ }
2073
+ if ("verifications" in payload) {
2074
+ return {
2075
+ protocol_version: "4.0",
2076
+ nonce: rpNonce,
2077
+ action: config.action ?? "",
2078
+ responses: payload.verifications.map((v) => ({
2079
+ identifier: v.verification_level,
2080
+ proof: [v.proof],
2081
+ nullifier: v.nullifier_hash,
2082
+ merkle_root: v.merkle_root,
2083
+ issuer_schema_id: 0,
2084
+ expires_at_min: 0
2085
+ })),
2086
+ environment: "production"
2087
+ };
2088
+ }
2089
+ return {
2090
+ protocol_version: "3.0",
2091
+ nonce: rpNonce,
2092
+ action: config.action ?? "",
2093
+ responses: [
2094
+ {
2095
+ identifier: payload.verification_level,
2096
+ proof: payload.proof,
2097
+ merkle_root: payload.merkle_root,
2098
+ nullifier: payload.nullifier_hash
2099
+ }
2100
+ ],
2101
+ environment: "production"
2102
+ };
1838
2103
  }
1839
2104
 
1840
2105
  // src/request.ts
@@ -1878,20 +2143,6 @@ var IDKitRequestImpl = class {
1878
2143
  }
1879
2144
  }
1880
2145
  };
1881
- function CredentialRequest(credential_type, options) {
1882
- return {
1883
- type: credential_type,
1884
- signal: options?.signal,
1885
- genesis_issued_at_min: options?.genesis_issued_at_min,
1886
- expires_at_min: options?.expires_at_min
1887
- };
1888
- }
1889
- function any(...nodes) {
1890
- return { any: nodes };
1891
- }
1892
- function all(...nodes) {
1893
- return { all: nodes };
1894
- }
1895
2146
  function orbLegacy(opts = {}) {
1896
2147
  return { type: "OrbLegacy", signal: opts.signal };
1897
2148
  }
@@ -1901,48 +2152,100 @@ function secureDocumentLegacy(opts = {}) {
1901
2152
  function documentLegacy(opts = {}) {
1902
2153
  return { type: "DocumentLegacy", signal: opts.signal };
1903
2154
  }
2155
+ function createWasmBuilderFromConfig(config) {
2156
+ if (!config.rp_context) {
2157
+ throw new Error("rp_context is required for WASM bridge transport");
2158
+ }
2159
+ const rpContext = new idkit_wasm_exports.RpContextWasm(
2160
+ config.rp_context.rp_id,
2161
+ config.rp_context.nonce,
2162
+ BigInt(config.rp_context.created_at),
2163
+ BigInt(config.rp_context.expires_at),
2164
+ config.rp_context.signature
2165
+ );
2166
+ if (config.type === "request") {
2167
+ return idkit_wasm_exports.request(
2168
+ config.app_id,
2169
+ String(config.action ?? ""),
2170
+ rpContext,
2171
+ config.action_description ?? null,
2172
+ config.bridge_url ?? null,
2173
+ config.allow_legacy_proofs ?? false,
2174
+ config.override_connect_base_url ?? null,
2175
+ config.environment ?? null
2176
+ );
2177
+ }
2178
+ if (config.type === "proveSession") {
2179
+ return idkit_wasm_exports.proveSession(
2180
+ config.session_id,
2181
+ config.app_id,
2182
+ rpContext,
2183
+ config.action_description ?? null,
2184
+ config.bridge_url ?? null,
2185
+ config.override_connect_base_url ?? null,
2186
+ config.environment ?? null
2187
+ );
2188
+ }
2189
+ return idkit_wasm_exports.createSession(
2190
+ config.app_id,
2191
+ rpContext,
2192
+ config.action_description ?? null,
2193
+ config.bridge_url ?? null,
2194
+ config.override_connect_base_url ?? null,
2195
+ config.environment ?? null
2196
+ );
2197
+ }
1904
2198
  var IDKitBuilder2 = class {
1905
- constructor(wasmBuilder) {
1906
- this.wasmBuilder = wasmBuilder;
2199
+ constructor(config) {
2200
+ this.config = config;
1907
2201
  }
1908
2202
  /**
1909
2203
  * Creates an IDKit request with the given constraints
1910
2204
  *
1911
- * @param constraints - Constraint tree (CredentialRequest or any/all combinators)
2205
+ * @param constraints - Constraint tree (CredentialRequest or any/all/enumerate combinators)
1912
2206
  * @returns A new IDKitRequest instance
1913
2207
  *
1914
2208
  * @example
1915
2209
  * ```typescript
1916
- * const builder = await IDKit.request({ app_id, action, rp_context });
1917
- * const request = await builder.constraints(any(CredentialRequest('orb'), CredentialRequest('face')));
2210
+ * const request = await IDKit.request({ app_id, action, rp_context, allow_legacy_proofs: false })
2211
+ * .constraints(any(CredentialRequest('orb'), CredentialRequest('face')));
1918
2212
  * ```
1919
2213
  */
1920
- //TODO: re-enable once this is supported and World ID 4.0 is rolled out live
1921
- // async constraints(constraints: ConstraintNode): Promise<IDKitRequest> {
1922
- // await initIDKit();
1923
- // const wasmRequest = (await this.wasmBuilder.constraints(
1924
- // constraints,
1925
- // )) as unknown as WasmModule.IDKitRequest;
1926
- // return new IDKitRequestImpl(wasmRequest);
1927
- // }
2214
+ async constraints(constraints) {
2215
+ await initIDKit();
2216
+ const wasmBuilder = createWasmBuilderFromConfig(this.config);
2217
+ if (isInWorldApp()) {
2218
+ const payload = wasmBuilder.nativePayload(constraints);
2219
+ return createNativeRequest(payload, this.config);
2220
+ }
2221
+ const wasmRequest = await wasmBuilder.constraints(
2222
+ constraints
2223
+ );
2224
+ return new IDKitRequestImpl(wasmRequest);
2225
+ }
1928
2226
  /**
1929
2227
  * Creates an IDKit request from a preset (works for all request types)
1930
2228
  *
1931
2229
  * Presets provide a simplified way to create requests with predefined
1932
2230
  * credential configurations.
1933
2231
  *
1934
- * @param preset - A preset object from orbLegacy()
2232
+ * @param preset - A preset object from orbLegacy(), secureDocumentLegacy(), or documentLegacy()
1935
2233
  * @returns A new IDKitRequest instance
1936
2234
  *
1937
2235
  * @example
1938
2236
  * ```typescript
1939
- * const builder = await IDKit.request({ app_id, action, rp_context });
1940
- * const request = await builder.preset(orbLegacy({ signal: 'user-123' }));
2237
+ * const request = await IDKit.request({ app_id, action, rp_context, allow_legacy_proofs: true })
2238
+ * .preset(orbLegacy({ signal: 'user-123' }));
1941
2239
  * ```
1942
2240
  */
1943
2241
  async preset(preset) {
1944
2242
  await initIDKit();
1945
- const wasmRequest = await this.wasmBuilder.preset(
2243
+ const wasmBuilder = createWasmBuilderFromConfig(this.config);
2244
+ if (isInWorldApp()) {
2245
+ const payload = wasmBuilder.nativePayloadFromPreset(preset);
2246
+ return createNativeRequest(payload, this.config);
2247
+ }
2248
+ const wasmRequest = await wasmBuilder.preset(
1946
2249
  preset
1947
2250
  );
1948
2251
  return new IDKitRequestImpl(wasmRequest);
@@ -1956,101 +2259,43 @@ function createRequest(config) {
1956
2259
  throw new Error("action is required");
1957
2260
  }
1958
2261
  if (!config.rp_context) {
1959
- throw new Error("rp_context is required");
2262
+ throw new Error(
2263
+ "rp_context is required. Generate it on your backend using signRequest()."
2264
+ );
1960
2265
  }
1961
2266
  if (typeof config.allow_legacy_proofs !== "boolean") {
1962
2267
  throw new Error(
1963
2268
  "allow_legacy_proofs is required. Set to true to accept v3 proofs during migration, or false to only accept v4 proofs."
1964
2269
  );
1965
2270
  }
1966
- const rpContext = new idkit_wasm_exports.RpContextWasm(
1967
- config.rp_context.rp_id,
1968
- config.rp_context.nonce,
1969
- BigInt(config.rp_context.created_at),
1970
- BigInt(config.rp_context.expires_at),
1971
- config.rp_context.signature
1972
- );
1973
- const wasmBuilder = idkit_wasm_exports.request(
1974
- config.app_id,
1975
- String(config.action),
1976
- rpContext,
1977
- config.action_description ?? null,
1978
- config.bridge_url ?? null,
1979
- config.allow_legacy_proofs,
1980
- config.override_connect_base_url ?? null,
1981
- config.environment ?? null
1982
- );
1983
- return new IDKitBuilder2(wasmBuilder);
1984
- }
1985
- function createSession2(config) {
1986
- if (!config.app_id) {
1987
- throw new Error("app_id is required");
1988
- }
1989
- if (!config.rp_context) {
1990
- throw new Error("rp_context is required");
1991
- }
1992
- const rpContext = new idkit_wasm_exports.RpContextWasm(
1993
- config.rp_context.rp_id,
1994
- config.rp_context.nonce,
1995
- BigInt(config.rp_context.created_at),
1996
- BigInt(config.rp_context.expires_at),
1997
- config.rp_context.signature
1998
- );
1999
- const wasmBuilder = idkit_wasm_exports.createSession(
2000
- config.app_id,
2001
- rpContext,
2002
- config.action_description ?? null,
2003
- config.bridge_url ?? null,
2004
- config.override_connect_base_url ?? null,
2005
- config.environment ?? null
2006
- );
2007
- return new IDKitBuilder2(wasmBuilder);
2008
- }
2009
- function proveSession2(sessionId, config) {
2010
- if (!sessionId) {
2011
- throw new Error("session_id is required");
2012
- }
2013
- if (!config.app_id) {
2014
- throw new Error("app_id is required");
2015
- }
2016
- if (!config.rp_context) {
2017
- throw new Error("rp_context is required");
2018
- }
2019
- const rpContext = new idkit_wasm_exports.RpContextWasm(
2020
- config.rp_context.rp_id,
2021
- config.rp_context.nonce,
2022
- BigInt(config.rp_context.created_at),
2023
- BigInt(config.rp_context.expires_at),
2024
- config.rp_context.signature
2025
- );
2026
- const wasmBuilder = idkit_wasm_exports.proveSession(
2027
- sessionId,
2028
- config.app_id,
2029
- rpContext,
2030
- config.action_description ?? null,
2031
- config.bridge_url ?? null,
2032
- config.override_connect_base_url ?? null,
2033
- config.environment ?? null
2034
- );
2035
- return new IDKitBuilder2(wasmBuilder);
2271
+ return new IDKitBuilder2({
2272
+ type: "request",
2273
+ app_id: config.app_id,
2274
+ action: String(config.action),
2275
+ rp_context: config.rp_context,
2276
+ action_description: config.action_description,
2277
+ bridge_url: config.bridge_url,
2278
+ allow_legacy_proofs: config.allow_legacy_proofs,
2279
+ override_connect_base_url: config.override_connect_base_url,
2280
+ environment: config.environment
2281
+ });
2036
2282
  }
2037
2283
  var IDKit = {
2038
- /** Initialize WASM for browser environments */
2039
- init: initIDKit,
2040
- /** Initialize WASM for Node.js/server environments */
2041
- initServer: initIDKitServer,
2042
2284
  /** Create a new verification request */
2043
2285
  request: createRequest,
2044
- /** Create a new session (no action, no existing session_id) */
2045
- createSession: createSession2,
2046
- /** Prove an existing session (no action, has session_id) */
2047
- proveSession: proveSession2,
2048
- /** Create a CredentialRequest for a credential type */
2049
- CredentialRequest,
2050
- /** Create an OR constraint - at least one child must be satisfied */
2051
- any,
2052
- /** Create an AND constraint - all children must be satisfied */
2053
- all,
2286
+ // TODO: Re-enable when World ID 4.0 is live
2287
+ // /** Create a new session (no action, no existing session_id) */
2288
+ // createSession,
2289
+ // /** Prove an existing session (no action, has session_id) */
2290
+ // proveSession,
2291
+ // /** Create a CredentialRequest for a credential type */
2292
+ // CredentialRequest,
2293
+ // /** Create an OR constraint - at least one child must be satisfied */
2294
+ // any,
2295
+ // /** Create an AND constraint - all children must be satisfied */
2296
+ // all,
2297
+ // /** Create an enumerate constraint - all satisfiable children should be selected */
2298
+ // enumerate,
2054
2299
  /** Create an OrbLegacy preset for World ID 3.0 legacy support */
2055
2300
  orbLegacy,
2056
2301
  /** Create a SecureDocumentLegacy preset for World ID 3.0 legacy support */
@@ -2081,28 +2326,75 @@ var isServerEnvironment = () => {
2081
2326
  }
2082
2327
  return false;
2083
2328
  };
2329
+ function hashToField(input) {
2330
+ const hash = BigInt("0x" + utils.bytesToHex(sha3.keccak_256(input))) >> 8n;
2331
+ return utils.hexToBytes(hash.toString(16).padStart(64, "0"));
2332
+ }
2333
+ function hashSignal2(signal) {
2334
+ let input;
2335
+ if (signal instanceof Uint8Array) {
2336
+ input = signal;
2337
+ } else if (signal.startsWith("0x") && isValidHex(signal.slice(2))) {
2338
+ input = utils.hexToBytes(signal.slice(2));
2339
+ } else {
2340
+ input = new TextEncoder().encode(signal);
2341
+ }
2342
+ return "0x" + utils.bytesToHex(hashToField(input));
2343
+ }
2344
+ function isValidHex(s) {
2345
+ if (s.length === 0) return false;
2346
+ if (s.length % 2 !== 0) return false;
2347
+ return /^[0-9a-fA-F]+$/.test(s);
2348
+ }
2084
2349
 
2085
- // src/lib/rp-signature.ts
2086
- function signRequest2(action, signingKeyHex, ttlSeconds) {
2350
+ // src/lib/signing.ts
2351
+ secp256k1.etc.hmacSha256Sync = (key, ...msgs) => hmac.hmac(sha2.sha256, key, secp256k1.etc.concatBytes(...msgs));
2352
+ var DEFAULT_TTL_SEC = 300;
2353
+ function computeRpSignatureMessage(nonceBytes, createdAt, expiresAt) {
2354
+ const message = new Uint8Array(48);
2355
+ message.set(nonceBytes, 0);
2356
+ const view = new DataView(message.buffer);
2357
+ view.setBigUint64(32, BigInt(createdAt), false);
2358
+ view.setBigUint64(40, BigInt(expiresAt), false);
2359
+ return message;
2360
+ }
2361
+ function signRequest2(_action, signingKeyHex, ttl = DEFAULT_TTL_SEC) {
2087
2362
  if (!isServerEnvironment()) {
2088
2363
  throw new Error(
2089
2364
  "signRequest can only be used in Node.js environments. This function requires access to signing keys and should never be called from browser/client-side code."
2090
2365
  );
2091
2366
  }
2092
- const ttlBigInt = ttlSeconds !== void 0 ? BigInt(ttlSeconds) : void 0;
2093
- return idkit_wasm_exports.signRequest(action, signingKeyHex, ttlBigInt);
2094
- }
2095
-
2096
- // src/lib/hashing.ts
2097
- function hashSignal2(signal) {
2098
- return idkit_wasm_exports.hashSignal(signal);
2367
+ const keyHex = signingKeyHex.startsWith("0x") ? signingKeyHex.slice(2) : signingKeyHex;
2368
+ if (!/^[0-9a-fA-F]+$/.test(keyHex)) {
2369
+ throw new Error("Invalid signing key: contains non-hex characters");
2370
+ }
2371
+ if (keyHex.length !== 64) {
2372
+ throw new Error(
2373
+ `Invalid signing key: expected 32 bytes (64 hex chars), got ${keyHex.length / 2} bytes`
2374
+ );
2375
+ }
2376
+ const privKey = secp256k1.etc.hexToBytes(keyHex);
2377
+ const randomBytes = crypto.getRandomValues(new Uint8Array(32));
2378
+ const nonceBytes = hashToField(randomBytes);
2379
+ const createdAt = Math.floor(Date.now() / 1e3);
2380
+ const expiresAt = createdAt + ttl;
2381
+ const message = computeRpSignatureMessage(nonceBytes, createdAt, expiresAt);
2382
+ const msgHash = sha3.keccak_256(message);
2383
+ const recSig = secp256k1.sign(msgHash, privKey);
2384
+ const compact = recSig.toCompactRawBytes();
2385
+ const sig65 = new Uint8Array(65);
2386
+ sig65.set(compact, 0);
2387
+ sig65[64] = recSig.recovery + 27;
2388
+ return {
2389
+ sig: "0x" + utils.bytesToHex(sig65),
2390
+ nonce: "0x" + utils.bytesToHex(nonceBytes),
2391
+ createdAt,
2392
+ expiresAt
2393
+ };
2099
2394
  }
2100
2395
 
2101
- exports.CredentialRequest = CredentialRequest;
2102
2396
  exports.IDKit = IDKit;
2103
2397
  exports.IDKitErrorCodes = IDKitErrorCodes;
2104
- exports.all = all;
2105
- exports.any = any;
2106
2398
  exports.documentLegacy = documentLegacy;
2107
2399
  exports.hashSignal = hashSignal2;
2108
2400
  exports.isNode = isNode;