@getpara/core-sdk 3.0.0 → 3.1.0

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.
@@ -46,7 +46,7 @@ __export(constants_exports, {
46
46
  TRANSACTION_REVIEW_TIMEOUT_MS: () => TRANSACTION_REVIEW_TIMEOUT_MS
47
47
  });
48
48
  module.exports = __toCommonJS(constants_exports);
49
- const PARA_CORE_VERSION = "3.0.0";
49
+ const PARA_CORE_VERSION = "3.1.0";
50
50
  const PREFIX = "@CAPSULE/";
51
51
  const PARA_PREFIX = "@PARA/";
52
52
  const LOCAL_STORAGE_AUTH_INFO = `${PREFIX}authInfo`;
@@ -1,10 +1,24 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
4
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
7
  var __typeError = (msg) => {
6
8
  throw TypeError(msg);
7
9
  };
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
8
22
  var __export = (target, all) => {
9
23
  for (var name in all)
10
24
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -49,8 +63,8 @@ __export(SessionManagementService_exports, {
49
63
  module.exports = __toCommonJS(SessionManagementService_exports);
50
64
  var import_wallet = require("../utils/wallet.js");
51
65
  var import_tracer = require("../telemetry/tracer.js");
52
- var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _handleTouchSessionError, _doTouchSession;
53
- class SessionManagementService {
66
+ var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _touchPromise, _touchCachedAt, _touchCached, _TOUCH_TTL_MS, _handleTouchSessionError, _shouldDedupeTouch, _doTouchSession;
67
+ const _SessionManagementService = class _SessionManagementService {
54
68
  constructor(paraCore) {
55
69
  __privateAdd(this, _authService);
56
70
  __privateAdd(this, _portalUrlService);
@@ -60,6 +74,21 @@ class SessionManagementService {
60
74
  __privateAdd(this, _paraCoreInterface);
61
75
  __privateAdd(this, _isImportedSession);
62
76
  __privateAdd(this, _regeneratePromise);
77
+ // In-flight + short TTL dedupe for touchSession(regenerate=false). Prevents
78
+ // the post-login storm where useIsFullyLoggedIn → isFullyLoggedIn →
79
+ // isSessionActive → touchSession() fires once per render across many
80
+ // consumers (we observed 68 /touch round-trips in a 663ms window during
81
+ // AccountReady). The result is still authoritative — just shared across
82
+ // concurrent and immediately-following callers instead of refetched per call.
83
+ //
84
+ // IMPORTANT: this is disabled in the portal (see #shouldDedupeTouch). The
85
+ // portal reuses this same service and depends on touchSession() running its
86
+ // side-effects (currentWalletIds / partner sync) and returning fresh state on
87
+ // every sequential poll; a previous unconditional version of this cache
88
+ // (eb8e5f843, reverted in 58c8dadd6) broke that portal flow.
89
+ __privateAdd(this, _touchPromise);
90
+ __privateAdd(this, _touchCachedAt);
91
+ __privateAdd(this, _touchCached);
63
92
  this.init = ({
64
93
  authService,
65
94
  portalUrlService,
@@ -97,6 +126,15 @@ class SessionManagementService {
97
126
  if (regenerate && __privateGet(this, _regeneratePromise) !== void 0) {
98
127
  return __privateGet(this, _regeneratePromise);
99
128
  }
129
+ const dedupe = __privateGet(this, _shouldDedupeTouch).call(this, regenerate);
130
+ if (dedupe) {
131
+ if (__privateGet(this, _touchPromise) !== void 0) {
132
+ return __privateGet(this, _touchPromise);
133
+ }
134
+ if (__privateGet(this, _touchCached) !== void 0 && __privateGet(this, _touchCachedAt) !== void 0 && Date.now() - __privateGet(this, _touchCachedAt) < __privateGet(_SessionManagementService, _TOUCH_TTL_MS)) {
135
+ return __spreadValues({}, __privateGet(this, _touchCached));
136
+ }
137
+ }
100
138
  return (0, import_tracer.wrapWithSpan)(
101
139
  "session.touch",
102
140
  () => __async(this, null, function* () {
@@ -105,13 +143,32 @@ class SessionManagementService {
105
143
  __privateSet(this, _regeneratePromise, promise);
106
144
  yield promise.finally(() => {
107
145
  __privateSet(this, _regeneratePromise, void 0);
146
+ __privateSet(this, _touchCached, void 0);
147
+ __privateSet(this, _touchCachedAt, void 0);
108
148
  });
149
+ } else if (dedupe) {
150
+ __privateSet(this, _touchPromise, promise);
151
+ try {
152
+ const result = yield promise;
153
+ if (result.userId) {
154
+ __privateSet(this, _touchCached, result);
155
+ __privateSet(this, _touchCachedAt, Date.now());
156
+ }
157
+ } finally {
158
+ __privateSet(this, _touchPromise, void 0);
159
+ }
109
160
  }
110
161
  return promise;
111
162
  }),
112
163
  { "session.regenerate": regenerate }
113
164
  );
114
165
  });
166
+ // Whether the non-regenerate dedupe/cache should apply. Disabled in the portal,
167
+ // which depends on every touchSession() call running its side-effects and
168
+ // returning fresh session state (see #touchCached docs).
169
+ __privateAdd(this, _shouldDedupeTouch, (regenerate) => {
170
+ return !regenerate && !__privateGet(this, _paraCoreInterface).isPortal();
171
+ });
115
172
  __privateAdd(this, _doTouchSession, (regenerate) => __async(this, null, function* () {
116
173
  var _a, _b;
117
174
  if (!__privateGet(this, _paraCoreInterface).isWorkerInitialized) {
@@ -270,7 +327,7 @@ class SessionManagementService {
270
327
  set isImportedSession(value) {
271
328
  __privateSet(this, _isImportedSession, value);
272
329
  }
273
- }
330
+ };
274
331
  _authService = new WeakMap();
275
332
  _portalUrlService = new WeakMap();
276
333
  _walletService = new WeakMap();
@@ -279,8 +336,15 @@ _externalWalletService = new WeakMap();
279
336
  _paraCoreInterface = new WeakMap();
280
337
  _isImportedSession = new WeakMap();
281
338
  _regeneratePromise = new WeakMap();
339
+ _touchPromise = new WeakMap();
340
+ _touchCachedAt = new WeakMap();
341
+ _touchCached = new WeakMap();
342
+ _TOUCH_TTL_MS = new WeakMap();
282
343
  _handleTouchSessionError = new WeakMap();
344
+ _shouldDedupeTouch = new WeakMap();
283
345
  _doTouchSession = new WeakMap();
346
+ __privateAdd(_SessionManagementService, _TOUCH_TTL_MS, 1e3);
347
+ let SessionManagementService = _SessionManagementService;
284
348
  // Annotate the CommonJS export names for ESM import in node:
285
349
  0 && (module.exports = {
286
350
  SessionManagementService
@@ -0,0 +1,99 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __typeError = (msg) => {
6
+ throw TypeError(msg);
7
+ };
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
22
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
23
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
24
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
25
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
26
+ var BeaconSpanProcessor_exports = {};
27
+ __export(BeaconSpanProcessor_exports, {
28
+ BeaconSpanProcessor: () => BeaconSpanProcessor
29
+ });
30
+ module.exports = __toCommonJS(BeaconSpanProcessor_exports);
31
+ var import_otlp_transformer = require("@opentelemetry/otlp-transformer");
32
+ var _spans, _pagehideListener, _visibilityListener, _url, _BeaconSpanProcessor_instances, flushViaBeacon_fn;
33
+ const MAX_BUFFER_SIZE = 200;
34
+ class BeaconSpanProcessor {
35
+ constructor(url) {
36
+ __privateAdd(this, _BeaconSpanProcessor_instances);
37
+ __privateAdd(this, _spans, []);
38
+ __privateAdd(this, _pagehideListener);
39
+ __privateAdd(this, _visibilityListener);
40
+ __privateAdd(this, _url);
41
+ __privateSet(this, _url, url);
42
+ if (typeof window !== "undefined") {
43
+ __privateSet(this, _pagehideListener, () => __privateMethod(this, _BeaconSpanProcessor_instances, flushViaBeacon_fn).call(this));
44
+ __privateSet(this, _visibilityListener, () => {
45
+ if (typeof document !== "undefined" && document.visibilityState === "hidden") {
46
+ __privateMethod(this, _BeaconSpanProcessor_instances, flushViaBeacon_fn).call(this);
47
+ }
48
+ });
49
+ window.addEventListener("pagehide", __privateGet(this, _pagehideListener));
50
+ if (typeof document !== "undefined") {
51
+ document.addEventListener("visibilitychange", __privateGet(this, _visibilityListener));
52
+ }
53
+ }
54
+ }
55
+ onStart(_span, _parentContext) {
56
+ }
57
+ onEnd(span) {
58
+ __privateGet(this, _spans).push(span);
59
+ if (__privateGet(this, _spans).length > MAX_BUFFER_SIZE) {
60
+ __privateGet(this, _spans).shift();
61
+ }
62
+ }
63
+ forceFlush() {
64
+ return Promise.resolve();
65
+ }
66
+ shutdown() {
67
+ __privateMethod(this, _BeaconSpanProcessor_instances, flushViaBeacon_fn).call(this);
68
+ if (__privateGet(this, _pagehideListener) && typeof window !== "undefined") {
69
+ window.removeEventListener("pagehide", __privateGet(this, _pagehideListener));
70
+ __privateSet(this, _pagehideListener, void 0);
71
+ }
72
+ if (__privateGet(this, _visibilityListener) && typeof document !== "undefined") {
73
+ document.removeEventListener("visibilitychange", __privateGet(this, _visibilityListener));
74
+ __privateSet(this, _visibilityListener, void 0);
75
+ }
76
+ __privateSet(this, _spans, []);
77
+ return Promise.resolve();
78
+ }
79
+ }
80
+ _spans = new WeakMap();
81
+ _pagehideListener = new WeakMap();
82
+ _visibilityListener = new WeakMap();
83
+ _url = new WeakMap();
84
+ _BeaconSpanProcessor_instances = new WeakSet();
85
+ flushViaBeacon_fn = function() {
86
+ if (__privateGet(this, _spans).length === 0) return;
87
+ if (typeof navigator === "undefined" || typeof navigator.sendBeacon !== "function") return;
88
+ try {
89
+ const body = import_otlp_transformer.JsonTraceSerializer.serializeRequest(__privateGet(this, _spans));
90
+ const blob = new Blob([body], { type: "application/json" });
91
+ navigator.sendBeacon(__privateGet(this, _url), blob);
92
+ __privateSet(this, _spans, []);
93
+ } catch (e) {
94
+ }
95
+ };
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ BeaconSpanProcessor
99
+ });
@@ -110,10 +110,18 @@ function initTelemetry(opts) {
110
110
  // BE side keep abuse contained.
111
111
  });
112
112
  const sampler = new import_sdk_trace_base.TraceIdRatioBasedSampler(Math.max(0, Math.min(1, opts.sampleRate)));
113
+ const spanProcessors = [new import_uxStateSpanProcessor.UxStateSpanProcessor(), new import_sdk_trace_base.BatchSpanProcessor(exporter)];
114
+ if (isWeb && opts.isPortal) {
115
+ try {
116
+ const { BeaconSpanProcessor } = yield import("./BeaconSpanProcessor.js");
117
+ spanProcessors.push(new BeaconSpanProcessor(opts.tunnelUrl));
118
+ } catch (e) {
119
+ }
120
+ }
113
121
  tracerProvider = new import_sdk_trace_base.BasicTracerProvider({
114
122
  resource,
115
123
  sampler,
116
- spanProcessors: [new import_uxStateSpanProcessor.UxStateSpanProcessor(), new import_sdk_trace_base.BatchSpanProcessor(exporter)]
124
+ spanProcessors
117
125
  });
118
126
  import_api.trace.setGlobalTracerProvider(tracerProvider);
119
127
  import_api.propagation.setGlobalPropagator(
@@ -1,5 +1,5 @@
1
1
  import "./chunk-7B52C2XE.js";
2
- const PARA_CORE_VERSION = "3.0.0";
2
+ const PARA_CORE_VERSION = "3.1.0";
3
3
  const PREFIX = "@CAPSULE/";
4
4
  const PARA_PREFIX = "@PARA/";
5
5
  const LOCAL_STORAGE_AUTH_INFO = `${PREFIX}authInfo`;
@@ -2,12 +2,13 @@ import {
2
2
  __async,
3
3
  __privateAdd,
4
4
  __privateGet,
5
- __privateSet
5
+ __privateSet,
6
+ __spreadValues
6
7
  } from "../chunk-7B52C2XE.js";
7
- var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _handleTouchSessionError, _doTouchSession;
8
+ var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _touchPromise, _touchCachedAt, _touchCached, _TOUCH_TTL_MS, _handleTouchSessionError, _shouldDedupeTouch, _doTouchSession;
8
9
  import { currentWalletIdsEq, supportedWalletTypesEq } from "../utils/wallet.js";
9
10
  import { wrapWithSpan } from "../telemetry/tracer.js";
10
- class SessionManagementService {
11
+ const _SessionManagementService = class _SessionManagementService {
11
12
  constructor(paraCore) {
12
13
  __privateAdd(this, _authService);
13
14
  __privateAdd(this, _portalUrlService);
@@ -17,6 +18,21 @@ class SessionManagementService {
17
18
  __privateAdd(this, _paraCoreInterface);
18
19
  __privateAdd(this, _isImportedSession);
19
20
  __privateAdd(this, _regeneratePromise);
21
+ // In-flight + short TTL dedupe for touchSession(regenerate=false). Prevents
22
+ // the post-login storm where useIsFullyLoggedIn → isFullyLoggedIn →
23
+ // isSessionActive → touchSession() fires once per render across many
24
+ // consumers (we observed 68 /touch round-trips in a 663ms window during
25
+ // AccountReady). The result is still authoritative — just shared across
26
+ // concurrent and immediately-following callers instead of refetched per call.
27
+ //
28
+ // IMPORTANT: this is disabled in the portal (see #shouldDedupeTouch). The
29
+ // portal reuses this same service and depends on touchSession() running its
30
+ // side-effects (currentWalletIds / partner sync) and returning fresh state on
31
+ // every sequential poll; a previous unconditional version of this cache
32
+ // (eb8e5f843, reverted in 58c8dadd6) broke that portal flow.
33
+ __privateAdd(this, _touchPromise);
34
+ __privateAdd(this, _touchCachedAt);
35
+ __privateAdd(this, _touchCached);
20
36
  this.init = ({
21
37
  authService,
22
38
  portalUrlService,
@@ -54,6 +70,15 @@ class SessionManagementService {
54
70
  if (regenerate && __privateGet(this, _regeneratePromise) !== void 0) {
55
71
  return __privateGet(this, _regeneratePromise);
56
72
  }
73
+ const dedupe = __privateGet(this, _shouldDedupeTouch).call(this, regenerate);
74
+ if (dedupe) {
75
+ if (__privateGet(this, _touchPromise) !== void 0) {
76
+ return __privateGet(this, _touchPromise);
77
+ }
78
+ if (__privateGet(this, _touchCached) !== void 0 && __privateGet(this, _touchCachedAt) !== void 0 && Date.now() - __privateGet(this, _touchCachedAt) < __privateGet(_SessionManagementService, _TOUCH_TTL_MS)) {
79
+ return __spreadValues({}, __privateGet(this, _touchCached));
80
+ }
81
+ }
57
82
  return wrapWithSpan(
58
83
  "session.touch",
59
84
  () => __async(this, null, function* () {
@@ -62,13 +87,32 @@ class SessionManagementService {
62
87
  __privateSet(this, _regeneratePromise, promise);
63
88
  yield promise.finally(() => {
64
89
  __privateSet(this, _regeneratePromise, void 0);
90
+ __privateSet(this, _touchCached, void 0);
91
+ __privateSet(this, _touchCachedAt, void 0);
65
92
  });
93
+ } else if (dedupe) {
94
+ __privateSet(this, _touchPromise, promise);
95
+ try {
96
+ const result = yield promise;
97
+ if (result.userId) {
98
+ __privateSet(this, _touchCached, result);
99
+ __privateSet(this, _touchCachedAt, Date.now());
100
+ }
101
+ } finally {
102
+ __privateSet(this, _touchPromise, void 0);
103
+ }
66
104
  }
67
105
  return promise;
68
106
  }),
69
107
  { "session.regenerate": regenerate }
70
108
  );
71
109
  });
110
+ // Whether the non-regenerate dedupe/cache should apply. Disabled in the portal,
111
+ // which depends on every touchSession() call running its side-effects and
112
+ // returning fresh session state (see #touchCached docs).
113
+ __privateAdd(this, _shouldDedupeTouch, (regenerate) => {
114
+ return !regenerate && !__privateGet(this, _paraCoreInterface).isPortal();
115
+ });
72
116
  __privateAdd(this, _doTouchSession, (regenerate) => __async(this, null, function* () {
73
117
  var _a, _b;
74
118
  if (!__privateGet(this, _paraCoreInterface).isWorkerInitialized) {
@@ -227,7 +271,7 @@ class SessionManagementService {
227
271
  set isImportedSession(value) {
228
272
  __privateSet(this, _isImportedSession, value);
229
273
  }
230
- }
274
+ };
231
275
  _authService = new WeakMap();
232
276
  _portalUrlService = new WeakMap();
233
277
  _walletService = new WeakMap();
@@ -236,8 +280,15 @@ _externalWalletService = new WeakMap();
236
280
  _paraCoreInterface = new WeakMap();
237
281
  _isImportedSession = new WeakMap();
238
282
  _regeneratePromise = new WeakMap();
283
+ _touchPromise = new WeakMap();
284
+ _touchCachedAt = new WeakMap();
285
+ _touchCached = new WeakMap();
286
+ _TOUCH_TTL_MS = new WeakMap();
239
287
  _handleTouchSessionError = new WeakMap();
288
+ _shouldDedupeTouch = new WeakMap();
240
289
  _doTouchSession = new WeakMap();
290
+ __privateAdd(_SessionManagementService, _TOUCH_TTL_MS, 1e3);
291
+ let SessionManagementService = _SessionManagementService;
241
292
  export {
242
293
  SessionManagementService
243
294
  };
@@ -0,0 +1,74 @@
1
+ import {
2
+ __privateAdd,
3
+ __privateGet,
4
+ __privateMethod,
5
+ __privateSet
6
+ } from "../chunk-7B52C2XE.js";
7
+ var _spans, _pagehideListener, _visibilityListener, _url, _BeaconSpanProcessor_instances, flushViaBeacon_fn;
8
+ import { JsonTraceSerializer } from "@opentelemetry/otlp-transformer";
9
+ const MAX_BUFFER_SIZE = 200;
10
+ class BeaconSpanProcessor {
11
+ constructor(url) {
12
+ __privateAdd(this, _BeaconSpanProcessor_instances);
13
+ __privateAdd(this, _spans, []);
14
+ __privateAdd(this, _pagehideListener);
15
+ __privateAdd(this, _visibilityListener);
16
+ __privateAdd(this, _url);
17
+ __privateSet(this, _url, url);
18
+ if (typeof window !== "undefined") {
19
+ __privateSet(this, _pagehideListener, () => __privateMethod(this, _BeaconSpanProcessor_instances, flushViaBeacon_fn).call(this));
20
+ __privateSet(this, _visibilityListener, () => {
21
+ if (typeof document !== "undefined" && document.visibilityState === "hidden") {
22
+ __privateMethod(this, _BeaconSpanProcessor_instances, flushViaBeacon_fn).call(this);
23
+ }
24
+ });
25
+ window.addEventListener("pagehide", __privateGet(this, _pagehideListener));
26
+ if (typeof document !== "undefined") {
27
+ document.addEventListener("visibilitychange", __privateGet(this, _visibilityListener));
28
+ }
29
+ }
30
+ }
31
+ onStart(_span, _parentContext) {
32
+ }
33
+ onEnd(span) {
34
+ __privateGet(this, _spans).push(span);
35
+ if (__privateGet(this, _spans).length > MAX_BUFFER_SIZE) {
36
+ __privateGet(this, _spans).shift();
37
+ }
38
+ }
39
+ forceFlush() {
40
+ return Promise.resolve();
41
+ }
42
+ shutdown() {
43
+ __privateMethod(this, _BeaconSpanProcessor_instances, flushViaBeacon_fn).call(this);
44
+ if (__privateGet(this, _pagehideListener) && typeof window !== "undefined") {
45
+ window.removeEventListener("pagehide", __privateGet(this, _pagehideListener));
46
+ __privateSet(this, _pagehideListener, void 0);
47
+ }
48
+ if (__privateGet(this, _visibilityListener) && typeof document !== "undefined") {
49
+ document.removeEventListener("visibilitychange", __privateGet(this, _visibilityListener));
50
+ __privateSet(this, _visibilityListener, void 0);
51
+ }
52
+ __privateSet(this, _spans, []);
53
+ return Promise.resolve();
54
+ }
55
+ }
56
+ _spans = new WeakMap();
57
+ _pagehideListener = new WeakMap();
58
+ _visibilityListener = new WeakMap();
59
+ _url = new WeakMap();
60
+ _BeaconSpanProcessor_instances = new WeakSet();
61
+ flushViaBeacon_fn = function() {
62
+ if (__privateGet(this, _spans).length === 0) return;
63
+ if (typeof navigator === "undefined" || typeof navigator.sendBeacon !== "function") return;
64
+ try {
65
+ const body = JsonTraceSerializer.serializeRequest(__privateGet(this, _spans));
66
+ const blob = new Blob([body], { type: "application/json" });
67
+ navigator.sendBeacon(__privateGet(this, _url), blob);
68
+ __privateSet(this, _spans, []);
69
+ } catch (e) {
70
+ }
71
+ };
72
+ export {
73
+ BeaconSpanProcessor
74
+ };
@@ -2,7 +2,11 @@ import {
2
2
  __async,
3
3
  __spreadValues
4
4
  } from "../chunk-7B52C2XE.js";
5
- import { BatchSpanProcessor, BasicTracerProvider, TraceIdRatioBasedSampler } from "@opentelemetry/sdk-trace-base";
5
+ import {
6
+ BatchSpanProcessor,
7
+ BasicTracerProvider,
8
+ TraceIdRatioBasedSampler
9
+ } from "@opentelemetry/sdk-trace-base";
6
10
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
7
11
  import { resourceFromAttributes } from "@opentelemetry/resources";
8
12
  import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic-conventions";
@@ -44,10 +48,18 @@ function initTelemetry(opts) {
44
48
  // BE side keep abuse contained.
45
49
  });
46
50
  const sampler = new TraceIdRatioBasedSampler(Math.max(0, Math.min(1, opts.sampleRate)));
51
+ const spanProcessors = [new UxStateSpanProcessor(), new BatchSpanProcessor(exporter)];
52
+ if (isWeb && opts.isPortal) {
53
+ try {
54
+ const { BeaconSpanProcessor } = yield import("./BeaconSpanProcessor.js");
55
+ spanProcessors.push(new BeaconSpanProcessor(opts.tunnelUrl));
56
+ } catch (e) {
57
+ }
58
+ }
47
59
  tracerProvider = new BasicTracerProvider({
48
60
  resource,
49
61
  sampler,
50
- spanProcessors: [new UxStateSpanProcessor(), new BatchSpanProcessor(exporter)]
62
+ spanProcessors
51
63
  });
52
64
  trace.setGlobalTracerProvider(tracerProvider);
53
65
  propagation.setGlobalPropagator(
@@ -0,0 +1,10 @@
1
+ import type { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace-base';
2
+ import type { Context } from '@opentelemetry/api';
3
+ export declare class BeaconSpanProcessor implements SpanProcessor {
4
+ #private;
5
+ constructor(url: string);
6
+ onStart(_span: Span, _parentContext: Context): void;
7
+ onEnd(span: ReadableSpan): void;
8
+ forceFlush(): Promise<void>;
9
+ shutdown(): Promise<void>;
10
+ }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@getpara/core-sdk",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "dependencies": {
5
5
  "@celo/utils": "^8.0.2",
6
6
  "@cosmjs/encoding": "^0.32.4",
7
7
  "@ethereumjs/util": "^9.1.0",
8
- "@getpara/user-management-client": "3.0.0",
8
+ "@getpara/user-management-client": "3.1.0",
9
9
  "@noble/hashes": "^1.5.0",
10
10
  "@opentelemetry/api": "^1.9.1",
11
11
  "@opentelemetry/context-zone": "^2.7.1",
@@ -14,6 +14,7 @@
14
14
  "@opentelemetry/instrumentation": "^0.215.0",
15
15
  "@opentelemetry/instrumentation-fetch": "^0.215.0",
16
16
  "@opentelemetry/instrumentation-xml-http-request": "^0.216.0",
17
+ "@opentelemetry/otlp-transformer": "^0.215.0",
17
18
  "@opentelemetry/resources": "^2.7.0",
18
19
  "@opentelemetry/sdk-trace-base": "^2.7.0",
19
20
  "@opentelemetry/semantic-conventions": "^1.40.0",
@@ -40,7 +41,7 @@
40
41
  "dist",
41
42
  "package.json"
42
43
  ],
43
- "gitHead": "e6c42e42adfcfadb0114b1ac65ba5203e6274712",
44
+ "gitHead": "e73f17cd7960fdfe62ff68a972b3461e47b21eb0",
44
45
  "main": "dist/cjs/index.js",
45
46
  "module": "dist/esm/index.js",
46
47
  "scripts": {