@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.
Files changed (96) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/boot/sessionColdBoot.js +3 -3
  3. package/dist/cjs/crypto/keyManager.js +68 -69
  4. package/dist/cjs/crypto/signatureService.js +2 -2
  5. package/dist/cjs/index.js +13 -21
  6. package/dist/cjs/logger/index.js +149 -0
  7. package/dist/cjs/mixins/OxyServices.assets.js +4 -4
  8. package/dist/cjs/mixins/OxyServices.auth.js +2 -2
  9. package/dist/cjs/mixins/OxyServices.language.js +3 -5
  10. package/dist/cjs/mixins/OxyServices.privacy.js +2 -4
  11. package/dist/cjs/mixins/OxyServices.security.js +7 -11
  12. package/dist/cjs/mixins/OxyServices.topics.js +25 -15
  13. package/dist/cjs/mixins/OxyServices.user.js +4 -4
  14. package/dist/cjs/mixins/OxyServices.utility.js +18 -18
  15. package/dist/cjs/session/SessionClient.js +17 -17
  16. package/dist/cjs/session/accountDialogController.js +12 -12
  17. package/dist/cjs/session/authStateStore.js +5 -5
  18. package/dist/cjs/session/refresh.js +4 -4
  19. package/dist/cjs/session/socketLoader.js +2 -2
  20. package/dist/cjs/utils/asyncUtils.js +2 -2
  21. package/dist/cjs/utils/avatarUtils.js +2 -1
  22. package/dist/cjs/utils/deviceManager.js +7 -5
  23. package/dist/cjs/utils/errorUtils.js +3 -3
  24. package/dist/cjs/utils/oauthPkce.js +3 -3
  25. package/dist/cjs/utils/requestUtils.js +1 -1
  26. package/dist/esm/.tsbuildinfo +1 -1
  27. package/dist/esm/boot/sessionColdBoot.js +1 -1
  28. package/dist/esm/crypto/keyManager.js +1 -2
  29. package/dist/esm/crypto/signatureService.js +1 -1
  30. package/dist/esm/index.js +2 -3
  31. package/dist/esm/logger/index.js +140 -0
  32. package/dist/esm/mixins/OxyServices.assets.js +2 -2
  33. package/dist/esm/mixins/OxyServices.auth.js +1 -1
  34. package/dist/esm/mixins/OxyServices.language.js +3 -5
  35. package/dist/esm/mixins/OxyServices.privacy.js +2 -4
  36. package/dist/esm/mixins/OxyServices.security.js +7 -11
  37. package/dist/esm/mixins/OxyServices.topics.js +25 -15
  38. package/dist/esm/mixins/OxyServices.user.js +1 -1
  39. package/dist/esm/mixins/OxyServices.utility.js +1 -1
  40. package/dist/esm/session/SessionClient.js +1 -1
  41. package/dist/esm/session/accountDialogController.js +1 -1
  42. package/dist/esm/session/authStateStore.js +1 -1
  43. package/dist/esm/session/refresh.js +1 -1
  44. package/dist/esm/session/socketLoader.js +1 -1
  45. package/dist/esm/utils/asyncUtils.js +1 -1
  46. package/dist/esm/utils/avatarUtils.js +2 -1
  47. package/dist/esm/utils/deviceManager.js +7 -5
  48. package/dist/esm/utils/errorUtils.js +1 -1
  49. package/dist/esm/utils/oauthPkce.js +1 -1
  50. package/dist/esm/utils/requestUtils.js +1 -1
  51. package/dist/types/.tsbuildinfo +1 -1
  52. package/dist/types/index.d.ts +3 -4
  53. package/dist/types/logger/index.d.ts +104 -0
  54. package/dist/types/mixins/OxyServices.topics.d.ts +3 -3
  55. package/dist/types/models/Topic.d.ts +10 -0
  56. package/dist/types/utils/requestUtils.d.ts +1 -1
  57. package/package.json +16 -1
  58. package/src/boot/sessionColdBoot.ts +1 -1
  59. package/src/crypto/keyManager.ts +1 -2
  60. package/src/crypto/signatureService.ts +1 -1
  61. package/src/index.ts +17 -19
  62. package/src/logger/__tests__/logger.test.ts +207 -0
  63. package/src/logger/index.ts +217 -0
  64. package/src/mixins/OxyServices.assets.ts +3 -3
  65. package/src/mixins/OxyServices.auth.ts +1 -1
  66. package/src/mixins/OxyServices.language.ts +3 -5
  67. package/src/mixins/OxyServices.privacy.ts +2 -4
  68. package/src/mixins/OxyServices.security.ts +7 -11
  69. package/src/mixins/OxyServices.topics.ts +47 -17
  70. package/src/mixins/OxyServices.user.ts +1 -1
  71. package/src/mixins/OxyServices.utility.ts +1 -1
  72. package/src/mixins/__tests__/discoveryErrorHandling.test.ts +1 -1
  73. package/src/mixins/__tests__/topics.test.ts +156 -0
  74. package/src/models/Topic.ts +11 -0
  75. package/src/session/SessionClient.ts +1 -1
  76. package/src/session/__tests__/SessionClient.diagnostics.test.ts +1 -1
  77. package/src/session/__tests__/accountDialogController.test.ts +1 -1
  78. package/src/session/accountDialogController.ts +1 -1
  79. package/src/session/authStateStore.ts +1 -1
  80. package/src/session/refresh.ts +1 -1
  81. package/src/session/socketLoader.ts +1 -1
  82. package/src/utils/asyncUtils.ts +1 -1
  83. package/src/utils/avatarUtils.ts +3 -1
  84. package/src/utils/deviceManager.ts +8 -5
  85. package/src/utils/errorUtils.ts +1 -1
  86. package/src/utils/oauthPkce.ts +1 -1
  87. package/src/utils/requestUtils.ts +1 -1
  88. package/dist/cjs/shared/utils/debugUtils.js +0 -80
  89. package/dist/cjs/utils/loggerUtils.js +0 -126
  90. package/dist/esm/shared/utils/debugUtils.js +0 -72
  91. package/dist/esm/utils/loggerUtils.js +0 -115
  92. package/dist/types/shared/utils/debugUtils.d.ts +0 -48
  93. package/dist/types/utils/loggerUtils.d.ts +0 -48
  94. package/src/shared/utils/__tests__/debugUtils.test.ts +0 -55
  95. package/src/shared/utils/debugUtils.ts +0 -78
  96. package/src/utils/loggerUtils.ts +0 -153
