@gurge/sdk 0.3.23 → 0.3.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/common/src/data-structures/Hinkal/hinkalWithdraw.cjs +1 -1
  2. package/common/src/data-structures/Hinkal/hinkalWithdraw.d.ts +1 -3
  3. package/common/src/data-structures/Hinkal/hinkalWithdraw.mjs +22 -30
  4. package/common/src/data-structures/MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.cjs +1 -1
  5. package/common/src/data-structures/MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.mjs +42 -26
  6. package/common/src/functions/pre-transaction/buildCommitmentValidationData.cjs +1 -1
  7. package/common/src/functions/pre-transaction/buildCommitmentValidationData.mjs +49 -38
  8. package/common/src/functions/pre-transaction/outputUtxoProcessing.cjs +1 -1
  9. package/common/src/functions/pre-transaction/outputUtxoProcessing.mjs +25 -20
  10. package/common/src/functions/snarkjs/constructGeneralZkProof.cjs +1 -1
  11. package/common/src/functions/snarkjs/constructGeneralZkProof.mjs +65 -70
  12. package/common/src/functions/snarkjs/generateMainAndCommitmentZkProof.cjs +1 -1
  13. package/common/src/functions/snarkjs/generateMainAndCommitmentZkProof.mjs +10 -21
  14. package/common/src/functions/snarkjs/generateZkProof.cjs +1 -1
  15. package/common/src/functions/snarkjs/generateZkProof.mjs +12 -23
  16. package/common/src/functions/snarkjs/generateZkProofEnclave.cjs +1 -1
  17. package/common/src/functions/snarkjs/generateZkProofEnclave.mjs +11 -14
  18. package/common/src/functions/snarkjs/generateZkProofSelf.cjs +1 -1
  19. package/common/src/functions/snarkjs/generateZkProofSelf.mjs +14 -20
  20. package/common/src/functions/utils/hinkalTiming.utils.cjs +1 -1
  21. package/common/src/functions/utils/hinkalTiming.utils.d.ts +4 -2
  22. package/common/src/functions/utils/hinkalTiming.utils.mjs +13 -10
  23. package/common/src/functions/web3/events/getInputUtxoAndBalance.cjs +1 -1
  24. package/common/src/functions/web3/events/getInputUtxoAndBalance.mjs +82 -35
  25. package/common/src/webworker/package.json +1 -1
  26. package/common/src/webworker/performTaskWithWorker.cjs +1 -1
  27. package/common/src/webworker/performTaskWithWorker.mjs +14 -14
  28. package/common/src/webworker/viteWorkerURL.constant.cjs +3 -3
  29. package/common/src/webworker/viteWorkerURL.constant.mjs +3 -3
  30. package/package.json +1 -1
  31. package/react-native/HinkalWebViewWorker.cjs +16 -4
  32. package/react-native/HinkalWebViewWorker.mjs +69 -49
  33. package/react-native/bridge/HinkalRNWorker.cjs +1 -1
  34. package/react-native/bridge/HinkalRNWorker.d.ts +1 -0
  35. package/react-native/bridge/HinkalRNWorker.mjs +16 -11
  36. package/sdk/package.json.cjs +1 -1
  37. package/sdk/package.json.mjs +1 -1
@@ -9,31 +9,53 @@ import { getInputUtxosEnclave as u } from "./getInputUtxosEnclave.mjs";
9
9
  import { hashEthereumAddress as d } from "../../utils/addresses.mjs";
10
10
  import { getScheduledTransactionsNullifierIndexes as f } from "../../../API/scheduled-transactions-calls.mjs";
11
11
  import { addressToHexFormat as p } from "../../utils/tron.utils.mjs";
12
- import { Mutex as m } from "async-mutex";
12
+ import { createRnDeltaTiming as m } from "../../utils/hinkalTiming.utils.mjs";
13
+ import { Mutex as h } from "async-mutex";
13
14
  //#region libs/shared/common/src/functions/web3/events/getInputUtxoAndBalance.ts
