@oxyhq/core 10.2.0 → 11.0.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/.tsbuildinfo +1 -1
- package/dist/cjs/boot/sessionColdBoot.js +3 -3
- package/dist/cjs/crypto/keyManager.js +68 -69
- package/dist/cjs/crypto/signatureService.js +2 -2
- package/dist/cjs/index.js +13 -21
- package/dist/cjs/logger/index.js +149 -0
- package/dist/cjs/mixins/OxyServices.assets.js +4 -4
- package/dist/cjs/mixins/OxyServices.auth.js +2 -2
- package/dist/cjs/mixins/OxyServices.language.js +3 -5
- package/dist/cjs/mixins/OxyServices.privacy.js +2 -4
- package/dist/cjs/mixins/OxyServices.security.js +7 -11
- package/dist/cjs/mixins/OxyServices.topics.js +25 -15
- package/dist/cjs/mixins/OxyServices.user.js +4 -4
- package/dist/cjs/mixins/OxyServices.utility.js +18 -18
- package/dist/cjs/session/SessionClient.js +17 -17
- package/dist/cjs/session/accountDialogController.js +12 -12
- package/dist/cjs/session/authStateStore.js +5 -5
- package/dist/cjs/session/refresh.js +4 -4
- package/dist/cjs/session/socketLoader.js +2 -2
- package/dist/cjs/utils/asyncUtils.js +2 -2
- package/dist/cjs/utils/avatarUtils.js +2 -1
- package/dist/cjs/utils/deviceManager.js +7 -5
- package/dist/cjs/utils/errorUtils.js +3 -3
- package/dist/cjs/utils/oauthPkce.js +3 -3
- package/dist/cjs/utils/requestUtils.js +1 -1
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/boot/sessionColdBoot.js +1 -1
- package/dist/esm/crypto/keyManager.js +1 -2
- package/dist/esm/crypto/signatureService.js +1 -1
- package/dist/esm/index.js +2 -3
- package/dist/esm/logger/index.js +140 -0
- package/dist/esm/mixins/OxyServices.assets.js +2 -2
- package/dist/esm/mixins/OxyServices.auth.js +1 -1
- package/dist/esm/mixins/OxyServices.language.js +3 -5
- package/dist/esm/mixins/OxyServices.privacy.js +2 -4
- package/dist/esm/mixins/OxyServices.security.js +7 -11
- package/dist/esm/mixins/OxyServices.topics.js +25 -15
- package/dist/esm/mixins/OxyServices.user.js +1 -1
- package/dist/esm/mixins/OxyServices.utility.js +1 -1
- package/dist/esm/session/SessionClient.js +1 -1
- package/dist/esm/session/accountDialogController.js +1 -1
- package/dist/esm/session/authStateStore.js +1 -1
- package/dist/esm/session/refresh.js +1 -1
- package/dist/esm/session/socketLoader.js +1 -1
- package/dist/esm/utils/asyncUtils.js +1 -1
- package/dist/esm/utils/avatarUtils.js +2 -1
- package/dist/esm/utils/deviceManager.js +7 -5
- package/dist/esm/utils/errorUtils.js +1 -1
- package/dist/esm/utils/oauthPkce.js +1 -1
- package/dist/esm/utils/requestUtils.js +1 -1
- package/dist/types/.tsbuildinfo +1 -1
- package/dist/types/index.d.ts +3 -4
- package/dist/types/logger/index.d.ts +104 -0
- package/dist/types/mixins/OxyServices.topics.d.ts +3 -3
- package/dist/types/models/Topic.d.ts +10 -0
- package/dist/types/utils/requestUtils.d.ts +1 -1
- package/package.json +16 -1
- package/src/boot/sessionColdBoot.ts +1 -1
- package/src/crypto/keyManager.ts +1 -2
- package/src/crypto/signatureService.ts +1 -1
- package/src/index.ts +17 -19
- package/src/logger/__tests__/logger.test.ts +207 -0
- package/src/logger/index.ts +217 -0
- package/src/mixins/OxyServices.assets.ts +3 -3
- package/src/mixins/OxyServices.auth.ts +1 -1
- package/src/mixins/OxyServices.language.ts +3 -5
- package/src/mixins/OxyServices.privacy.ts +2 -4
- package/src/mixins/OxyServices.security.ts +7 -11
- package/src/mixins/OxyServices.topics.ts +47 -17
- package/src/mixins/OxyServices.user.ts +1 -1
- package/src/mixins/OxyServices.utility.ts +1 -1
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +1 -1
- package/src/mixins/__tests__/topics.test.ts +156 -0
- package/src/models/Topic.ts +11 -0
- package/src/session/SessionClient.ts +1 -1
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +1 -1
- package/src/session/__tests__/accountDialogController.test.ts +1 -1
- package/src/session/accountDialogController.ts +1 -1
- package/src/session/authStateStore.ts +1 -1
- package/src/session/refresh.ts +1 -1
- package/src/session/socketLoader.ts +1 -1
- package/src/utils/asyncUtils.ts +1 -1
- package/src/utils/avatarUtils.ts +3 -1
- package/src/utils/deviceManager.ts +8 -5
- package/src/utils/errorUtils.ts +1 -1
- package/src/utils/oauthPkce.ts +1 -1
- package/src/utils/requestUtils.ts +1 -1
- package/dist/cjs/shared/utils/debugUtils.js +0 -80
- package/dist/cjs/utils/loggerUtils.js +0 -126
- package/dist/esm/shared/utils/debugUtils.js +0 -72
- package/dist/esm/utils/loggerUtils.js +0 -115
- package/dist/types/shared/utils/debugUtils.d.ts +0 -48
- package/dist/types/utils/loggerUtils.d.ts +0 -48
- package/src/shared/utils/__tests__/debugUtils.test.ts +0 -55
- package/src/shared/utils/debugUtils.ts +0 -78
- package/src/utils/loggerUtils.ts +0 -153
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SessionClient = void 0;
|
|
4
4
|
const contracts_1 = require("@oxyhq/contracts");
|
|
5
|
-
const
|
|
5
|
+
const logger_1 = require("../logger");
|
|
6
6
|
const socketLoader_1 = require("./socketLoader");
|
|
7
7
|
/**
|
|
8
8
|
* Same-origin `BroadcastChannel` name for instant, network-free session-state
|
|
@@ -68,7 +68,7 @@ class SessionClient {
|
|
|
68
68
|
listener(payload);
|
|
69
69
|
}
|
|
70
70
|
catch (error) {
|
|
71
|
-
|
|
71
|
+
logger_1.logger.warn('[SessionClient] server-event listener threw', { component: 'SessionClient' }, error);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
});
|
|
@@ -79,7 +79,7 @@ class SessionClient {
|
|
|
79
79
|
listener(this.state);
|
|
80
80
|
}
|
|
81
81
|
catch (error) {
|
|
82
|
-
|
|
82
|
+
logger_1.logger.error('[SessionClient] subscriber threw', error);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -87,7 +87,7 @@ class SessionClient {
|
|
|
87
87
|
applyState(raw, origin = 'push') {
|
|
88
88
|
const next = (0, contracts_1.safeParseContract)(contracts_1.deviceSessionStateSchema, raw);
|
|
89
89
|
if (!next) {
|
|
90
|
-
|
|
90
|
+
logger_1.logger.warn('[SessionClient] discarded invalid session state');
|
|
91
91
|
return false;
|
|
92
92
|
}
|
|
93
93
|
// The revision is monotone ONLY within a single deviceId. When the incoming
|
|
@@ -111,20 +111,20 @@ class SessionClient {
|
|
|
111
111
|
this.options.onUnauthenticated(origin);
|
|
112
112
|
}
|
|
113
113
|
catch (error) {
|
|
114
|
-
|
|
114
|
+
logger_1.logger.error('[SessionClient] onUnauthenticated threw', error);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
};
|
|
118
118
|
if (needsMintBeforeNotify) {
|
|
119
119
|
void transport.ensureActiveToken(next).then(finishApply).catch((error) => {
|
|
120
|
-
|
|
120
|
+
logger_1.logger.warn('[SessionClient] ensureActiveToken failed', { component: 'SessionClient' }, error);
|
|
121
121
|
finishApply();
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
else {
|
|
125
125
|
if (transport) {
|
|
126
126
|
void transport.ensureActiveToken(next).catch((error) => {
|
|
127
|
-
|
|
127
|
+
logger_1.logger.warn('[SessionClient] ensureActiveToken failed', { component: 'SessionClient' }, error);
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
130
|
finishApply();
|
|
@@ -151,7 +151,7 @@ class SessionClient {
|
|
|
151
151
|
? { path: issue.path.join('.'), code: issue.code, expected: issue.expected, received: issue.received }
|
|
152
152
|
: { path: issue.path.join('.'), code: issue.code });
|
|
153
153
|
const keys = raw && typeof raw === 'object' ? Object.keys(raw) : [];
|
|
154
|
-
|
|
154
|
+
logger_1.logger.warn('[SessionClient] discarded invalid session sync', { component: 'SessionClient', issues, keys });
|
|
155
155
|
return;
|
|
156
156
|
}
|
|
157
157
|
// A `sync` is always the response to a direct REST call this client made
|
|
@@ -231,7 +231,7 @@ class SessionClient {
|
|
|
231
231
|
await this.bootstrap();
|
|
232
232
|
}
|
|
233
233
|
catch (error) {
|
|
234
|
-
|
|
234
|
+
logger_1.logger.warn('[SessionClient] bootstrap during start failed (non-fatal)', { component: 'SessionClient' }, error);
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
await this.connectSocket();
|
|
@@ -248,7 +248,7 @@ class SessionClient {
|
|
|
248
248
|
this.channel.close();
|
|
249
249
|
}
|
|
250
250
|
catch (error) {
|
|
251
|
-
|
|
251
|
+
logger_1.logger.debug('[SessionClient] BroadcastChannel close failed', { component: 'SessionClient' }, error);
|
|
252
252
|
}
|
|
253
253
|
this.channel = null;
|
|
254
254
|
}
|
|
@@ -264,7 +264,7 @@ class SessionClient {
|
|
|
264
264
|
// if THAT yields nothing — only when no factory was injected.
|
|
265
265
|
const io = this.options.socketFactory ?? (await (0, socketLoader_1.getSocketIO)());
|
|
266
266
|
if (!io) {
|
|
267
|
-
|
|
267
|
+
logger_1.logger.warn('[SessionClient] no socket.io-client; running REST-only (no realtime sync)', { component: 'SessionClient' });
|
|
268
268
|
return;
|
|
269
269
|
}
|
|
270
270
|
if (!this.started)
|
|
@@ -307,7 +307,7 @@ class SessionClient {
|
|
|
307
307
|
const active = this.state?.activeAccountId ?? null;
|
|
308
308
|
if (active && active !== this.host.getCurrentAccountId() && this.host.getAccessToken()) {
|
|
309
309
|
void this.bootstrap().catch((error) => {
|
|
310
|
-
|
|
310
|
+
logger_1.logger.warn('[SessionClient] post-push token fetch failed', { component: 'SessionClient' }, error);
|
|
311
311
|
});
|
|
312
312
|
}
|
|
313
313
|
});
|
|
@@ -340,7 +340,7 @@ class SessionClient {
|
|
|
340
340
|
onSessionAccountsChanged(payload) {
|
|
341
341
|
const event = (0, contracts_1.safeParseContract)(contracts_1.sessionAccountsChangedEventSchema, payload);
|
|
342
342
|
if (!event) {
|
|
343
|
-
|
|
343
|
+
logger_1.logger.warn('[SessionClient] discarded invalid session_accounts_changed', { component: 'SessionClient' });
|
|
344
344
|
return;
|
|
345
345
|
}
|
|
346
346
|
// The socket is in `user:<activeUserId>` for the planted bearer, so this should
|
|
@@ -350,7 +350,7 @@ class SessionClient {
|
|
|
350
350
|
if (!this.host.getAccessToken())
|
|
351
351
|
return;
|
|
352
352
|
void this.bootstrap().catch((error) => {
|
|
353
|
-
|
|
353
|
+
logger_1.logger.warn('[SessionClient] session_accounts_changed refetch failed', { component: 'SessionClient' }, error);
|
|
354
354
|
});
|
|
355
355
|
}
|
|
356
356
|
/**
|
|
@@ -371,7 +371,7 @@ class SessionClient {
|
|
|
371
371
|
channel = new Ctor(SESSION_BROADCAST_CHANNEL);
|
|
372
372
|
}
|
|
373
373
|
catch (error) {
|
|
374
|
-
|
|
374
|
+
logger_1.logger.debug('[SessionClient] BroadcastChannel unavailable', { component: 'SessionClient' }, error);
|
|
375
375
|
return;
|
|
376
376
|
}
|
|
377
377
|
channel.onmessage = (event) => {
|
|
@@ -384,7 +384,7 @@ class SessionClient {
|
|
|
384
384
|
// re-sync does not re-post, so there is no cross-tab ping loop.
|
|
385
385
|
if (this.host.getAccessToken()) {
|
|
386
386
|
void this.bootstrap().catch((error) => {
|
|
387
|
-
|
|
387
|
+
logger_1.logger.warn('[SessionClient] broadcast re-sync failed', { component: 'SessionClient' }, error);
|
|
388
388
|
});
|
|
389
389
|
}
|
|
390
390
|
};
|
|
@@ -404,7 +404,7 @@ class SessionClient {
|
|
|
404
404
|
this.channel.postMessage({ type: 'commit', at: Date.now() });
|
|
405
405
|
}
|
|
406
406
|
catch (error) {
|
|
407
|
-
|
|
407
|
+
logger_1.logger.debug('[SessionClient] BroadcastChannel post failed', { component: 'SessionClient' }, error);
|
|
408
408
|
}
|
|
409
409
|
}
|
|
410
410
|
}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
30
|
exports.AccountDialogController = void 0;
|
|
31
31
|
exports.createAccountDialogController = createAccountDialogController;
|
|
32
|
-
const
|
|
32
|
+
const logger_1 = require("../logger");
|
|
33
33
|
const errorUtils_1 = require("../utils/errorUtils");
|
|
34
34
|
const authWebUrl_1 = require("../utils/authWebUrl");
|
|
35
35
|
const oauthPkce_1 = require("../utils/oauthPkce");
|
|
@@ -277,11 +277,11 @@ class AccountDialogController {
|
|
|
277
277
|
// malformed) IS unexpected: surface it and warn while keeping the prior graph
|
|
278
278
|
// so device rows still render.
|
|
279
279
|
if ((0, errorUtils_1.extractErrorStatus)(error) === 401) {
|
|
280
|
-
|
|
280
|
+
logger_1.logger.debug('[AccountDialogController] listAccounts unauthorized (signed out)', { component: 'AccountDialogController' }, error);
|
|
281
281
|
}
|
|
282
282
|
else {
|
|
283
283
|
this.error = errorMessage(error);
|
|
284
|
-
|
|
284
|
+
logger_1.logger.warn('[AccountDialogController] listAccounts failed', { component: 'AccountDialogController' }, error);
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
287
|
if (seq !== this.refreshSeq)
|
|
@@ -327,10 +327,10 @@ class AccountDialogController {
|
|
|
327
327
|
// OTHER error here is an unexpected total failure worth a warn. Either way keep
|
|
328
328
|
// the prior profile map.
|
|
329
329
|
if ((0, errorUtils_1.extractErrorStatus)(error) === 401) {
|
|
330
|
-
|
|
330
|
+
logger_1.logger.debug('[AccountDialogController] getUsersByIds unauthorized (signed out)', { component: 'AccountDialogController' }, error);
|
|
331
331
|
}
|
|
332
332
|
else {
|
|
333
|
-
|
|
333
|
+
logger_1.logger.warn('[AccountDialogController] getUsersByIds failed', { component: 'AccountDialogController' }, error);
|
|
334
334
|
}
|
|
335
335
|
return;
|
|
336
336
|
}
|
|
@@ -419,7 +419,7 @@ class AccountDialogController {
|
|
|
419
419
|
catch (error) {
|
|
420
420
|
// Shared-key mint failed — log and fall through to the QR handoff rather
|
|
421
421
|
// than dead-ending the sign-in.
|
|
422
|
-
|
|
422
|
+
logger_1.logger.warn('[AccountDialogController] signInWithSharedIdentity failed', { component: 'AccountDialogController' }, error);
|
|
423
423
|
}
|
|
424
424
|
await this.showQr();
|
|
425
425
|
}
|
|
@@ -477,7 +477,7 @@ class AccountDialogController {
|
|
|
477
477
|
}
|
|
478
478
|
}
|
|
479
479
|
catch (error) {
|
|
480
|
-
|
|
480
|
+
logger_1.logger.debug('[AccountDialogController] Commons deep-link probe failed (QR fallback active)', { component: 'AccountDialogController' }, error);
|
|
481
481
|
}
|
|
482
482
|
}
|
|
483
483
|
/** Tear down the active sign-in device flow (timers + socket + token) and reset to idle. */
|
|
@@ -576,7 +576,7 @@ class AccountDialogController {
|
|
|
576
576
|
}
|
|
577
577
|
catch (error) {
|
|
578
578
|
// Transient poll error — the next tick retries. Logged, never thrown.
|
|
579
|
-
|
|
579
|
+
logger_1.logger.debug('[AccountDialogController] poll error (will retry)', { component: 'AccountDialogController' }, error);
|
|
580
580
|
}
|
|
581
581
|
if (this.signInToken === sessionToken) {
|
|
582
582
|
this.scheduleNextPoll(sessionToken);
|
|
@@ -695,7 +695,7 @@ class AccountDialogController {
|
|
|
695
695
|
}
|
|
696
696
|
catch (error) {
|
|
697
697
|
// Socket unavailable — the fallback poll still completes the flow.
|
|
698
|
-
|
|
698
|
+
logger_1.logger.debug('[AccountDialogController] auth-session socket create failed (poll fallback)', { component: 'AccountDialogController' }, error);
|
|
699
699
|
return;
|
|
700
700
|
}
|
|
701
701
|
const join = () => {
|
|
@@ -705,7 +705,7 @@ class AccountDialogController {
|
|
|
705
705
|
socket.emit('join', sessionToken);
|
|
706
706
|
}
|
|
707
707
|
catch (error) {
|
|
708
|
-
|
|
708
|
+
logger_1.logger.debug('[AccountDialogController] auth-session join failed', { component: 'AccountDialogController' }, error);
|
|
709
709
|
}
|
|
710
710
|
};
|
|
711
711
|
socket.on('connect', join);
|
|
@@ -731,7 +731,7 @@ class AccountDialogController {
|
|
|
731
731
|
socket.disconnect();
|
|
732
732
|
}
|
|
733
733
|
catch (error) {
|
|
734
|
-
|
|
734
|
+
logger_1.logger.debug('[AccountDialogController] auth-session socket close failed', { component: 'AccountDialogController' }, error);
|
|
735
735
|
}
|
|
736
736
|
}
|
|
737
737
|
// =========================================================================
|
|
@@ -767,7 +767,7 @@ class AccountDialogController {
|
|
|
767
767
|
listener(this.snapshot);
|
|
768
768
|
}
|
|
769
769
|
catch (error) {
|
|
770
|
-
|
|
770
|
+
logger_1.logger.error('[AccountDialogController] subscriber threw', error);
|
|
771
771
|
}
|
|
772
772
|
}
|
|
773
773
|
}
|
|
@@ -22,7 +22,7 @@ exports.AUTH_STATE_TOKEN_STORAGE_KEY = exports.AUTH_STATE_STORAGE_KEY = void 0;
|
|
|
22
22
|
exports.createMemoryAuthStateStore = createMemoryAuthStateStore;
|
|
23
23
|
exports.createWebAuthStateStore = createWebAuthStateStore;
|
|
24
24
|
exports.createNativeAuthStateStore = createNativeAuthStateStore;
|
|
25
|
-
const
|
|
25
|
+
const logger_1 = require("../logger");
|
|
26
26
|
/**
|
|
27
27
|
* Versioned DURABLE storage key. Holds ONLY the small, re-mint-critical fields
|
|
28
28
|
* (`sessionId`, `userId`, `deviceId`, `deviceSecret`) — never the large JWT
|
|
@@ -274,11 +274,11 @@ function createWebAuthStateStore() {
|
|
|
274
274
|
storage.setItem(exports.AUTH_STATE_STORAGE_KEY, durableJson);
|
|
275
275
|
durablePersisted = storage.getItem(exports.AUTH_STATE_STORAGE_KEY) === durableJson;
|
|
276
276
|
if (!durablePersisted) {
|
|
277
|
-
|
|
277
|
+
logger_1.logger.error('[authStateStore] durable credential read-back mismatch after save — the device credential did not persist; the session survives this process via the in-memory mirror but will be lost on reload', undefined, { component: 'authStateStore' });
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
280
|
catch (error) {
|
|
281
|
-
|
|
281
|
+
logger_1.logger.error('[authStateStore] durable credential persist threw — the device credential did not persist; the session survives this process via the in-memory mirror but will be lost on reload', error, { component: 'authStateStore' });
|
|
282
282
|
}
|
|
283
283
|
// Warm token AFTER, best-effort. Its failure is genuinely non-fatal (the
|
|
284
284
|
// durable credential re-mints a fresh token) and must never abort or
|
|
@@ -360,11 +360,11 @@ function createNativeAuthStateStore(storage) {
|
|
|
360
360
|
await storage.setItem(exports.AUTH_STATE_STORAGE_KEY, durableJson);
|
|
361
361
|
durablePersisted = (await storage.getItem(exports.AUTH_STATE_STORAGE_KEY)) === durableJson;
|
|
362
362
|
if (!durablePersisted) {
|
|
363
|
-
|
|
363
|
+
logger_1.logger.error('[authStateStore] durable credential read-back mismatch after save — the device credential did not persist (likely oversize SecureStore value); the session survives this app run via the in-memory mirror but will be lost on cold restart', undefined, { component: 'authStateStore' });
|
|
364
364
|
}
|
|
365
365
|
}
|
|
366
366
|
catch (error) {
|
|
367
|
-
|
|
367
|
+
logger_1.logger.error('[authStateStore] durable credential persist threw — the device credential did not persist; the session survives this app run via the in-memory mirror but will be lost on cold restart', error, { component: 'authStateStore' });
|
|
368
368
|
}
|
|
369
369
|
// Warm token AFTER, best-effort. Its failure is genuinely non-fatal (the
|
|
370
370
|
// durable credential re-mints a fresh token) and must never abort or
|
|
@@ -8,7 +8,7 @@ exports.installAuthRefreshHandler = installAuthRefreshHandler;
|
|
|
8
8
|
exports.startTokenRefreshScheduler = startTokenRefreshScheduler;
|
|
9
9
|
const platform_1 = require("../utils/platform");
|
|
10
10
|
const errorUtils_1 = require("../utils/errorUtils");
|
|
11
|
-
const
|
|
11
|
+
const logger_1 = require("../logger");
|
|
12
12
|
/**
|
|
13
13
|
* Lead time (ms) before access-token expiry at which the proactive scheduler
|
|
14
14
|
* re-mints. Mirrors `HttpService`'s per-request `TOKEN_REFRESH_LEAD_SECONDS`
|
|
@@ -125,14 +125,14 @@ async function refreshPersistedSession(deps) {
|
|
|
125
125
|
case 'ok':
|
|
126
126
|
return arm1.token;
|
|
127
127
|
case 'transient':
|
|
128
|
-
|
|
128
|
+
logger_1.logger.debug('Persisted deviceSecret mint failed (transient) — keeping store', { component: 'refresh', method: 'refreshPersistedSession' });
|
|
129
129
|
return null;
|
|
130
130
|
case 'persist-failed':
|
|
131
131
|
// The server rotated the secret but it did not durably persist. Do NOT fall
|
|
132
132
|
// to shared-key and do NOT plant — a later attempt re-mints (the process
|
|
133
133
|
// mirror still holds the rotated secret the server accepts) and can persist
|
|
134
134
|
// once storage recovers. Never advertise a session on an unsaved secret.
|
|
135
|
-
|
|
135
|
+
logger_1.logger.error('Device-secret mint rotated the secret but it could not be durably persisted — refusing to plant (a later attempt re-mints)', undefined, { component: 'refresh', method: 'refreshPersistedSession' });
|
|
136
136
|
return null;
|
|
137
137
|
case 'invalid-secret':
|
|
138
138
|
case 'no-session': {
|
|
@@ -172,7 +172,7 @@ async function refreshPersistedSession(deps) {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
catch (error) {
|
|
175
|
-
|
|
175
|
+
logger_1.logger.debug('Shared-key re-mint fallback failed', { component: 'refresh', method: 'refreshPersistedSession' }, error);
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
return null;
|
|
@@ -34,7 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.getSocketIO = getSocketIO;
|
|
37
|
-
const
|
|
37
|
+
const logger_1 = require("../logger");
|
|
38
38
|
let cachedFactory = null;
|
|
39
39
|
let loadAttempted = false;
|
|
40
40
|
async function getSocketIO() {
|
|
@@ -49,7 +49,7 @@ async function getSocketIO() {
|
|
|
49
49
|
return cachedFactory;
|
|
50
50
|
}
|
|
51
51
|
catch (error) {
|
|
52
|
-
|
|
52
|
+
logger_1.logger.warn('[SessionClient] socket.io-client import failed; realtime session sync disabled', { component: 'SessionClient' }, error);
|
|
53
53
|
return null;
|
|
54
54
|
}
|
|
55
55
|
}
|
|
@@ -15,7 +15,7 @@ exports.createCancellableAsync = createCancellableAsync;
|
|
|
15
15
|
exports.withTimeout = withTimeout;
|
|
16
16
|
exports.withLoadingState = withLoadingState;
|
|
17
17
|
exports.retryOnError = retryOnError;
|
|
18
|
-
const
|
|
18
|
+
const logger_1 = require("../logger");
|
|
19
19
|
/**
|
|
20
20
|
* Wrapper for async operations with automatic error handling
|
|
21
21
|
* Returns null on error instead of throwing
|
|
@@ -29,7 +29,7 @@ async function withErrorHandling(operation, errorHandler, context) {
|
|
|
29
29
|
errorHandler(error);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
|
|
32
|
+
logger_1.logger.error(`Error in ${context || 'operation'}`, error instanceof Error ? error : new Error(String(error)), {
|
|
33
33
|
component: 'asyncUtils',
|
|
34
34
|
method: 'withErrorHandling',
|
|
35
35
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.updateAvatarVisibility = updateAvatarVisibility;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
4
5
|
/**
|
|
5
6
|
* Updates file visibility to public for avatar use.
|
|
6
7
|
* Logs non-404 errors to help debug upload issues.
|
|
@@ -22,7 +23,7 @@ async function updateAvatarVisibility(fileId, oxyServices, contextName = 'Avatar
|
|
|
22
23
|
? visError.status
|
|
23
24
|
: undefined;
|
|
24
25
|
if (status !== 404) {
|
|
25
|
-
|
|
26
|
+
logger_1.logger.error(`[${contextName}] Failed to update avatar visibility for ${fileId}`, visError, { component: contextName });
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DeviceManager = void 0;
|
|
4
4
|
const protocol_1 = require("@oxyhq/protocol");
|
|
5
|
+
const logger_1 = require("../logger");
|
|
6
|
+
const log = (0, logger_1.createLogger)('DeviceManager');
|
|
5
7
|
/**
|
|
6
8
|
* Client-side device management utility
|
|
7
9
|
* Handles persistent device identification across app sessions
|
|
@@ -31,7 +33,7 @@ class DeviceManager {
|
|
|
31
33
|
};
|
|
32
34
|
}
|
|
33
35
|
catch (error) {
|
|
34
|
-
|
|
36
|
+
log.error('AsyncStorage not available in React Native', error);
|
|
35
37
|
throw new Error('AsyncStorage is required in React Native environment');
|
|
36
38
|
}
|
|
37
39
|
}
|
|
@@ -82,7 +84,7 @@ class DeviceManager {
|
|
|
82
84
|
return await this.createNewDeviceInfo();
|
|
83
85
|
}
|
|
84
86
|
catch (error) {
|
|
85
|
-
|
|
87
|
+
log.error('Error getting device info', error);
|
|
86
88
|
return await this.createNewDeviceInfo();
|
|
87
89
|
}
|
|
88
90
|
}
|
|
@@ -108,7 +110,7 @@ class DeviceManager {
|
|
|
108
110
|
await storage.setItem(this.DEVICE_KEY, JSON.stringify(deviceInfo));
|
|
109
111
|
}
|
|
110
112
|
catch (error) {
|
|
111
|
-
|
|
113
|
+
log.error('Error saving device info', error);
|
|
112
114
|
}
|
|
113
115
|
}
|
|
114
116
|
/**
|
|
@@ -121,7 +123,7 @@ class DeviceManager {
|
|
|
121
123
|
await this.saveDeviceInfo(deviceInfo);
|
|
122
124
|
}
|
|
123
125
|
catch (error) {
|
|
124
|
-
|
|
126
|
+
log.error('Error updating device name', error);
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
129
|
/**
|
|
@@ -133,7 +135,7 @@ class DeviceManager {
|
|
|
133
135
|
await storage.removeItem(this.DEVICE_KEY);
|
|
134
136
|
}
|
|
135
137
|
catch (error) {
|
|
136
|
-
|
|
138
|
+
log.error('Error clearing device info', error);
|
|
137
139
|
}
|
|
138
140
|
}
|
|
139
141
|
/**
|
|
@@ -7,7 +7,7 @@ exports.getErrorCodeFromStatus = getErrorCodeFromStatus;
|
|
|
7
7
|
exports.extractErrorStatus = extractErrorStatus;
|
|
8
8
|
exports.validateRequiredFields = validateRequiredFields;
|
|
9
9
|
exports.logError = logError;
|
|
10
|
-
const
|
|
10
|
+
const logger_1 = require("../logger");
|
|
11
11
|
/**
|
|
12
12
|
* Error handling utilities for consistent error processing
|
|
13
13
|
*/
|
|
@@ -164,14 +164,14 @@ function validateRequiredFields(data, fields) {
|
|
|
164
164
|
*/
|
|
165
165
|
function logError(error, context) {
|
|
166
166
|
if (error instanceof Error) {
|
|
167
|
-
|
|
167
|
+
logger_1.logger.error(error.message, {
|
|
168
168
|
component: context || 'errorUtils',
|
|
169
169
|
method: 'logError',
|
|
170
170
|
stack: error.stack,
|
|
171
171
|
});
|
|
172
172
|
}
|
|
173
173
|
else {
|
|
174
|
-
|
|
174
|
+
logger_1.logger.error(String(error), {
|
|
175
175
|
component: context || 'errorUtils',
|
|
176
176
|
method: 'logError',
|
|
177
177
|
});
|
|
@@ -27,7 +27,7 @@ exports.persistOAuthHandshake = persistOAuthHandshake;
|
|
|
27
27
|
exports.readOAuthHandshake = readOAuthHandshake;
|
|
28
28
|
exports.clearOAuthHandshake = clearOAuthHandshake;
|
|
29
29
|
const protocol_1 = require("@oxyhq/protocol");
|
|
30
|
-
const
|
|
30
|
+
const logger_1 = require("../logger");
|
|
31
31
|
/** The central Oxy IdP authorization endpoint used by default. */
|
|
32
32
|
exports.OXY_AUTHORIZE_URL = 'https://auth.oxy.so/authorize';
|
|
33
33
|
/** Default OAuth scope requested for a "Sign in with Oxy" third-party flow. */
|
|
@@ -60,7 +60,7 @@ async function getSecureRandomBytes(byteLength) {
|
|
|
60
60
|
return Uint8Array.from(nodeCrypto.randomBytes(byteLength));
|
|
61
61
|
}
|
|
62
62
|
catch (error) {
|
|
63
|
-
|
|
63
|
+
logger_1.logger.warn('[oxy.oauth] Node crypto unavailable for PKCE random bytes, falling back to Web Crypto', { component: 'oauthPkce' }, error);
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
const bytes = new Uint8Array(byteLength);
|
|
@@ -178,7 +178,7 @@ function persistOAuthHandshake(state, codeVerifier) {
|
|
|
178
178
|
return true;
|
|
179
179
|
}
|
|
180
180
|
catch (error) {
|
|
181
|
-
|
|
181
|
+
logger_1.logger.warn('Could not persist OAuth handshake to sessionStorage', { component: 'oauthPkce' }, error);
|
|
182
182
|
return false;
|
|
183
183
|
}
|
|
184
184
|
}
|
|
@@ -154,7 +154,7 @@ exports.RequestQueue = RequestQueue;
|
|
|
154
154
|
* Simple logger with level support
|
|
155
155
|
*
|
|
156
156
|
* Lightweight logger for HTTP clients and utilities.
|
|
157
|
-
* For
|
|
157
|
+
* For structured, namespaced, level-gated logging, use `@oxyhq/core/logger`.
|
|
158
158
|
*
|
|
159
159
|
* @example
|
|
160
160
|
* ```typescript
|