@@ -5,7 +5,7 @@ import type { SessionLoginResponse, MinimalUserData } from '../../models/session
5
5
  import type { AccountNode } from '../../mixins/OxyServices.accounts';
6
6
  import { SessionClient, type SessionClientHost } from '../SessionClient';
7
7
  import type { MinimalSocket, SocketIOFactory } from '../socketLoader';
8
- import { logger } from '../../utils/loggerUtils';
8
+ import { logger } from '../../logger';
9
9
  import {
10
10
  AccountDialogController,
11
11
  createAccountDialogController,
@@ -29,7 +29,7 @@
29
29
  import type { OxyServices } from '../OxyServices';
30
30
  import type { SessionLoginResponse, MinimalUserData } from '../models/session';
31
31
  import type { User } from '../models/interfaces';
32
- import { logger } from '../utils/loggerUtils';
32
+ import { logger } from '../logger';
33
33
  import { extractErrorStatus } from '../utils/errorUtils';
34
34
  import { CENTRAL_IDP_APEX } from '../utils/authWebUrl';
35
35
  import {
@@ -17,7 +17,7 @@
17
17
  * ESM-safe (no `require()`).
18
18
  */
19
19
 
20
- import { logger } from '../utils/loggerUtils';
20
+ import { logger } from '../logger';
21
21
 
22
22
  /**
23
23
  * The persisted session credential set for a single origin.
@@ -26,7 +26,7 @@ import type { AuthRefreshHandler, AuthRefreshReason } from '../HttpService';
26
26
  import type { AuthStateStore, PersistedAuthState } from './authStateStore';
27
27
  import { isNative } from '../utils/platform';
28
28
  import { extractErrorStatus } from '../utils/errorUtils';
29
- import { logger } from '../utils/loggerUtils';
29
+ import { logger } from '../logger';
30
30
 
31
31
  /**
32
32
  * Lead time (ms) before access-token expiry at which the proactive scheduler
@@ -1,4 +1,4 @@
1
- import { logger } from '../utils/loggerUtils';
1
+ import { logger } from '../logger';
2
2
 
3
3
  export interface MinimalSocket {
4
4
  connected: boolean;
@@ -2,7 +2,7 @@
2
2
  * Async utilities for common asynchronous patterns and error handling
3
3
  */
4
4
 
5
- import { logger } from './loggerUtils';
5
+ import { logger } from '../logger';
6
6
 
7
7
  /**
8
8
  * Wrapper for async operations with automatic error handling
@@ -1,3 +1,5 @@
1
+ import { logger } from '../logger';
2
+
1
3
  /**
2
4
  * Minimal interface for services that can update asset visibility.
3
5
  * Kept loose to avoid mixin type-inference issues with the OxyServices class.
@@ -31,7 +33,7 @@ export async function updateAvatarVisibility(
31
33
  ? (visError as Error & { status: number }).status
32
34
  : undefined;
33
35
  if (status !== 404) {
34
- console.error(`[${contextName}] Failed to update avatar visibility for ${fileId}:`, visError);
36
+ logger.error(`[${contextName}] Failed to update avatar visibility for ${fileId}`, visError, { component: contextName });
35
37
  }
36
38
  }
37
39
  }
@@ -1,4 +1,7 @@
1
1
  import { loadAsyncStorage } from '@oxyhq/protocol';
2
+ import { createLogger } from '../logger';
3
+
4
+ const log = createLogger('DeviceManager');
2
5
 
3
6
  export interface DeviceFingerprint {
4
7
  userAgent: string;
@@ -55,7 +58,7 @@ export class DeviceManager {
55
58
  removeItem: storage.removeItem.bind(storage),
56
59
  };
57
60
  } catch (error) {
58
- console.error('AsyncStorage not available in React Native:', error);
61
+ log.error('AsyncStorage not available in React Native', error);
59
62
  throw new Error('AsyncStorage is required in React Native environment');
60
63
  }
61
64
  } else {
@@ -112,7 +115,7 @@ export class DeviceManager {
112
115
  // Create new device info
113
116
  return await this.createNewDeviceInfo();
114
117
  } catch (error) {
115
- console.error('Error getting device info:', error);
118
+ log.error('Error getting device info', error);
116
119
  return await this.createNewDeviceInfo();
117
120
  }
118
121
  }
@@ -140,7 +143,7 @@ export class DeviceManager {
140
143
  const storage = await this.getStorage();
141
144
  await storage.setItem(this.DEVICE_KEY, JSON.stringify(deviceInfo));
142
145
  } catch (error) {
143
- console.error('Error saving device info:', error);
146
+ log.error('Error saving device info', error);
144
147
  }
145
148
  }
146
149
 
@@ -153,7 +156,7 @@ export class DeviceManager {
153
156
  deviceInfo.deviceName = deviceName;
154
157
  await this.saveDeviceInfo(deviceInfo);
155
158
  } catch (error) {
156
- console.error('Error updating device name:', error);
159
+ log.error('Error updating device name', error);
157
160
  }
158
161
  }
159
162
 
@@ -165,7 +168,7 @@ export class DeviceManager {
165
168
  const storage = await this.getStorage();
166
169
  await storage.removeItem(this.DEVICE_KEY);
167
170
  } catch (error) {
168
- console.error('Error clearing device info:', error);
171
+ log.error('Error clearing device info', error);
169
172
  }
170
173
  }
171
174
 
@@ -1,5 +1,5 @@
1
1
  import type { ApiError } from '../models/interfaces';
2
- import { logger } from './loggerUtils';
2
+ import { logger } from '../logger';
3
3
 
4
4
  /**
5
5
  * Error handling utilities for consistent error processing
@@ -17,7 +17,7 @@
17
17
  */
18
18
 
19
19
  import { isNodeJS, isReactNative, loadExpoCrypto, loadNodeCrypto, sha256 } from '@oxyhq/protocol';
20
- import { logger } from './loggerUtils';
20
+ import { logger } from '../logger';
21
21
 
22
22
  /** The central Oxy IdP authorization endpoint used by default. */
23
23
  export const OXY_AUTHORIZE_URL = 'https://auth.oxy.so/authorize';
@@ -169,7 +169,7 @@ export type LogLevel = 'none' | 'error' | 'warn' | 'info' | 'debug';
169
169
  * Simple logger with level support
170
170
  *
171
171
  * Lightweight logger for HTTP clients and utilities.
172
- * For more advanced logging, use loggerUtils.ts
172
+ * For structured, namespaced, level-gated logging, use `@oxyhq/core/logger`.
173
173
  *
174
174
  * @example
175
175
  * ```typescript
@@ -1,80 +0,0 @@
1
- "use strict";
2
- /**
3
- * Debug Utilities
4
- *
5
- * Provides safe logging functions that only output in development mode.
6
- * All logs are stripped in production builds.
7
- *
8
- * @module shared/utils/debugUtils
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.createDebugLogger = exports.debugError = exports.debugWarn = exports.debugLog = exports.isDev = void 0;
12
- /**
13
- * Check if running in development mode
14
- */
15
- const isDev = () => {
16
- if (typeof __DEV__ !== 'undefined')
17
- return __DEV__;
18
- try {
19
- return typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';
20
- }
21
- catch {
22
- return false;
23
- }
24
- };
25
- exports.isDev = isDev;
26
- /**
27
- * Log a debug message (only in development)
28
- * @param prefix - Log prefix (e.g., '[ColdBoot]')
29
- * @param args - Arguments to log
30
- */
31
- const debugLog = (prefix, ...args) => {
32
- if ((0, exports.isDev)()) {
33
- console.log(prefix, ...args);
34
- }
35
- };
36
- exports.debugLog = debugLog;
37
- /**
38
- * Log a debug warning (only in development)
39
- * @param prefix - Log prefix
40
- * @param args - Arguments to log
41
- */
42
- const debugWarn = (prefix, ...args) => {
43
- if ((0, exports.isDev)()) {
44
- console.warn(prefix, ...args);
45
- }
46
- };
47
- exports.debugWarn = debugWarn;
48
- /**
49
- * Log a debug error (only in development)
50
- * @param prefix - Log prefix
51
- * @param args - Arguments to log
52
- */
53
- const debugError = (prefix, ...args) => {
54
- if ((0, exports.isDev)()) {
55
- console.error(prefix, ...args);
56
- }
57
- };
58
- exports.debugError = debugError;
59
- /**
60
- * Create a namespaced debug logger
61
- * @param namespace - Logger namespace (e.g., 'ColdBoot', 'DeviceAuth')
62
- * @returns Object with log, warn, error methods
63
- *
64
- * @example
65
- * ```ts
66
- * const debug = createDebugLogger('ColdBoot');
67
- * debug.log('Starting authentication');
68
- * debug.warn('Token expires soon');
69
- * debug.error('Authentication failed', error);
70
- * ```
71
- */
72
- const createDebugLogger = (namespace) => {
73
- const prefix = `[${namespace}]`;
74
- return {
75
- log: (...args) => (0, exports.debugLog)(prefix, ...args),
76
- warn: (...args) => (0, exports.debugWarn)(prefix, ...args),
77
- error: (...args) => (0, exports.debugError)(prefix, ...args),
78
- };
79
- };
80
- exports.createDebugLogger = createDebugLogger;
@@ -1,126 +0,0 @@
1
- "use strict";
2
- /**
3
- * Centralized logging utilities for consistent logging across the application
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.logPerformance = exports.logError = exports.logPayment = exports.logDevice = exports.logUser = exports.logSession = exports.logApi = exports.logAuth = exports.logger = exports.LogLevel = void 0;
7
- var LogLevel;
8
- (function (LogLevel) {
9
- LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
10
- LogLevel[LogLevel["INFO"] = 1] = "INFO";
11
- LogLevel[LogLevel["WARN"] = 2] = "WARN";
12
- LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
13
- LogLevel[LogLevel["NONE"] = 4] = "NONE";
14
- })(LogLevel || (exports.LogLevel = LogLevel = {}));
15
- class Logger {
16
- constructor() {
17
- this.level = LogLevel.INFO;
18
- this.isDevelopment = process.env.NODE_ENV === 'development';
19
- }
20
- setLevel(level) {
21
- this.level = level;
22
- }
23
- shouldLog(level) {
24
- return level >= this.level;
25
- }
26
- formatMessage(level, message, context) {
27
- const timestamp = new Date().toISOString();
28
- const contextStr = context ? ` [${Object.entries(context).map(([k, v]) => `${k}:${v}`).join(', ')}]` : '';
29
- return `[${timestamp}] ${level}${contextStr}: ${message}`;
30
- }
31
- debug(message, context, ...args) {
32
- if (this.shouldLog(LogLevel.DEBUG)) {
33
- const formattedMessage = this.formatMessage('DEBUG', message, context);
34
- if (this.isDevelopment) {
35
- console.log(formattedMessage, ...args);
36
- }
37
- }
38
- }
39
- info(message, context, ...args) {
40
- if (this.shouldLog(LogLevel.INFO)) {
41
- const formattedMessage = this.formatMessage('INFO', message, context);
42
- console.log(formattedMessage, ...args);
43
- }
44
- }
45
- warn(message, context, ...args) {
46
- if (this.shouldLog(LogLevel.WARN)) {
47
- const formattedMessage = this.formatMessage('WARN', message, context);
48
- console.warn(formattedMessage, ...args);
49
- }
50
- }
51
- error(message, error, context, ...args) {
52
- if (this.shouldLog(LogLevel.ERROR)) {
53
- const formattedMessage = this.formatMessage('ERROR', message, context);
54
- if (error) {
55
- console.error(formattedMessage, error, ...args);
56
- }
57
- else {
58
- console.error(formattedMessage, ...args);
59
- }
60
- }
61
- }
62
- // Specialized logging methods for common patterns
63
- auth(message, context, ...args) {
64
- this.info(`🔐 ${message}`, { ...context, category: 'auth' }, ...args);
65
- }
66
- api(message, context, ...args) {
67
- this.info(`🌐 ${message}`, { ...context, category: 'api' }, ...args);
68
- }
69
- session(message, context, ...args) {
70
- this.info(`📱 ${message}`, { ...context, category: 'session' }, ...args);
71
- }
72
- user(message, context, ...args) {
73
- this.info(`👤 ${message}`, { ...context, category: 'user' }, ...args);
74
- }
75
- device(message, context, ...args) {
76
- this.info(`📱 ${message}`, { ...context, category: 'device' }, ...args);
77
- }
78
- payment(message, context, ...args) {
79
- this.info(`💳 ${message}`, { ...context, category: 'payment' }, ...args);
80
- }
81
- // Performance logging
82
- performance(operation, duration, context) {
83
- const level = duration > 1000 ? LogLevel.WARN : LogLevel.INFO;
84
- const message = `⏱️ ${operation} completed in ${duration}ms`;
85
- if (level === LogLevel.WARN) {
86
- this.warn(message, { ...context, category: 'performance', duration });
87
- }
88
- else {
89
- this.info(message, { ...context, category: 'performance', duration });
90
- }
91
- }
92
- // Error logging with stack trace
93
- errorWithStack(message, error, context) {
94
- this.error(message, error, { ...context, stack: error.stack });
95
- }
96
- // Group related log messages
97
- group(label, fn) {
98
- if (this.isDevelopment && this.shouldLog(LogLevel.DEBUG)) {
99
- console.group(label);
100
- fn();
101
- console.groupEnd();
102
- }
103
- else {
104
- fn();
105
- }
106
- }
107
- }
108
- // Create singleton instance
109
- exports.logger = new Logger();
110
- // Convenience functions for common logging patterns
111
- const logAuth = (message, context, ...args) => exports.logger.auth(message, context, ...args);
112
- exports.logAuth = logAuth;
113
- const logApi = (message, context, ...args) => exports.logger.api(message, context, ...args);
114
- exports.logApi = logApi;
115
- const logSession = (message, context, ...args) => exports.logger.session(message, context, ...args);
116
- exports.logSession = logSession;
117
- const logUser = (message, context, ...args) => exports.logger.user(message, context, ...args);
118
- exports.logUser = logUser;
119
- const logDevice = (message, context, ...args) => exports.logger.device(message, context, ...args);
120
- exports.logDevice = logDevice;
121
- const logPayment = (message, context, ...args) => exports.logger.payment(message, context, ...args);
122
- exports.logPayment = logPayment;
123
- const logError = (message, error, context, ...args) => exports.logger.error(message, error, context, ...args);
124
- exports.logError = logError;
125
- const logPerformance = (operation, duration, context) => exports.logger.performance(operation, duration, context);
126
- exports.logPerformance = logPerformance;
@@ -1,72 +0,0 @@
1
- /**
2
- * Debug Utilities
3
- *
4
- * Provides safe logging functions that only output in development mode.
5
- * All logs are stripped in production builds.
6
- *
7
- * @module shared/utils/debugUtils
8
- */
9
- /**
10
- * Check if running in development mode
11
- */
12
- export const isDev = () => {
13
- if (typeof __DEV__ !== 'undefined')
14
- return __DEV__;
15
- try {
16
- return typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';
17
- }
18
- catch {
19
- return false;
20
- }
21
- };
22
- /**
23
- * Log a debug message (only in development)
24
- * @param prefix - Log prefix (e.g., '[ColdBoot]')
25
- * @param args - Arguments to log
26
- */
27
- export const debugLog = (prefix, ...args) => {
28
- if (isDev()) {
29
- console.log(prefix, ...args);
30
- }
31
- };
32
- /**
33
- * Log a debug warning (only in development)
34
- * @param prefix - Log prefix
35
- * @param args - Arguments to log
36
- */
37
- export const debugWarn = (prefix, ...args) => {
38
- if (isDev()) {
39
- console.warn(prefix, ...args);
40
- }
41
- };
42
- /**
43
- * Log a debug error (only in development)
44
- * @param prefix - Log prefix
45
- * @param args - Arguments to log
46
- */
47
- export const debugError = (prefix, ...args) => {
48
- if (isDev()) {
49
- console.error(prefix, ...args);
50
- }
51
- };
52
- /**
53
- * Create a namespaced debug logger
54
- * @param namespace - Logger namespace (e.g., 'ColdBoot', 'DeviceAuth')
55
- * @returns Object with log, warn, error methods
56
- *
57
- * @example
58
- * ```ts
59
- * const debug = createDebugLogger('ColdBoot');
60
- * debug.log('Starting authentication');
61
- * debug.warn('Token expires soon');
62
- * debug.error('Authentication failed', error);
63
- * ```
64
- */
65
- export const createDebugLogger = (namespace) => {
66
- const prefix = `[${namespace}]`;
67
- return {
68
- log: (...args) => debugLog(prefix, ...args),
69
- warn: (...args) => debugWarn(prefix, ...args),
70
- error: (...args) => debugError(prefix, ...args),
71
- };
72
- };
@@ -1,115 +0,0 @@
1
- /**
2
- * Centralized logging utilities for consistent logging across the application
3
- */
4
- export var LogLevel;
5
- (function (LogLevel) {
6
- LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
7
- LogLevel[LogLevel["INFO"] = 1] = "INFO";
8
- LogLevel[LogLevel["WARN"] = 2] = "WARN";
9
- LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
10
- LogLevel[LogLevel["NONE"] = 4] = "NONE";
11
- })(LogLevel || (LogLevel = {}));
12
- class Logger {
13
- constructor() {
14
- this.level = LogLevel.INFO;
15
- this.isDevelopment = process.env.NODE_ENV === 'development';
16
- }
17
- setLevel(level) {
18
- this.level = level;
19
- }
20
- shouldLog(level) {
21
- return level >= this.level;
22
- }
23
- formatMessage(level, message, context) {
24
- const timestamp = new Date().toISOString();
25
- const contextStr = context ? ` [${Object.entries(context).map(([k, v]) => `${k}:${v}`).join(', ')}]` : '';
26
- return `[${timestamp}] ${level}${contextStr}: ${message}`;
27
- }
28
- debug(message, context, ...args) {
29
- if (this.shouldLog(LogLevel.DEBUG)) {
30
- const formattedMessage = this.formatMessage('DEBUG', message, context);
31
- if (this.isDevelopment) {
32
- console.log(formattedMessage, ...args);
33
- }
34
- }
35
- }
36
- info(message, context, ...args) {
37
- if (this.shouldLog(LogLevel.INFO)) {
38
- const formattedMessage = this.formatMessage('INFO', message, context);
39
- console.log(formattedMessage, ...args);
40
- }
41
- }
42
- warn(message, context, ...args) {
43
- if (this.shouldLog(LogLevel.WARN)) {
44
- const formattedMessage = this.formatMessage('WARN', message, context);
45
- console.warn(formattedMessage, ...args);
46
- }
47
- }
48
- error(message, error, context, ...args) {
49
- if (this.shouldLog(LogLevel.ERROR)) {
50
- const formattedMessage = this.formatMessage('ERROR', message, context);
51
- if (error) {
52
- console.error(formattedMessage, error, ...args);
53
- }
54
- else {
55
- console.error(formattedMessage, ...args);
56
- }
57
- }
58
- }
59
- // Specialized logging methods for common patterns
60
- auth(message, context, ...args) {
61
- this.info(`🔐 ${message}`, { ...context, category: 'auth' }, ...args);
62
- }
63
- api(message, context, ...args) {
64
- this.info(`🌐 ${message}`, { ...context, category: 'api' }, ...args);
65
- }
66
- session(message, context, ...args) {
67
- this.info(`📱 ${message}`, { ...context, category: 'session' }, ...args);
68
- }
69
- user(message, context, ...args) {
70
- this.info(`👤 ${message}`, { ...context, category: 'user' }, ...args);
71
- }
72
- device(message, context, ...args) {
73
- this.info(`📱 ${message}`, { ...context, category: 'device' }, ...args);
74
- }
75
- payment(message, context, ...args) {
76
- this.info(`💳 ${message}`, { ...context, category: 'payment' }, ...args);
77
- }
78
- // Performance logging
79
- performance(operation, duration, context) {
80
- const level = duration > 1000 ? LogLevel.WARN : LogLevel.INFO;
81
- const message = `⏱️ ${operation} completed in ${duration}ms`;
82
- if (level === LogLevel.WARN) {
83
- this.warn(message, { ...context, category: 'performance', duration });
84
- }
85
- else {
86
- this.info(message, { ...context, category: 'performance', duration });
87
- }
88
- }
89
- // Error logging with stack trace
90
- errorWithStack(message, error, context) {
91
- this.error(message, error, { ...context, stack: error.stack });
92
- }
93
- // Group related log messages
94
- group(label, fn) {
95
- if (this.isDevelopment && this.shouldLog(LogLevel.DEBUG)) {
96
- console.group(label);
97
- fn();
98
- console.groupEnd();
99
- }
100
- else {
101
- fn();
102
- }
103
- }
104
- }
105
- // Create singleton instance
106
- export const logger = new Logger();
107
- // Convenience functions for common logging patterns
108
- export const logAuth = (message, context, ...args) => logger.auth(message, context, ...args);
109
- export const logApi = (message, context, ...args) => logger.api(message, context, ...args);
110
- export const logSession = (message, context, ...args) => logger.session(message, context, ...args);
111
- export const logUser = (message, context, ...args) => logger.user(message, context, ...args);
112
- export const logDevice = (message, context, ...args) => logger.device(message, context, ...args);
113
- export const logPayment = (message, context, ...args) => logger.payment(message, context, ...args);
114
- export const logError = (message, error, context, ...args) => logger.error(message, error, context, ...args);
115
- export const logPerformance = (operation, duration, context) => logger.performance(operation, duration, context);
@@ -1,48 +0,0 @@
1
- /**
2
- * Debug Utilities
3
- *
4
- * Provides safe logging functions that only output in development mode.
5
- * All logs are stripped in production builds.
6
- *
7
- * @module shared/utils/debugUtils
8
- */
9
- /**
10
- * Check if running in development mode
11
- */
12
- export declare const isDev: () => boolean;
13
- /**
14
- * Log a debug message (only in development)
15
- * @param prefix - Log prefix (e.g., '[ColdBoot]')
16
- * @param args - Arguments to log
17
- */
18
- export declare const debugLog: (prefix: string, ...args: unknown[]) => void;
19
- /**
20
- * Log a debug warning (only in development)
21
- * @param prefix - Log prefix
22
- * @param args - Arguments to log
23
- */
24
- export declare const debugWarn: (prefix: string, ...args: unknown[]) => void;
25
- /**
26
- * Log a debug error (only in development)
27
- * @param prefix - Log prefix
28
- * @param args - Arguments to log
29
- */
30
- export declare const debugError: (prefix: string, ...args: unknown[]) => void;
31
- /**
32
- * Create a namespaced debug logger
33
- * @param namespace - Logger namespace (e.g., 'ColdBoot', 'DeviceAuth')
34
- * @returns Object with log, warn, error methods
35
- *
36
- * @example
37
- * ```ts
38
- * const debug = createDebugLogger('ColdBoot');
39
- * debug.log('Starting authentication');
40
- * debug.warn('Token expires soon');
41
- * debug.error('Authentication failed', error);
42
- * ```
43
- */
44
- export declare const createDebugLogger: (namespace: string) => {
45
- log: (...args: unknown[]) => void;
46
- warn: (...args: unknown[]) => void;
47
- error: (...args: unknown[]) => void;
48
- };
@@ -1,48 +0,0 @@
1
- /**
2
- * Centralized logging utilities for consistent logging across the application
3
- */
4
- export declare enum LogLevel {
5
- DEBUG = 0,
6
- INFO = 1,
7
- WARN = 2,
8
- ERROR = 3,
9
- NONE = 4
10
- }
11
- export interface LogContext {
12
- component?: string;
13
- method?: string;
14
- userId?: string;
15
- sessionId?: string;
16
- requestId?: string;
17
- [key: string]: unknown;
18
- }
19
- declare class Logger {
20
- private level;
21
- private isDevelopment;
22
- setLevel(level: LogLevel): void;
23
- private shouldLog;
24
- private formatMessage;
25
- debug(message: string, context?: LogContext, ...args: unknown[]): void;
26
- info(message: string, context?: LogContext, ...args: unknown[]): void;
27
- warn(message: string, context?: LogContext, ...args: unknown[]): void;
28
- error(message: string, error?: Error | unknown, context?: LogContext, ...args: unknown[]): void;
29
- auth(message: string, context?: LogContext, ...args: unknown[]): void;
30
- api(message: string, context?: LogContext, ...args: unknown[]): void;
31
- session(message: string, context?: LogContext, ...args: unknown[]): void;
32
- user(message: string, context?: LogContext, ...args: unknown[]): void;
33
- device(message: string, context?: LogContext, ...args: unknown[]): void;
34
- payment(message: string, context?: LogContext, ...args: unknown[]): void;
35
- performance(operation: string, duration: number, context?: LogContext): void;
36
- errorWithStack(message: string, error: Error, context?: LogContext): void;
37
- group(label: string, fn: () => void): void;
38
- }
39
- export declare const logger: Logger;
40
- export declare const logAuth: (message: string, context?: LogContext, ...args: unknown[]) => void;
41
- export declare const logApi: (message: string, context?: LogContext, ...args: unknown[]) => void;
42
- export declare const logSession: (message: string, context?: LogContext, ...args: unknown[]) => void;
43
- export declare const logUser: (message: string, context?: LogContext, ...args: unknown[]) => void;
44
- export declare const logDevice: (message: string, context?: LogContext, ...args: unknown[]) => void;
45
- export declare const logPayment: (message: string, context?: LogContext, ...args: unknown[]) => void;
46
- export declare const logError: (message: string, error?: Error | unknown, context?: LogContext, ...args: unknown[]) => void;
47
- export declare const logPerformance: (operation: string, duration: number, context?: LogContext) => void;
48
- export {};