@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.
- package/dist/cjs/constants.js +1 -1
- package/dist/cjs/services/SessionManagementService.js +67 -3
- package/dist/cjs/telemetry/BeaconSpanProcessor.js +99 -0
- package/dist/cjs/telemetry/init.js +9 -1
- package/dist/esm/constants.js +1 -1
- package/dist/esm/services/SessionManagementService.js +55 -4
- package/dist/esm/telemetry/BeaconSpanProcessor.js +74 -0
- package/dist/esm/telemetry/init.js +14 -2
- package/dist/types/telemetry/BeaconSpanProcessor.d.ts +10 -0
- package/package.json +4 -3
package/dist/cjs/constants.js
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
124
|
+
spanProcessors
|
|
117
125
|
});
|
|
118
126
|
import_api.trace.setGlobalTracerProvider(tracerProvider);
|
|
119
127
|
import_api.propagation.setGlobalPropagator(
|
package/dist/esm/constants.js
CHANGED
|
@@ -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
|
|
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 {
|
|
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
|
|
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.
|
|
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.
|
|
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": "
|
|
44
|
+
"gitHead": "e73f17cd7960fdfe62ff68a972b3461e47b21eb0",
|
|
44
45
|
"main": "dist/cjs/index.js",
|
|
45
46
|
"module": "dist/esm/index.js",
|
|
46
47
|
"scripts": {
|