14
- var h = new m(), g = async (e, t) => e.allowParallelBalanceLocalDecryption ? t() : h.runExclusive(t), _ = async (e, t, n, r, a, o, c, l, u) => g(e, async () => {
15
+ var g = new h(), _ = async (e, t) => {
16
+ if (e.allowParallelBalanceLocalDecryption) return t();
17
+ let n = m("utxoPrep.mutex");
18
+ return g.isLocked() && n.log("waiting-for-lock"), g.runExclusive(async () => {
19
+ n.log("lock-acquired");
20
+ try {
21
+ return await t();
22
+ } finally {
23
+ n.log("lock-released");
24
+ }
25
+ });
26
+ }, v = async (e, t, n, r, a, o, c, l, u) => _(e, async () => {
27
+ let d = m("utxoPrep.decrypt");
15
28
  u += 1;
16
- let d = o.slice(u), { lastOutput: f, additionalEncryptedOutputs: p } = await e.utxoUtils.batchProcess(d, l, t, n), m = [...c, ...p];
17
- return await i(e, r), s({
18
- lastOutput: f,
19
- encryptedOutputs: m
20
- }, e, n, a), await e.utxoUtils.buildBatchProcess(m, t, n);
21
- }), v = async (e, t, n, r) => {
29
+ let f = o.slice(u);
30
+ d.log("batchProcess-start", {
31
+ outputsSlice: f.length,
32
+ cached: c.length
33
+ });
34
+ let { lastOutput: p, additionalEncryptedOutputs: h } = await e.utxoUtils.batchProcess(f, l, t, n);
35
+ d.log("batchProcess-done", { additionalEncryptedOutputs: h.length });
36
+ let g = [...c, ...h], _ = m("wallet.checkAddress");
37
+ await i(e, r), _.log("during-decrypt"), s({
38
+ lastOutput: p,
39
+ encryptedOutputs: g
40
+ }, e, n, a), d.log("cache-write", { encryptedOutputs: g.length });
41
+ let v = await e.utxoUtils.buildBatchProcess(g, t, n);
42
+ return d.log("buildBatchProcess-done", { utxoCount: v.length }), v;
43
+ }), y = async (e, t, n, r) => {
22
44
  let { utxos: i, encryptedOutputs: a, lastOutput: o } = await u(e, n, t);
23
45
  return s({
24
46
  encryptedOutputs: a,
25
47
  lastOutput: o
26
48
  }, e, n, r), i;
27
- }, y = async (e, t, n, r, i, a, o, s, c) => {
49
+ }, b = async (e, t, n, r, i, a, o, s, c) => {
28
50
  try {
29
- return await v(e, t, n, i);
51
+ return await y(e, t, n, i);
30
52
  } catch {
31
- return _(e, t, n, r, i, a, o, s, c);
53
+ return v(e, t, n, r, i, a, o, s, c);
32
54
  }
33
- }, b = (e) => {
55
+ }, x = (e) => {
34
56
  if (Array.isArray(e)) return e;
35
57
  if (e !== void 0) return [e];
36
- }, x = async (e, t, n) => await e.utxoUtils.batchFilterUtxosWithNullifier(t, n), S = (e, t, n, i, a, o, s, c) => {
58
+ }, S = async (e, t, n) => await e.utxoUtils.batchFilterUtxosWithNullifier(t, n), C = (e, t, n, i, a, o, s, c) => {
37
59
  for (e.sort((e, t) => e.amount <= t.amount ? 1 : -1); e.length < t || e.length > t && e.length < 6;) if (e.push(new r({
38
60
  amount: 0n,
39
61
  erc20TokenAddress: o,
@@ -42,17 +64,42 @@ var h = new m(), g = async (e, t) => e.allowParallelBalanceLocalDecryption ? t()
42
64
  spendingPublicKey: a,
43
65
  isNewStyle: !0
44
66
  })), n) for (; e.length > 6;) e.splice(e.length - 1);
45
- }, C = async ({ hinkal: e, chainId: t, passedShieldedPublicKey: n = void 0, ethAddress: r = void 0, resetCacheBefore: s = !1, allowRemoteDecryption: c = !1, useBlockedUtxos: l = !1 }) => {
46
- let u = r ?? await e.getEthereumAddress(), d = n ?? e.userKeys.getShieldedPublicKey(), { userKeys: f } = e, p = e.encryptedOutputsByChain[t], m = e.nullifiersByChain[t], h = Array.from(p);
47
- s && o(e, t, d);
48
- let { encryptedOutputs: g, lastOutput: v } = a(e, t, d);
49
- await i(e, u);
50
- let b = v !== "", S = h.findIndex((e) => e.value === v), C = S > -1, w = !b && S === -1, T = e.areMerkleTreeUpdatesDisabled(), E = !T && (C || !c && w), D = !T && c && w, O = !E && !D, k = [];
51
- E ? k = await _(e, f, t, u, d, h, g, v, S) : D ? k = await y(e, f, t, u, d, h, g, v, S) : O && (k = await e.utxoUtils.buildBatchProcess(g, f, t)), await i(e, u);
52
- let A = await x(e, k, m);
53
- return { inputUtxos: l ? A.filter((e) => e.isBlocked) : A.filter((e) => !e.isBlocked) };
54
- }, w = async ({ hinkal: e, chainId: n, passedShieldedPublicKey: r = void 0, ethAddress: i = void 0, resetCacheBefore: a = !1, allowRemoteDecryption: o = !1 }) => {
55
- let s = i ?? await e.getEthereumAddressByChain(n), c = d(t(n) ? p(s) : s), { inputUtxos: l } = await C({
67
+ }, w = async ({ hinkal: e, chainId: t, passedShieldedPublicKey: n = void 0, ethAddress: r = void 0, resetCacheBefore: s = !1, allowRemoteDecryption: c = !1, useBlockedUtxos: l = !1 }) => {
68
+ let u = m("utxoPrep");
69
+ u.log("start");
70
+ let d = r;
71
+ d ? u.log("wallet.getEthereumAddress-skipped", { ethAddressPassed: !0 }) : (d = await e.getEthereumAddress(), u.log("wallet.getEthereumAddress"));
72
+ let f = n ?? e.userKeys.getShieldedPublicKey(), { userKeys: p } = e, h = e.encryptedOutputsByChain[t], g = e.nullifiersByChain[t], _ = Array.from(h);
73
+ s && o(e, t, f);
74
+ let { encryptedOutputs: y, lastOutput: x } = a(e, t, f);
75
+ u.log("cache.read", { cachedEncryptedOutputs: y.length });
76
+ let C = m("wallet.checkAddress");
77
+ await i(e, d), C.log("before-decrypt");
78
+ let w = x !== "", T = _.findIndex((e) => e.value === x);
79
+ u.log("findLastOutputIndex", {
80
+ hinkalOutputs: _.length,
81
+ lastOutputIndex: T
82
+ });
83
+ let E = T > -1, D = !w && T === -1, O = e.areMerkleTreeUpdatesDisabled(), k = !O && (E || !c && D), A = !O && c && D, j = !k && !A;
84
+ u.log("branch", {
85
+ decryptLocally: k,
86
+ decryptRemotely: A,
87
+ useCache: j,
88
+ outputsSlice: T > -1 ? _.length - (T + 1) : 0
89
+ });
90
+ let M = [];
91
+ k ? (M = await v(e, p, t, d, f, _, y, x, T), u.log("decryptLocally-done", { utxoCount: M.length })) : A ? (M = await b(e, p, t, d, f, _, y, x, T), u.log("decryptRemotely-done", { utxoCount: M.length })) : j && (M = await e.utxoUtils.buildBatchProcess(y, p, t), u.log("useCache-buildBatchProcess-done", { utxoCount: M.length }));
92
+ let N = m("wallet.checkAddress");
93
+ await i(e, d), N.log("after-decrypt");
94
+ let P = await S(e, M, g);
95
+ u.log("filterSpentUtxos", {
96
+ allUtxos: M.length,
97
+ inputUtxos: P.length
98
+ });
99
+ let F = l ? P.filter((e) => e.isBlocked) : P.filter((e) => !e.isBlocked);
100
+ return u.log("done", { inputUtxos: F.length }), { inputUtxos: F };
101
+ }, T = async ({ hinkal: e, chainId: n, passedShieldedPublicKey: r = void 0, ethAddress: i = void 0, resetCacheBefore: a = !1, allowRemoteDecryption: o = !1 }) => {
102
+ let s = i ?? await e.getEthereumAddressByChain(n), c = d(t(n) ? p(s) : s), { inputUtxos: l } = await w({
56
103
  hinkal: e,
57
104
  chainId: n,
58
105
  passedShieldedPublicKey: r,
@@ -67,15 +114,15 @@ var h = new m(), g = async (e, t) => e.allowParallelBalanceLocalDecryption ? t()
67
114
  nullifiers: l.map((e) => e.getNullifier())
68
115
  });
69
116
  return { inputUtxos: u.map((e) => l[e]).filter((e) => !!e) };
70
- }, T = async ({ hinkal: t, tokenWithId: r, minInput: i = 2, sliceIfMore6: a = !0, chainId: o, passedShieldedPrivateKey: s = void 0, passedShieldedPublicKey: u = void 0, ethAddress: d = void 0, resetCacheBefore: f = !1, ensuredTokensWithId: p, allowRemoteDecryption: m = !1, useBlockedUtxos: h = !1 }) => {
71
- let g = s ?? t.userKeys.getShieldedPrivateKey(), _ = t.userKeys.getSpendingKeyPair().pubSpendingBJJPoint, { inputUtxos: v } = h ? await w({
117
+ }, E = async ({ hinkal: t, tokenWithId: r, minInput: i = 2, sliceIfMore6: a = !0, chainId: o, passedShieldedPrivateKey: s = void 0, passedShieldedPublicKey: u = void 0, ethAddress: d = void 0, resetCacheBefore: f = !1, ensuredTokensWithId: p, allowRemoteDecryption: m = !1, useBlockedUtxos: h = !1 }) => {
118
+ let g = s ?? t.userKeys.getShieldedPrivateKey(), _ = t.userKeys.getSpendingKeyPair().pubSpendingBJJPoint, { inputUtxos: v } = h ? await T({
72
119
  hinkal: t,
73
120
  chainId: o,
74
121
  ethAddress: d,
75
122
  passedShieldedPrivateKey: s,
76
123
  resetCacheBefore: f,
77
124
  allowRemoteDecryption: m
78
- }) : await C({
125
+ }) : await w({
79
126
  hinkal: t,
80
127
  tokenWithId: r,
81
128
  minInput: i,
@@ -86,27 +133,27 @@ var h = new m(), g = async (e, t) => e.allowParallelBalanceLocalDecryption ? t()
86
133
  ethAddress: d,
87
134
  resetCacheBefore: f,
88
135
  allowRemoteDecryption: m
89
- }), y = b(r), x = /* @__PURE__ */ new Map();
136
+ }), y = x(r), b = /* @__PURE__ */ new Map();
90
137
  v.forEach((e) => {
91
138
  let t = e.getTokenAddress(o);
92
139
  if (y && !y.some((e) => n(e.erc20TokenAddress, t))) return;
93
140
  let r = c(o, {
94
141
  erc20TokenAddress: t,
95
142
  tokenId: 0
96
- }), i = x.get(r) ?? [];
97
- x.set(r, [...i, e]);
143
+ }), i = b.get(r) ?? [];
144
+ b.set(r, [...i, e]);
98
145
  }), p?.forEach((e) => {
99
146
  let t = c(o, {
100
147
  erc20TokenAddress: e.erc20TokenAddress,
101
148
  tokenId: 0
102
149
  });
103
- x.set(t, x.get(t) ?? []);
150
+ b.set(t, b.get(t) ?? []);
104
151
  });
105
- for (let [t, n] of x) {
152
+ for (let [t, n] of b) {
106
153
  let r = t.split("-")[0], s = Number(t.split("-")[1]), c = e(o), u = c ? r : void 0;
107
- S(n, i, a, g, _, c ? l(r).compressedAddress.toLowerCase() : r.toLowerCase(), s, u);
154
+ C(n, i, a, g, _, c ? l(r).compressedAddress.toLowerCase() : r.toLowerCase(), s, u);
108
155
  }
109
- return x;
156
+ return b;
110
157
  };
111
158
  //#endregion
112
- export { y as attemptGetInputUtxosRemotely, C as getInputUtxoAndBalance, w as getInputUtxoAndBalanceOfStuckUtxos, T as getInputUtxoAndBalancePerToken, v as getInputUtxosRemotely };
159
+ export { b as attemptGetInputUtxosRemotely, w as getInputUtxoAndBalance, T as getInputUtxoAndBalanceOfStuckUtxos, E as getInputUtxoAndBalancePerToken, y as getInputUtxosRemotely };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gurge/sdk",
3
- "version": "0.3.23",
3
+ "version": "0.3.25",
4
4
  "homepage": "hinkal.io",
5
5
  "author": {
6
6
  "name": "Hinkal Protocol"
@@ -1 +1 @@
1
- const e=require(`../constants/vite.constants.cjs`),t=require(`../constants/chains.constants.cjs`),n=require(`./workerFactory.cjs`),r=require(`../functions/utils/hinkalTiming.utils.cjs`);var i=async i=>{let a=r.createHinkalTiming(`worker:${i.type}`),o=await n.WorkerFactory.getWebWorker(i.type);return a.log(`spawned`),new Promise((n,r)=>{let s={};if(typeof window<`u`&&window.location){let{origin:e,protocol:t,host:n,port:r,hostname:i,href:a}=window.location;s={origin:e,protocol:t,host:n,port:r,hostname:i,href:a}}o.onMessage(e=>{a.log(`completed`),n(e),o.terminate()}),o.onError(e=>{a.log(`error`),r(e),o.terminate()});let c={payload:i.payload,metadata:{hostLocation:s,constants:{chains:{chainIds:t.chainIds},isDevelopment:e.isDevelopment}}};o.postMessage(c)})};exports.performTaskWithWorker=i;
1
+ const e=require(`../constants/vite.constants.cjs`),t=require(`../constants/chains.constants.cjs`),n=require(`../functions/utils/hinkalTiming.utils.cjs`),r=require(`./workerFactory.cjs`);var i=async i=>{let a=i.payload?.type??`unknown`,o=n.createRnDeltaTiming(`webView.task:${i.type}:${a}`),s=await r.WorkerFactory.getWebWorker(i.type);return o.log(`rn-worker-created`),new Promise((n,r)=>{let a={};if(typeof window<`u`&&window.location){let{origin:e,protocol:t,host:n,port:r,hostname:i,href:o}=window.location;a={origin:e,protocol:t,host:n,port:r,hostname:i,href:o}}s.onMessage(e=>{o.log(`rn-result-received`),n(e),s.terminate()}),s.onError(e=>{o.log(`rn-error`),r(e),s.terminate()});let c={payload:i.payload,metadata:{hostLocation:a,constants:{chains:{chainIds:t.chainIds},isDevelopment:e.isDevelopment}}};s.postMessage(c),o.log(`rn-postMessage-sent`)})};exports.performTaskWithWorker=i;
@@ -1,39 +1,39 @@
1
1
  import { isDevelopment as e } from "../constants/vite.constants.mjs";
2
2
  import { chainIds as t } from "../constants/chains.constants.mjs";
3
- import { WorkerFactory as n } from "./workerFactory.mjs";
4
- import { createHinkalTiming as r } from "../functions/utils/hinkalTiming.utils.mjs";
3
+ import { createRnDeltaTiming as n } from "../functions/utils/hinkalTiming.utils.mjs";
4
+ import { WorkerFactory as r } from "./workerFactory.mjs";
5
5
  //#region libs/shared/common/src/webworker/performTaskWithWorker.ts
6
6
  var i = async (i) => {
7
- let a = r(`worker:${i.type}`), o = await n.getWebWorker(i.type);
8
- return a.log("spawned"), new Promise((n, r) => {
9
- let s = {};
7
+ let a = i.payload?.type ?? "unknown", o = n(`webView.task:${i.type}:${a}`), s = await r.getWebWorker(i.type);
8
+ return o.log("rn-worker-created"), new Promise((n, r) => {
9
+ let a = {};
10
10
  if (typeof window < "u" && window.location) {
11
- let { origin: e, protocol: t, host: n, port: r, hostname: i, href: a } = window.location;
12
- s = {
11
+ let { origin: e, protocol: t, host: n, port: r, hostname: i, href: o } = window.location;
12
+ a = {
13
13
  origin: e,
14
14
  protocol: t,
15
15
  host: n,
16
16
  port: r,
17
17
  hostname: i,
18
- href: a
18
+ href: o
19
19
  };
20
20
  }
21
- o.onMessage((e) => {
22
- a.log("completed"), n(e), o.terminate();
23
- }), o.onError((e) => {
24
- a.log("error"), r(e), o.terminate();
21
+ s.onMessage((e) => {
22
+ o.log("rn-result-received"), n(e), s.terminate();
23
+ }), s.onError((e) => {
24
+ o.log("rn-error"), r(e), s.terminate();
25
25
  });
26
26
  let c = {
27
27
  payload: i.payload,
28
28
  metadata: {
29
- hostLocation: s,
29
+ hostLocation: a,
30
30
  constants: {
31
31
  chains: { chainIds: t },
32
32
  isDevelopment: e
33
33
  }
34
34
  }
35
35
  };
36
- o.postMessage(c);
36
+ s.postMessage(c), o.log("rn-postMessage-sent");
37
37
  });
38
38
  };
39
39
  //#endregion
@@ -14,8 +14,8 @@
14
14
  var e = /* @__PURE__ */ ((r) => (r.ZKProof = "ZKProof", r.SnarkJS = "SnarkJS", r.UTXO = "UTXO", r))(e || {});
15
15
 
16
16
  const n = async () => ({
17
- [e.ZKProof]: await getWorkerURL(domain + '/0.3.23/' + 'zkProofWorkerLauncher.js'),
18
- [e.SnarkJS]: await getWorkerURL(domain + '/0.3.23/' + 'snarkjsWorkerLauncher.js'),
19
- [e.UTXO]: await getWorkerURL(domain + '/0.3.23/' + 'utxoWorkerLauncher.js'),
17
+ [e.ZKProof]: await getWorkerURL(domain + '/0.3.25/' + 'zkProofWorkerLauncher.js'),
18
+ [e.SnarkJS]: await getWorkerURL(domain + '/0.3.25/' + 'snarkjsWorkerLauncher.js'),
19
+ [e.UTXO]: await getWorkerURL(domain + '/0.3.25/' + 'utxoWorkerLauncher.js'),
20
20
  });
21
21
  exports.getWorkerViteURL = n;
@@ -14,8 +14,8 @@
14
14
  var e = /* @__PURE__ */ ((r) => (r.ZKProof = "ZKProof", r.SnarkJS = "SnarkJS", r.UTXO = "UTXO", r))(e || {});
15
15
 
16
16
  const n = async () => ({
17
- [e.ZKProof]: await getWorkerURL(domain + '/0.3.23/' + 'zkProofWorkerLauncher.js'),
18
- [e.SnarkJS]: await getWorkerURL(domain + '/0.3.23/' + 'snarkjsWorkerLauncher.js'),
19
- [e.UTXO]: await getWorkerURL(domain + '/0.3.23/' + 'utxoWorkerLauncher.js'),
17
+ [e.ZKProof]: await getWorkerURL(domain + '/0.3.25/' + 'zkProofWorkerLauncher.js'),
18
+ [e.SnarkJS]: await getWorkerURL(domain + '/0.3.25/' + 'snarkjsWorkerLauncher.js'),
19
+ [e.UTXO]: await getWorkerURL(domain + '/0.3.25/' + 'utxoWorkerLauncher.js'),
20
20
  });
21
21
  export { n as getWorkerViteURL };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gurge/sdk",
3
- "version": "0.3.23",
3
+ "version": "0.3.25",
4
4
  "homepage": "hinkal.io",
5
5
  "author": {
6
6
  "name": "Hinkal Protocol"
@@ -1,7 +1,7 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../common/src/webworker/workerFactory.cjs`),t=require(`./workerCDNUrls.cjs`),n=require(`./bridge/serialization.utils.cjs`),r=require(`./bridge/HinkalRNWorker.cjs`);let i=require(`react`),a=require(`react-native`),o=require(`react-native-webview`),s=require(`react/jsx-runtime`);var c=`${new URL(Object.values(t.WORKER_CDN_URLS)[0]).origin}/`;e.WorkerFactory.rnWorkerFactory=e=>new r.HinkalRNWorker(e);var l=`
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../common/src/functions/utils/hinkalTiming.utils.cjs`),t=require(`../common/src/webworker/workerFactory.cjs`),n=require(`./workerCDNUrls.cjs`),r=require(`./bridge/serialization.utils.cjs`),i=require(`./bridge/HinkalRNWorker.cjs`);let a=require(`react`),o=require(`react-native`),s=require(`react-native-webview`),c=require(`react/jsx-runtime`);var l=`${new URL(Object.values(n.WORKER_CDN_URLS)[0]).origin}/`;t.WorkerFactory.rnWorkerFactory=e=>new i.HinkalRNWorker(e);var u=`
2
2
  if (!window.__hinkalPageBoot) (function(){
3
3
  window.__hinkalPageBoot = true;
4
- var URLS = ${JSON.stringify(t.WORKER_CDN_URLS)};
4
+ var URLS = ${JSON.stringify(n.WORKER_CDN_URLS)};
5
5
  var BLOBS = {};
6
6
 
7
7
  function replacer(_key, value){
@@ -22,6 +22,9 @@ if (!window.__hinkalPageBoot) (function(){
22
22
  var out = {}; for (var i = 0; i < keys.length; i++) out[keys[i]] = revive(value[keys[i]]); return out;
23
23
  }
24
24
  function post(payload){ try { window.ReactNativeWebView.postMessage(JSON.stringify(payload, replacer)); } catch(_){} }
25
+ function postPhase(requestId, variant, phase, t0){
26
+ post({ type: 'TIMING', requestId: requestId, variant: variant, phase: phase, ms: Date.now() - t0 });
27
+ }
25
28
  function describe(error){
26
29
  if (!error) return 'worker error';
27
30
  if (error.message) return error.message;
@@ -60,10 +63,17 @@ if (!window.__hinkalPageBoot) (function(){
60
63
  var variant = envelope && envelope.variant;
61
64
  var message = revive(envelope && envelope.message);
62
65
  var url = URLS[variant];
66
+ var t0 = Date.now();
67
+ postPhase(requestId, variant, 'handleMessage-start', t0);
63
68
  if (!url) return post({ requestId: requestId, type: 'ERROR', error: 'Unknown variant: ' + variant });
64
69
 
65
70
  var worker;
66
- try { worker = spawn(await blobUrl(url)); }
71
+ try {
72
+ var blob = await blobUrl(url);
73
+ postPhase(requestId, variant, 'cdn-blob-ready', t0);
74
+ worker = spawn(blob);
75
+ postPhase(requestId, variant, 'inner-worker-spawned', t0);
76
+ }
67
77
  catch (error) { return post({ requestId: requestId, type: 'ERROR', error: 'spawn failed: ' + describe(error) }); }
68
78
 
69
79
  var done = false, ready = false, pending = message;
@@ -74,6 +84,7 @@ if (!window.__hinkalPageBoot) (function(){
74
84
  if (data && typeof data === 'object') {
75
85
  if (data.__hinkalWorkerReady) {
76
86
  ready = true;
87
+ postPhase(requestId, variant, 'inner-worker-ready', t0);
77
88
  try { worker.postMessage(pending); pending = null; }
78
89
  catch (error) { post({ requestId: requestId, type: 'ERROR', error: 'postMessage failed: ' + describe(error) }); finish(); }
79
90
  return;
@@ -85,6 +96,7 @@ if (!window.__hinkalPageBoot) (function(){
85
96
  }
86
97
  }
87
98
  post({ requestId: requestId, type: 'RESULT', data: data });
99
+ postPhase(requestId, variant, 'inner-worker-done', t0);
88
100
  finish();
89
101
  };
90
102
  worker.onerror = function(event){
@@ -95,4 +107,4 @@ if (!window.__hinkalPageBoot) (function(){
95
107
 
96
108
  post({ type: 'READY' });
97
109
  })();
98
- true;`,u=`<!DOCTYPE html><html><head><meta charset="utf-8"/></head><body><script>${l}<\/script></body></html>`,d=a.StyleSheet.create({hiddenHost:{position:`absolute`,height:1,width:1,left:-9999,top:-9999,opacity:0}}),f=()=>{let e=(0,i.useRef)(null),t=(0,i.useRef)({ready:!1,queue:[]}),r=(0,i.useCallback)((t,r,i)=>{let o;try{o=JSON.stringify({requestId:t,variant:r,message:i},n.bigIntReplacer)}catch(e){a.DeviceEventEmitter.emit(`FROM_WEBVIEW_WORKER`,{requestId:t,type:`ERROR`,error:`serialize failed: ${e?.message??e}`});return}e.current?.injectJavaScript(`window.handleMessage && window.handleMessage(${o}); true;`)},[]);(0,i.useEffect)(()=>{let e=a.DeviceEventEmitter.addListener(`TO_WEBVIEW_WORKER`,e=>{let n={requestId:e?.__requestId??``,variant:e?.variant??``,message:e?.message};t.current.ready?r(n.requestId,n.variant,n.message):t.current.queue.push(n)});return()=>e.remove()},[r]);let f=(0,i.useCallback)(e=>{let i;try{i=n.reviveBigInts(JSON.parse(e.nativeEvent.data))}catch(e){a.DeviceEventEmitter.emit(`FROM_WEBVIEW_WORKER`,{type:`ERROR`,error:e?.message??`parse error`});return}if(i?.type===`READY`){t.current.ready=!0;let e=t.current.queue;t.current.queue=[],e.forEach(({requestId:e,variant:t,message:n})=>r(e,t,n));return}a.DeviceEventEmitter.emit(`FROM_WEBVIEW_WORKER`,i)},[r]);return(0,s.jsx)(a.View,{pointerEvents:`none`,style:d.hiddenHost,children:(0,s.jsx)(o.WebView,{ref:e,source:{html:u,baseUrl:c},originWhitelist:[`*`],javaScriptEnabled:!0,domStorageEnabled:!0,androidLayerType:`hardware`,onMessage:f,onLoad:()=>e.current?.injectJavaScript(l)})})};module.exports=f;
110
+ true;`,d=`<!DOCTYPE html><html><head><meta charset="utf-8"/></head><body><script>${u}<\/script></body></html>`,f=o.StyleSheet.create({hiddenHost:{position:`absolute`,height:1,width:1,left:-9999,top:-9999,opacity:0}}),p=()=>{let t=(0,a.useRef)(null),n=(0,a.useRef)({ready:!1,queue:[]}),i=(0,a.useCallback)((e,n,i)=>{let a;try{a=JSON.stringify({requestId:e,variant:n,message:i},r.bigIntReplacer)}catch(t){o.DeviceEventEmitter.emit(`FROM_WEBVIEW_WORKER`,{requestId:e,type:`ERROR`,error:`serialize failed: ${t?.message??t}`});return}t.current?.injectJavaScript(`window.handleMessage && window.handleMessage(${a}); true;`)},[]);(0,a.useEffect)(()=>{let e=o.DeviceEventEmitter.addListener(`TO_WEBVIEW_WORKER`,e=>{let t={requestId:e?.__requestId??``,variant:e?.variant??``,message:e?.message};n.current.ready?i(t.requestId,t.variant,t.message):n.current.queue.push(t)});return()=>e.remove()},[i]);let p=(0,a.useCallback)(t=>{let a;try{a=r.reviveBigInts(JSON.parse(t.nativeEvent.data))}catch(e){o.DeviceEventEmitter.emit(`FROM_WEBVIEW_WORKER`,{type:`ERROR`,error:e?.message??`parse error`});return}if(a?.type===`READY`){n.current.ready=!0;let e=n.current.queue;n.current.queue=[],e.forEach(({requestId:e,variant:t,message:n})=>i(e,t,n));return}if(a?.type===`TIMING`){e.logRnDeltaEvent(`webView.${a.variant}`,a.phase,{requestId:a.requestId,ms:a.ms});return}o.DeviceEventEmitter.emit(`FROM_WEBVIEW_WORKER`,a)},[i]);return(0,c.jsx)(o.View,{pointerEvents:`none`,style:f.hiddenHost,children:(0,c.jsx)(s.WebView,{ref:t,source:{html:d,baseUrl:l},originWhitelist:[`*`],javaScriptEnabled:!0,domStorageEnabled:!0,androidLayerType:`hardware`,onMessage:p,onLoad:()=>t.current?.injectJavaScript(u)})})};module.exports=p;
@@ -1,18 +1,19 @@
1
- import { WorkerFactory as e } from "../common/src/webworker/workerFactory.mjs";
2
- import { WORKER_CDN_URLS as t } from "./workerCDNUrls.mjs";
3
- import { bigIntReplacer as n, reviveBigInts as r } from "./bridge/serialization.utils.mjs";
4
- import { HinkalRNWorker as i } from "./bridge/HinkalRNWorker.mjs";
5
- import { useCallback as a, useEffect as o, useRef as s } from "react";
6
- import { DeviceEventEmitter as c, StyleSheet as l, View as u } from "react-native";
7
- import { WebView as d } from "react-native-webview";
8
- import { jsx as f } from "react/jsx-runtime";
1
+ import { logRnDeltaEvent as e } from "../common/src/functions/utils/hinkalTiming.utils.mjs";
2
+ import { WorkerFactory as t } from "../common/src/webworker/workerFactory.mjs";
3
+ import { WORKER_CDN_URLS as n } from "./workerCDNUrls.mjs";
4
+ import { bigIntReplacer as r, reviveBigInts as i } from "./bridge/serialization.utils.mjs";
5
+ import { HinkalRNWorker as a } from "./bridge/HinkalRNWorker.mjs";
6
+ import { useCallback as o, useEffect as s, useRef as c } from "react";
7
+ import { DeviceEventEmitter as l, StyleSheet as u, View as d } from "react-native";
8
+ import { WebView as f } from "react-native-webview";
9
+ import { jsx as p } from "react/jsx-runtime";
9
10
  //#region libs/shared/sdk/src/react-native/HinkalWebViewWorker.tsx
10
- var p = `${new URL(Object.values(t)[0]).origin}/`;
11
- e.rnWorkerFactory = (e) => new i(e);
12
- var m = `
11
+ var m = `${new URL(Object.values(n)[0]).origin}/`;
12
+ t.rnWorkerFactory = (e) => new a(e);
13
+ var h = `
13
14
  if (!window.__hinkalPageBoot) (function(){
14
15
  window.__hinkalPageBoot = true;
15
- var URLS = ${JSON.stringify(t)};
16
+ var URLS = ${JSON.stringify(n)};
16
17
  var BLOBS = {};
17
18
 
18
19
  function replacer(_key, value){
@@ -33,6 +34,9 @@ if (!window.__hinkalPageBoot) (function(){
33
34
  var out = {}; for (var i = 0; i < keys.length; i++) out[keys[i]] = revive(value[keys[i]]); return out;
34
35
  }
35
36
  function post(payload){ try { window.ReactNativeWebView.postMessage(JSON.stringify(payload, replacer)); } catch(_){} }
37
+ function postPhase(requestId, variant, phase, t0){
38
+ post({ type: 'TIMING', requestId: requestId, variant: variant, phase: phase, ms: Date.now() - t0 });
39
+ }
36
40
  function describe(error){
37
41
  if (!error) return 'worker error';
38
42
  if (error.message) return error.message;
@@ -58,10 +62,17 @@ if (!window.__hinkalPageBoot) (function(){
58
62
  var variant = envelope && envelope.variant;
59
63
  var message = revive(envelope && envelope.message);
60
64
  var url = URLS[variant];
65
+ var t0 = Date.now();
66
+ postPhase(requestId, variant, 'handleMessage-start', t0);
61
67
  if (!url) return post({ requestId: requestId, type: 'ERROR', error: 'Unknown variant: ' + variant });
62
68
 
63
69
  var worker;
64
- try { worker = spawn(await blobUrl(url)); }
70
+ try {
71
+ var blob = await blobUrl(url);
72
+ postPhase(requestId, variant, 'cdn-blob-ready', t0);
73
+ worker = spawn(blob);
74
+ postPhase(requestId, variant, 'inner-worker-spawned', t0);
75
+ }
65
76
  catch (error) { return post({ requestId: requestId, type: 'ERROR', error: 'spawn failed: ' + describe(error) }); }
66
77
 
67
78
  var done = false, ready = false, pending = message;
@@ -72,6 +83,7 @@ if (!window.__hinkalPageBoot) (function(){
72
83
  if (data && typeof data === 'object') {
73
84
  if (data.__hinkalWorkerReady) {
74
85
  ready = true;
86
+ postPhase(requestId, variant, 'inner-worker-ready', t0);
75
87
  try { worker.postMessage(pending); pending = null; }
76
88
  catch (error) { post({ requestId: requestId, type: 'ERROR', error: 'postMessage failed: ' + describe(error) }); finish(); }
77
89
  return;
@@ -83,6 +95,7 @@ if (!window.__hinkalPageBoot) (function(){
83
95
  }
84
96
  }
85
97
  post({ requestId: requestId, type: 'RESULT', data: data });
98
+ postPhase(requestId, variant, 'inner-worker-done', t0);
86
99
  finish();
87
100
  };
88
101
  worker.onerror = function(event){
@@ -93,82 +106,89 @@ if (!window.__hinkalPageBoot) (function(){
93
106
 
94
107
  post({ type: 'READY' });
95
108
  })();
96
- true;`, h = `<!DOCTYPE html><html><head><meta charset="utf-8"/></head><body><script>${m}<\/script></body></html>`, g = l.create({ hiddenHost: {
109
+ true;`, g = `<!DOCTYPE html><html><head><meta charset="utf-8"/></head><body><script>${h}<\/script></body></html>`, _ = u.create({ hiddenHost: {
97
110
  position: "absolute",
98
111
  height: 1,
99
112
  width: 1,
100
113
  left: -9999,
101
114
  top: -9999,
102
115
  opacity: 0
103
- } }), _ = () => {
104
- let e = s(null), t = s({
116
+ } }), v = () => {
117
+ let t = c(null), n = c({
105
118
  ready: !1,
106
119
  queue: []
107
- }), i = a((t, r, i) => {
120
+ }), a = o((e, n, i) => {
108
121
  let a;
109
122
  try {
110
123
  a = JSON.stringify({
111
- requestId: t,
112
- variant: r,
124
+ requestId: e,
125
+ variant: n,
113
126
  message: i
114
- }, n);
115
- } catch (e) {
116
- c.emit("FROM_WEBVIEW_WORKER", {
117
- requestId: t,
127
+ }, r);
128
+ } catch (t) {
129
+ l.emit("FROM_WEBVIEW_WORKER", {
130
+ requestId: e,
118
131
  type: "ERROR",
119
- error: `serialize failed: ${e?.message ?? e}`
132
+ error: `serialize failed: ${t?.message ?? t}`
120
133
  });
121
134
  return;
122
135
  }
123
- e.current?.injectJavaScript(`window.handleMessage && window.handleMessage(${a}); true;`);
136
+ t.current?.injectJavaScript(`window.handleMessage && window.handleMessage(${a}); true;`);
124
137
  }, []);
125
- o(() => {
126
- let e = c.addListener("TO_WEBVIEW_WORKER", (e) => {
127
- let n = {
138
+ s(() => {
139
+ let e = l.addListener("TO_WEBVIEW_WORKER", (e) => {
140
+ let t = {
128
141
  requestId: e?.__requestId ?? "",
129
142
  variant: e?.variant ?? "",
130
143
  message: e?.message
131
144
  };
132
- t.current.ready ? i(n.requestId, n.variant, n.message) : t.current.queue.push(n);
145
+ n.current.ready ? a(t.requestId, t.variant, t.message) : n.current.queue.push(t);
133
146
  });
134
147
  return () => e.remove();
135
- }, [i]);
136
- let l = a((e) => {
137
- let n;
148
+ }, [a]);
149
+ let u = o((t) => {
150
+ let r;
138
151
  try {
139
- n = r(JSON.parse(e.nativeEvent.data));
152
+ r = i(JSON.parse(t.nativeEvent.data));
140
153
  } catch (e) {
141
- c.emit("FROM_WEBVIEW_WORKER", {
154
+ l.emit("FROM_WEBVIEW_WORKER", {
142
155
  type: "ERROR",
143
156
  error: e?.message ?? "parse error"
144
157
  });
145
158
  return;
146
159
  }
147
- if (n?.type === "READY") {
148
- t.current.ready = !0;
149
- let e = t.current.queue;
150
- t.current.queue = [], e.forEach(({ requestId: e, variant: t, message: n }) => i(e, t, n));
160
+ if (r?.type === "READY") {
161
+ n.current.ready = !0;
162
+ let e = n.current.queue;
163
+ n.current.queue = [], e.forEach(({ requestId: e, variant: t, message: n }) => a(e, t, n));
164
+ return;
165
+ }
166
+ if (r?.type === "TIMING") {
167
+ e(`webView.${r.variant}`, r.phase, {
168
+ requestId: r.requestId,
169
+ ms: r.ms
170
+ });
151
171
  return;
152
172
  }
153
- c.emit("FROM_WEBVIEW_WORKER", n);
154
- }, [i]);
155
- return /* @__PURE__ */ f(u, {
173
+ l.emit("FROM_WEBVIEW_WORKER", r);
174
+ }, [a]);
175
+ return /* @__PURE__ */ p(d, {
156
176
  pointerEvents: "none",
157
- style: g.hiddenHost,
158
- children: /* @__PURE__ */ f(d, {
159
- ref: e,
177
+ style: _.hiddenHost,
178
+ children: /* @__PURE__ */ p(f, {
179
+ ref: t,
160
180
  source: {
161
- html: h,
162
- baseUrl: p
181
+ html: g,
182
+ baseUrl: m
163
183
  },
164
184
  originWhitelist: ["*"],
165
185
  javaScriptEnabled: !0,
166
186
  domStorageEnabled: !0,
167
187
  androidLayerType: "hardware",
168
- onMessage: l,
169
- onLoad: () => e.current?.injectJavaScript(m)
188
+ onMessage: u,
189
+ onLoad: () => t.current?.injectJavaScript(h)
170
190
  })
171
191
  });
172
192
  };
173
193
  //#endregion
174
- export { _ as default };
194
+ export { v as default };
@@ -1 +1 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./serialization.utils.cjs`);let t=require(`react-native`);var n=class{onmessage=null;onerror=null;requestId=e.nextRequestId();subscription;constructor(e){this.variant=e,this.subscription=t.DeviceEventEmitter.addListener(`FROM_WEBVIEW_WORKER`,e=>{!e||e.requestId!==this.requestId||(e.type===`RESULT`?this.onmessage?.({data:e.data}):e.type===`ERROR`&&this.onerror?.(Error(e.error??`WebView worker error`)))})}postMessage(e){t.DeviceEventEmitter.emit(`TO_WEBVIEW_WORKER`,{__requestId:this.requestId,variant:this.variant,message:e})}terminate(){this.subscription?.remove?.(),this.subscription=null}};exports.HinkalRNWorker=n;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../common/src/functions/utils/hinkalTiming.utils.cjs`),t=require(`./serialization.utils.cjs`);let n=require(`react-native`);var r=class{onmessage=null;onerror=null;requestId=t.nextRequestId();sentAt=0;subscription;constructor(t){this.variant=t,this.subscription=n.DeviceEventEmitter.addListener(`FROM_WEBVIEW_WORKER`,t=>{!t||t.requestId!==this.requestId||(t.type===`RESULT`?(e.logRnDeltaEvent(`rnBridge.${this.variant}`,`round-trip`,{requestId:this.requestId,ms:Date.now()-this.sentAt}),this.onmessage?.({data:t.data})):t.type===`ERROR`&&this.onerror?.(Error(t.error??`WebView worker error`)))})}postMessage(t){this.sentAt=Date.now(),e.logRnDeltaEvent(`rnBridge.${this.variant}`,`postMessage-sent`,{requestId:this.requestId}),n.DeviceEventEmitter.emit(`TO_WEBVIEW_WORKER`,{__requestId:this.requestId,variant:this.variant,message:t})}terminate(){this.subscription?.remove?.(),this.subscription=null}};exports.HinkalRNWorker=r;
@@ -6,6 +6,7 @@ export declare class HinkalRNWorker {
6
6
  }) => void) | null;
7
7
  onerror: ((error: any) => void) | null;
8
8
  private requestId;
9
+ private sentAt;
9
10
  private subscription;
10
11
  constructor(variant: WorkerVariant);
11
12
  postMessage(message: unknown): void;
@@ -1,21 +1,26 @@
1
- import { nextRequestId as e } from "./serialization.utils.mjs";
2
- import { DeviceEventEmitter as t } from "react-native";
1
+ import { logRnDeltaEvent as e } from "../../common/src/functions/utils/hinkalTiming.utils.mjs";
2
+ import { nextRequestId as t } from "./serialization.utils.mjs";
3
+ import { DeviceEventEmitter as n } from "react-native";
3
4
  //#region libs/shared/sdk/src/react-native/bridge/HinkalRNWorker.ts
4
- var n = class {
5
+ var r = class {
5
6
  onmessage = null;
6
7
  onerror = null;
7
- requestId = e();
8
+ requestId = t();
9
+ sentAt = 0;
8
10
  subscription;
9
- constructor(e) {
10
- this.variant = e, this.subscription = t.addListener("FROM_WEBVIEW_WORKER", (e) => {
11
- !e || e.requestId !== this.requestId || (e.type === "RESULT" ? this.onmessage?.({ data: e.data }) : e.type === "ERROR" && this.onerror?.(Error(e.error ?? "WebView worker error")));
11
+ constructor(t) {
12
+ this.variant = t, this.subscription = n.addListener("FROM_WEBVIEW_WORKER", (t) => {
13
+ !t || t.requestId !== this.requestId || (t.type === "RESULT" ? (e(`rnBridge.${this.variant}`, "round-trip", {
14
+ requestId: this.requestId,
15
+ ms: Date.now() - this.sentAt
16
+ }), this.onmessage?.({ data: t.data })) : t.type === "ERROR" && this.onerror?.(Error(t.error ?? "WebView worker error")));
12
17
  });
13
18
  }
14
- postMessage(e) {
15
- t.emit("TO_WEBVIEW_WORKER", {
19
+ postMessage(t) {
20
+ this.sentAt = Date.now(), e(`rnBridge.${this.variant}`, "postMessage-sent", { requestId: this.requestId }), n.emit("TO_WEBVIEW_WORKER", {
16
21
  __requestId: this.requestId,
17
22
  variant: this.variant,
18
- message: e
23
+ message: t
19
24
  });
20
25
  }
21
26
  terminate() {
@@ -23,4 +28,4 @@ var n = class {
23
28
  }
24
29
  };
25
30
  //#endregion
26
- export { n as HinkalRNWorker };
31
+ export { r as HinkalRNWorker };