@codixus/client 0.1.4 → 0.1.6
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/index.cjs +161 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +40 -2
- package/dist/index.d.ts +40 -2
- package/dist/index.js +161 -37
- package/dist/index.js.map +1 -1
- package/dist/push-expo/index.cjs +123 -0
- package/dist/push-expo/index.cjs.map +1 -0
- package/dist/push-expo/index.d.cts +8 -0
- package/dist/push-expo/index.d.ts +8 -0
- package/dist/push-expo/index.js +88 -0
- package/dist/push-expo/index.js.map +1 -0
- package/dist/react/index.d.cts +3 -2
- package/dist/react/index.d.ts +3 -2
- package/dist/types-maS8y9s9.d.cts +14 -0
- package/dist/types-maS8y9s9.d.ts +14 -0
- package/package.json +15 -4
package/dist/index.cjs
CHANGED
|
@@ -41,10 +41,13 @@ module.exports = __toCommonJS(index_exports);
|
|
|
41
41
|
|
|
42
42
|
// src/auth/auth-manager.ts
|
|
43
43
|
var AuthManager = class {
|
|
44
|
-
constructor(storage, storageKey) {
|
|
44
|
+
constructor(storage, storageKey, options) {
|
|
45
45
|
this.storage = storage;
|
|
46
46
|
this.storageKey = storageKey;
|
|
47
|
+
this.deviceIdProvider = options?.deviceIdProvider ?? null;
|
|
48
|
+
this.autoSignInConfig = options?.autoSignIn ?? null;
|
|
47
49
|
}
|
|
50
|
+
storage;
|
|
48
51
|
accessToken = null;
|
|
49
52
|
refreshTokenValue = null;
|
|
50
53
|
user = null;
|
|
@@ -53,45 +56,72 @@ var AuthManager = class {
|
|
|
53
56
|
storageKey;
|
|
54
57
|
api;
|
|
55
58
|
deviceId = null;
|
|
59
|
+
deviceIdProvider;
|
|
60
|
+
autoSignInConfig;
|
|
61
|
+
initPromise = null;
|
|
62
|
+
signInPromise = null;
|
|
56
63
|
/** @internal */
|
|
57
64
|
_setApi(api) {
|
|
58
65
|
this.api = api;
|
|
59
66
|
}
|
|
60
67
|
async init() {
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
if (this.initPromise) return this.initPromise;
|
|
69
|
+
this.initPromise = this._init().catch((err) => {
|
|
70
|
+
this.initPromise = null;
|
|
71
|
+
throw err;
|
|
72
|
+
});
|
|
73
|
+
return this.initPromise;
|
|
74
|
+
}
|
|
75
|
+
async _init() {
|
|
76
|
+
if (this.storage) {
|
|
77
|
+
try {
|
|
78
|
+
const storedRefresh = await this.storage.getItem(
|
|
79
|
+
`${this.storageKey}_refresh_token`
|
|
80
|
+
);
|
|
81
|
+
const storedUser = await this.storage.getItem(
|
|
82
|
+
`${this.storageKey}_user`
|
|
83
|
+
);
|
|
84
|
+
const storedDeviceId = await this.storage.getItem(
|
|
85
|
+
`${this.storageKey}_device_id`
|
|
86
|
+
);
|
|
87
|
+
if (storedRefresh) {
|
|
88
|
+
this.refreshTokenValue = storedRefresh;
|
|
89
|
+
}
|
|
90
|
+
if (storedUser) {
|
|
91
|
+
try {
|
|
92
|
+
this.user = JSON.parse(storedUser);
|
|
93
|
+
} catch {
|
|
94
|
+
}
|
|
82
95
|
}
|
|
96
|
+
if (storedDeviceId) {
|
|
97
|
+
this.deviceId = storedDeviceId;
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.warn("[CodixusClient] Failed to restore auth state from storage:", error);
|
|
83
101
|
}
|
|
84
|
-
|
|
85
|
-
|
|
102
|
+
}
|
|
103
|
+
if (this.autoSignInConfig?.enabled && !this.refreshTokenValue) {
|
|
104
|
+
try {
|
|
105
|
+
const deviceInfo = await this.autoSignInConfig.getDeviceInfo();
|
|
106
|
+
const metadata = this.autoSignInConfig.getMetadata ? await this.autoSignInConfig.getMetadata() : void 0;
|
|
107
|
+
await this.signIn({ deviceInfo, metadata });
|
|
108
|
+
} catch (error) {
|
|
109
|
+
this.autoSignInConfig.onError?.(error);
|
|
86
110
|
}
|
|
87
|
-
} catch (error) {
|
|
88
|
-
console.warn("[CodixusClient] Failed to restore auth state from storage:", error);
|
|
89
111
|
}
|
|
90
112
|
this._isLoading = false;
|
|
91
113
|
this.notify();
|
|
92
114
|
}
|
|
93
115
|
async signIn(params) {
|
|
94
|
-
|
|
116
|
+
if (this.signInPromise) return this.signInPromise;
|
|
117
|
+
this.signInPromise = this._signIn(params).finally(() => {
|
|
118
|
+
this.signInPromise = null;
|
|
119
|
+
});
|
|
120
|
+
return this.signInPromise;
|
|
121
|
+
}
|
|
122
|
+
async _signIn(params) {
|
|
123
|
+
const providerId = this.deviceIdProvider ? await this.deviceIdProvider.getDeviceId() : null;
|
|
124
|
+
const deviceId = params.deviceId ?? this.deviceId ?? providerId ?? this.generateDeviceId();
|
|
95
125
|
const response = await this.api.post("/auth/token", {
|
|
96
126
|
deviceId,
|
|
97
127
|
deviceInfo: params.deviceInfo,
|
|
@@ -103,15 +133,19 @@ var AuthManager = class {
|
|
|
103
133
|
this.user = data.user;
|
|
104
134
|
this.deviceId = deviceId;
|
|
105
135
|
if (this.storage) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
136
|
+
try {
|
|
137
|
+
await this.storage.setItem(
|
|
138
|
+
`${this.storageKey}_refresh_token`,
|
|
139
|
+
data.refreshToken
|
|
140
|
+
);
|
|
141
|
+
await this.storage.setItem(
|
|
142
|
+
`${this.storageKey}_user`,
|
|
143
|
+
JSON.stringify(data.user)
|
|
144
|
+
);
|
|
145
|
+
await this.storage.setItem(`${this.storageKey}_device_id`, deviceId);
|
|
146
|
+
} catch (error) {
|
|
147
|
+
console.warn("[CodixusClient] Failed to persist auth state:", error);
|
|
148
|
+
}
|
|
115
149
|
}
|
|
116
150
|
this.notify();
|
|
117
151
|
return { user: data.user, isNewUser: data.isNewUser };
|
|
@@ -160,6 +194,8 @@ var AuthManager = class {
|
|
|
160
194
|
this.accessToken = null;
|
|
161
195
|
this.refreshTokenValue = null;
|
|
162
196
|
this.user = null;
|
|
197
|
+
this.initPromise = null;
|
|
198
|
+
this.signInPromise = null;
|
|
163
199
|
if (this.storage) {
|
|
164
200
|
await this.storage.removeItem(`${this.storageKey}_refresh_token`);
|
|
165
201
|
await this.storage.removeItem(`${this.storageKey}_user`);
|
|
@@ -274,6 +310,7 @@ var ApiClient = class {
|
|
|
274
310
|
}
|
|
275
311
|
);
|
|
276
312
|
}
|
|
313
|
+
authManager;
|
|
277
314
|
instance;
|
|
278
315
|
refreshPromise = null;
|
|
279
316
|
appSecret;
|
|
@@ -300,6 +337,8 @@ var Collection = class {
|
|
|
300
337
|
this.api = api;
|
|
301
338
|
this.basePath = basePath;
|
|
302
339
|
}
|
|
340
|
+
api;
|
|
341
|
+
basePath;
|
|
303
342
|
async find(filter, options) {
|
|
304
343
|
const params = new URLSearchParams();
|
|
305
344
|
if (filter && Object.keys(filter).length > 0) {
|
|
@@ -364,17 +403,102 @@ var Collection = class {
|
|
|
364
403
|
}
|
|
365
404
|
};
|
|
366
405
|
|
|
406
|
+
// src/push/push-manager.ts
|
|
407
|
+
function extractDeliveryId(payload) {
|
|
408
|
+
if (typeof payload.deliveryId === "string" && payload.deliveryId) {
|
|
409
|
+
return payload.deliveryId;
|
|
410
|
+
}
|
|
411
|
+
const data = payload.data;
|
|
412
|
+
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
413
|
+
const nested = data.deliveryId;
|
|
414
|
+
if (typeof nested === "string" && nested) {
|
|
415
|
+
return nested;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return void 0;
|
|
419
|
+
}
|
|
420
|
+
var PushManager = class {
|
|
421
|
+
constructor(adapter, api, auth) {
|
|
422
|
+
this.adapter = adapter;
|
|
423
|
+
this.api = api;
|
|
424
|
+
this.auth = auth;
|
|
425
|
+
}
|
|
426
|
+
adapter;
|
|
427
|
+
api;
|
|
428
|
+
auth;
|
|
429
|
+
async register() {
|
|
430
|
+
const authToken = await this.auth.getToken();
|
|
431
|
+
if (!authToken) {
|
|
432
|
+
throw new Error("Not authenticated");
|
|
433
|
+
}
|
|
434
|
+
const adapterToken = await this.adapter.getToken();
|
|
435
|
+
if (!adapterToken) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
const body = {
|
|
439
|
+
token: adapterToken.token,
|
|
440
|
+
provider: adapterToken.provider,
|
|
441
|
+
platform: adapterToken.platform
|
|
442
|
+
};
|
|
443
|
+
try {
|
|
444
|
+
body.permissionStatus = await this.adapter.getPermissionStatus();
|
|
445
|
+
} catch {
|
|
446
|
+
}
|
|
447
|
+
await this.api.post("/push/register", body);
|
|
448
|
+
}
|
|
449
|
+
async unregister() {
|
|
450
|
+
const authToken = await this.auth.getToken();
|
|
451
|
+
if (!authToken) {
|
|
452
|
+
throw new Error("Not authenticated");
|
|
453
|
+
}
|
|
454
|
+
await this.api.post("/push/unregister", {});
|
|
455
|
+
}
|
|
456
|
+
async requestPermission() {
|
|
457
|
+
return this.adapter.requestPermission();
|
|
458
|
+
}
|
|
459
|
+
async getPermissionStatus() {
|
|
460
|
+
return this.adapter.getPermissionStatus();
|
|
461
|
+
}
|
|
462
|
+
addNotificationOpenedListener(handler) {
|
|
463
|
+
return this.adapter.addNotificationOpenedListener((payload) => {
|
|
464
|
+
handler(payload);
|
|
465
|
+
const deliveryId = extractDeliveryId(payload);
|
|
466
|
+
if (deliveryId) {
|
|
467
|
+
void this.reportOpen(deliveryId);
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
addNotificationReceivedListener(handler) {
|
|
472
|
+
return this.adapter.addNotificationReceivedListener(handler);
|
|
473
|
+
}
|
|
474
|
+
async reportOpen(deliveryId) {
|
|
475
|
+
try {
|
|
476
|
+
const authToken = await this.auth.getToken();
|
|
477
|
+
if (!authToken) return;
|
|
478
|
+
await this.api.post("/push/open", { deliveryId });
|
|
479
|
+
} catch {
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
|
|
367
484
|
// src/index.ts
|
|
368
485
|
var import_shared = require("@codixus/shared");
|
|
369
486
|
var CodixusClient = class {
|
|
370
487
|
auth;
|
|
371
488
|
api;
|
|
489
|
+
push;
|
|
372
490
|
constructor(config) {
|
|
373
491
|
const storageKey = config.storageKey ?? "codixus";
|
|
374
492
|
const storage = config.storage ?? null;
|
|
375
|
-
this.auth = new AuthManager(storage, storageKey
|
|
493
|
+
this.auth = new AuthManager(storage, storageKey, {
|
|
494
|
+
deviceIdProvider: config.deviceIdProvider ?? null,
|
|
495
|
+
autoSignIn: config.autoSignIn ?? null
|
|
496
|
+
});
|
|
376
497
|
this.api = new ApiClient(config.apiUrl, this.auth, config.appSecret);
|
|
377
498
|
this.auth._setApi(this.api);
|
|
499
|
+
if (config.push) {
|
|
500
|
+
this.push = new PushManager(config.push, this.api, this.auth);
|
|
501
|
+
}
|
|
378
502
|
}
|
|
379
503
|
/**
|
|
380
504
|
* Create a typed collection accessor.
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/auth/auth-manager.ts","../src/api/api-client.ts","../src/db/collection.ts"],"sourcesContent":["import {\n AuthManager,\n type StorageAdapter,\n type SignInParams,\n type AuthState,\n} from \"./auth/auth-manager.js\";\nimport { ApiClient } from \"./api/api-client.js\";\nimport { Collection, type FindOptions } from \"./db/collection.js\";\n\nexport interface CodixusClientConfig {\n apiUrl: string;\n storageKey?: string;\n storage?: StorageAdapter | null;\n appSecret?: string;\n}\n\nexport class CodixusClient {\n readonly auth: AuthManager;\n readonly api: ApiClient;\n\n constructor(config: CodixusClientConfig) {\n const storageKey = config.storageKey ?? \"codixus\";\n const storage = config.storage ?? null;\n\n this.auth = new AuthManager(storage, storageKey);\n this.api = new ApiClient(config.apiUrl, this.auth, config.appSecret);\n this.auth._setApi(this.api);\n }\n\n /**\n * Create a typed collection accessor.\n * Maps to auto REST routes on server: codixus.rest(Model)\n *\n * @example\n * interface Product { _id: string; name: string; price: number; }\n * const products = codixus.collection<Product>(\"products\");\n * const all = await products.find(); // Product[]\n * const one = await products.findById(\"abc\"); // Product | null\n */\n collection<T>(name: string): Collection<T> {\n return new Collection<T>(this.api, `/api/${name}`);\n }\n\n async init(): Promise<void> {\n await this.auth.init();\n }\n}\n\nexport {\n type StorageAdapter,\n type SignInParams,\n type AuthState,\n} from \"./auth/auth-manager.js\";\nexport { ApiClient, setCryptoProvider, type CryptoProvider } from \"./api/api-client.js\";\nexport { Collection, type FindOptions } from \"./db/collection.js\";\n\n// Re-export shared types\nexport {\n type AuthUser,\n type TokenPair,\n type DeviceInfo,\n type DeviceMetadata,\n type AuthTokenRequest,\n type AuthTokenResponse,\n type ApiResponse,\n CodixusError,\n ErrorCodes,\n} from \"@codixus/shared\";\n","import type {\n AuthTokenResponse,\n DeviceInfo,\n DeviceMetadata,\n} from \"@codixus/shared\";\nimport type { ApiClient } from \"../api/api-client.js\";\n\nexport interface StorageAdapter {\n getItem(key: string): Promise<string | null> | string | null;\n setItem(key: string, value: string): Promise<void> | void;\n removeItem(key: string): Promise<void> | void;\n}\n\nexport interface SignInParams {\n deviceId?: string;\n deviceInfo: DeviceInfo;\n metadata?: DeviceMetadata;\n}\n\nexport interface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n user: Record<string, unknown> | null;\n}\n\ntype AuthStateListener = (state: AuthState) => void;\n\nexport class AuthManager {\n private accessToken: string | null = null;\n private refreshTokenValue: string | null = null;\n private user: Record<string, unknown> | null = null;\n private listeners: Set<AuthStateListener> = new Set();\n private _isLoading = true;\n private storageKey: string;\n private api!: ApiClient;\n private deviceId: string | null = null;\n\n constructor(\n private storage: StorageAdapter | null,\n storageKey: string,\n ) {\n this.storageKey = storageKey;\n }\n\n /** @internal */\n _setApi(api: ApiClient): void {\n this.api = api;\n }\n\n async init(): Promise<void> {\n if (!this.storage) {\n this._isLoading = false;\n return;\n }\n\n try {\n const storedRefresh = await this.storage.getItem(\n `${this.storageKey}_refresh_token`,\n );\n const storedUser = await this.storage.getItem(\n `${this.storageKey}_user`,\n );\n const storedDeviceId = await this.storage.getItem(\n `${this.storageKey}_device_id`,\n );\n\n if (storedRefresh) {\n this.refreshTokenValue = storedRefresh;\n }\n if (storedUser) {\n try {\n this.user = JSON.parse(storedUser);\n } catch {\n // Corrupted user data in storage, ignore\n }\n }\n if (storedDeviceId) {\n this.deviceId = storedDeviceId;\n }\n } catch (error) {\n console.warn(\"[CodixusClient] Failed to restore auth state from storage:\", error);\n }\n\n this._isLoading = false;\n this.notify();\n }\n\n async signIn(\n params: SignInParams,\n ): Promise<{ user: Record<string, unknown>; isNewUser: boolean }> {\n const deviceId = params.deviceId ?? this.deviceId ?? this.generateDeviceId();\n\n const response = await this.api.post<AuthTokenResponse>(\"/auth/token\", {\n deviceId,\n deviceInfo: params.deviceInfo,\n metadata: params.metadata,\n });\n\n const data = response.data;\n this.accessToken = data.accessToken;\n this.refreshTokenValue = data.refreshToken;\n this.user = data.user;\n this.deviceId = deviceId;\n\n // Persist\n if (this.storage) {\n await this.storage.setItem(\n `${this.storageKey}_refresh_token`,\n data.refreshToken,\n );\n await this.storage.setItem(\n `${this.storageKey}_user`,\n JSON.stringify(data.user),\n );\n await this.storage.setItem(`${this.storageKey}_device_id`, deviceId);\n }\n\n this.notify();\n return { user: data.user, isNewUser: data.isNewUser };\n }\n\n async getToken(): Promise<string | null> {\n if (this.accessToken) return this.accessToken;\n\n // Try refresh\n if (this.refreshTokenValue) {\n try {\n await this.forceRefresh();\n return this.accessToken;\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n async forceRefresh(): Promise<string | null> {\n if (!this.refreshTokenValue) return null;\n\n try {\n const response = await this.api.post<{\n success: boolean;\n accessToken: string;\n refreshToken: string;\n }>(\"/auth/refresh\", {\n refreshToken: this.refreshTokenValue,\n });\n\n this.accessToken = response.data.accessToken;\n this.refreshTokenValue = response.data.refreshToken;\n\n if (this.storage) {\n await this.storage.setItem(\n `${this.storageKey}_refresh_token`,\n response.data.refreshToken,\n );\n }\n\n return this.accessToken;\n } catch {\n // Refresh failed, clear auth state\n await this.signOut();\n return null;\n }\n }\n\n async signOut(): Promise<void> {\n // Notify server\n if (this.refreshTokenValue) {\n try {\n await this.api.post(\"/auth/logout\", {\n refreshToken: this.refreshTokenValue,\n });\n } catch {}\n }\n\n this.accessToken = null;\n this.refreshTokenValue = null;\n this.user = null;\n\n if (this.storage) {\n await this.storage.removeItem(`${this.storageKey}_refresh_token`);\n await this.storage.removeItem(`${this.storageKey}_user`);\n await this.storage.removeItem(`${this.storageKey}_device_id`);\n }\n\n this.notify();\n }\n\n getState(): AuthState {\n return {\n isAuthenticated: this.accessToken !== null || this.refreshTokenValue !== null,\n isLoading: this._isLoading,\n user: this.user,\n };\n }\n\n getDeviceId(): string | null {\n return this.deviceId;\n }\n\n onAuthStateChange(listener: AuthStateListener): () => void {\n this.listeners.add(listener);\n // Call immediately with current state\n listener(this.getState());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /** @internal - used by API interceptor */\n _getAccessToken(): string | null {\n return this.accessToken;\n }\n\n /** @internal - called by API interceptor after refresh */\n _setAccessToken(token: string): void {\n this.accessToken = token;\n }\n\n private notify(): void {\n const state = this.getState();\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n\n private generateDeviceId(): string {\n const bytes = new Uint8Array(16);\n if (typeof globalThis.crypto?.getRandomValues === \"function\") {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return \"dev-\" + Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n}\n","import axios, {\n type AxiosInstance,\n type AxiosRequestConfig,\n type AxiosResponse,\n} from \"axios\";\nimport type { AuthManager } from \"../auth/auth-manager.js\";\n\n// Crypto functions — injected from outside to avoid platform-specific imports\nexport interface CryptoProvider {\n sha256(data: string): Promise<string>;\n hmacSha256(secret: string, data: string): Promise<string>;\n randomUUID(): string;\n}\n\n// Default: no-op (signing disabled if no crypto provider)\nlet _crypto: CryptoProvider | null = null;\n\nexport function setCryptoProvider(provider: CryptoProvider): void {\n _crypto = provider;\n}\n\nfunction generateNonce(): string {\n if (_crypto) return _crypto.randomUUID();\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof globalThis.crypto?.getRandomValues === \"function\") {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport class ApiClient {\n readonly instance: AxiosInstance;\n private refreshPromise: Promise<string | null> | null = null;\n private appSecret: string | undefined;\n\n constructor(\n baseURL: string,\n private authManager: AuthManager,\n appSecret?: string,\n ) {\n this.appSecret = appSecret;\n\n this.instance = axios.create({\n baseURL,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // Request interceptor: add Bearer token + signing\n this.instance.interceptors.request.use(async (config) => {\n // Skip auth for auth endpoints\n if (!config.url?.includes(\"/auth/\")) {\n const token = this.authManager._getAccessToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Request signing (only if crypto provider is set)\n if (this.appSecret && _crypto) {\n const timestamp = Date.now().toString();\n const nonce = _crypto.randomUUID();\n const body =\n config.data && typeof config.data === \"object\"\n ? JSON.stringify(config.data)\n : (config.data ?? \"\");\n const bodyHash = body ? await _crypto.sha256(body) : \"\";\n const method = (config.method ?? \"GET\").toUpperCase();\n const url = config.url ?? \"/\";\n const payload = [method, url, timestamp, nonce, bodyHash].join(\"\\n\");\n const signature = await _crypto.hmacSha256(this.appSecret, payload);\n\n config.headers[\"X-Codixus-Timestamp\"] = timestamp;\n config.headers[\"X-Codixus-Nonce\"] = nonce;\n config.headers[\"X-Codixus-Signature\"] = signature;\n }\n\n return config;\n });\n\n // Response interceptor: handle 401 with token refresh\n this.instance.interceptors.response.use(\n (response) => response,\n async (error) => {\n if (error.response?.status === 401) {\n const originalRequest = error.config;\n if (originalRequest && !originalRequest._retry) {\n originalRequest._retry = true;\n\n try {\n if (!this.refreshPromise) {\n this.refreshPromise = this.authManager\n .forceRefresh()\n .finally(() => {\n this.refreshPromise = null;\n });\n }\n\n const newToken = await this.refreshPromise;\n if (newToken) {\n originalRequest.headers.Authorization = `Bearer ${newToken}`;\n return this.instance(originalRequest);\n }\n } catch (refreshError) {\n console.warn(\"[CodixusClient] Token refresh failed:\", refreshError);\n }\n }\n }\n return Promise.reject(error);\n },\n );\n }\n\n async get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.get<T>(url, config);\n }\n\n async post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.post<T>(url, data, config);\n }\n\n async patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.patch<T>(url, data, config);\n }\n\n async delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.delete<T>(url, config);\n }\n\n async put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.put<T>(url, data, config);\n }\n}\n","import type { ApiClient } from \"../api/api-client.js\";\n\nexport interface FindOptions {\n sort?: Record<string, 1 | -1>;\n limit?: number;\n skip?: number;\n cursor?: string | number;\n}\n\nexport class Collection<T = Record<string, unknown>> {\n constructor(\n private api: ApiClient,\n private basePath: string,\n ) {}\n\n async find(\n filter?: Record<string, unknown>,\n options?: FindOptions,\n ): Promise<T[]> {\n const params = new URLSearchParams();\n if (filter && Object.keys(filter).length > 0) {\n params.set(\"filter\", JSON.stringify(filter));\n }\n if (options?.sort) params.set(\"sort\", JSON.stringify(options.sort));\n if (options?.limit) params.set(\"limit\", String(options.limit));\n if (options?.skip) params.set(\"skip\", String(options.skip));\n if (options?.cursor) params.set(\"cursor\", String(options.cursor));\n\n const qs = params.toString();\n const url = qs ? `${this.basePath}?${qs}` : this.basePath;\n const { data } = await this.api.get<{ success: boolean; data: T[]; nextCursor?: string | null }>(url);\n return data.data;\n }\n\n async findWithCursor(\n filter?: Record<string, unknown>,\n options?: FindOptions,\n ): Promise<{ data: T[]; nextCursor: string | number | null }> {\n const params = new URLSearchParams();\n if (filter && Object.keys(filter).length > 0) {\n params.set(\"filter\", JSON.stringify(filter));\n }\n if (options?.sort) params.set(\"sort\", JSON.stringify(options.sort));\n if (options?.limit) params.set(\"limit\", String(options.limit));\n if (options?.cursor) params.set(\"cursor\", String(options.cursor));\n\n const qs = params.toString();\n const url = qs ? `${this.basePath}?${qs}` : this.basePath;\n const { data } = await this.api.get<{ success: boolean; data: T[]; nextCursor: string | number | null }>(url);\n return { data: data.data, nextCursor: data.nextCursor };\n }\n\n async findById(id: string): Promise<T | null> {\n try {\n const { data } = await this.api.get<{ success: boolean; data: T }>(\n `${this.basePath}/${id}`,\n );\n return data.data;\n } catch (error: any) {\n if (error.response?.status === 404) return null;\n throw error;\n }\n }\n\n async create(doc: Partial<T> & Record<string, unknown>): Promise<T> {\n const { data } = await this.api.post<{ success: boolean; data: T }>(\n this.basePath,\n doc,\n );\n return data.data;\n }\n\n async updateById(\n id: string,\n update: Record<string, unknown>,\n ): Promise<T> {\n const { data } = await this.api.patch<{ success: boolean; data: T }>(\n `${this.basePath}/${id}`,\n { update },\n );\n return data.data;\n }\n\n async deleteById(id: string): Promise<void> {\n await this.api.delete(`${this.basePath}/${id}`);\n }\n\n async count(filter?: Record<string, unknown>): Promise<number> {\n const { data } = await this.api.post<{ success: boolean; count: number }>(\n `${this.basePath}/count`,\n { filter: filter ?? {} },\n );\n return data.count;\n }\n}\n"],"mappings":"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","names":["axios"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/auth/auth-manager.ts","../src/api/api-client.ts","../src/db/collection.ts","../src/push/push-manager.ts"],"sourcesContent":["import {\n AuthManager,\n type StorageAdapter,\n type SignInParams,\n type AuthState,\n type DeviceIdProvider,\n type AutoSignInConfig,\n} from \"./auth/auth-manager.js\";\nimport { ApiClient } from \"./api/api-client.js\";\nimport { Collection, type FindOptions } from \"./db/collection.js\";\nimport { PushManager } from \"./push/push-manager.js\";\nimport type { PushAdapter } from \"./push/types.js\";\n\nexport interface CodixusClientConfig {\n apiUrl: string;\n storageKey?: string;\n storage?: StorageAdapter | null;\n appSecret?: string;\n deviceIdProvider?: DeviceIdProvider | null;\n autoSignIn?: AutoSignInConfig | null;\n push?: PushAdapter;\n}\n\nexport class CodixusClient {\n readonly auth: AuthManager;\n readonly api: ApiClient;\n readonly push?: PushManager;\n\n constructor(config: CodixusClientConfig) {\n const storageKey = config.storageKey ?? \"codixus\";\n const storage = config.storage ?? null;\n\n this.auth = new AuthManager(storage, storageKey, {\n deviceIdProvider: config.deviceIdProvider ?? null,\n autoSignIn: config.autoSignIn ?? null,\n });\n this.api = new ApiClient(config.apiUrl, this.auth, config.appSecret);\n this.auth._setApi(this.api);\n\n if (config.push) {\n this.push = new PushManager(config.push, this.api, this.auth);\n }\n }\n\n /**\n * Create a typed collection accessor.\n * Maps to auto REST routes on server: codixus.rest(Model)\n *\n * @example\n * interface Product { _id: string; name: string; price: number; }\n * const products = codixus.collection<Product>(\"products\");\n * const all = await products.find(); // Product[]\n * const one = await products.findById(\"abc\"); // Product | null\n */\n collection<T>(name: string): Collection<T> {\n return new Collection<T>(this.api, `/api/${name}`);\n }\n\n async init(): Promise<void> {\n await this.auth.init();\n }\n}\n\nexport {\n type StorageAdapter,\n type SignInParams,\n type AuthState,\n type DeviceIdProvider,\n type AutoSignInConfig,\n} from \"./auth/auth-manager.js\";\nexport { ApiClient, setCryptoProvider, type CryptoProvider } from \"./api/api-client.js\";\nexport { Collection, type FindOptions } from \"./db/collection.js\";\nexport { type PushAdapter, type PushAdapterToken } from \"./push/types.js\";\n\n// Re-export shared types\nexport {\n type AuthUser,\n type TokenPair,\n type DeviceInfo,\n type DeviceMetadata,\n type AuthTokenRequest,\n type AuthTokenResponse,\n type ApiResponse,\n CodixusError,\n ErrorCodes,\n} from \"@codixus/shared\";\n","import type {\n AuthTokenResponse,\n DeviceInfo,\n DeviceMetadata,\n} from \"@codixus/shared\";\nimport type { ApiClient } from \"../api/api-client.js\";\n\nexport interface StorageAdapter {\n getItem(key: string): Promise<string | null> | string | null;\n setItem(key: string, value: string): Promise<void> | void;\n removeItem(key: string): Promise<void> | void;\n}\n\n// Host-injected source for a stable, OS-level device identifier (IDFV on\n// iOS, ANDROID_ID on Android, etc.). The SDK calls this when it needs to\n// obtain a deviceId and has nothing in storage. Returning null lets the\n// SDK fall back to a generated UUID. Keeping this an interface (instead\n// of importing expo-application) keeps the SDK platform-agnostic.\nexport interface DeviceIdProvider {\n getDeviceId(): Promise<string | null> | string | null;\n}\n\n// Optional auto signIn driven by the SDK on init(). When provided, after\n// init() restores from storage and the user is still unauthenticated, the\n// SDK calls signIn with the host-supplied device info/metadata. This\n// removes the need for every host app to wire its own boot signIn.\nexport interface AutoSignInConfig {\n enabled: boolean;\n getDeviceInfo(): DeviceInfo | Promise<DeviceInfo>;\n getMetadata?(): DeviceMetadata | Promise<DeviceMetadata>;\n onError?(error: unknown): void;\n}\n\nexport interface SignInParams {\n deviceId?: string;\n deviceInfo: DeviceInfo;\n metadata?: DeviceMetadata;\n}\n\nexport interface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n user: Record<string, unknown> | null;\n}\n\ntype AuthStateListener = (state: AuthState) => void;\n\nexport class AuthManager {\n private accessToken: string | null = null;\n private refreshTokenValue: string | null = null;\n private user: Record<string, unknown> | null = null;\n private listeners: Set<AuthStateListener> = new Set();\n private _isLoading = true;\n private storageKey: string;\n private api!: ApiClient;\n private deviceId: string | null = null;\n private deviceIdProvider: DeviceIdProvider | null;\n private autoSignInConfig: AutoSignInConfig | null;\n private initPromise: Promise<void> | null = null;\n private signInPromise: Promise<{ user: Record<string, unknown>; isNewUser: boolean }> | null = null;\n\n constructor(\n private storage: StorageAdapter | null,\n storageKey: string,\n options?: {\n deviceIdProvider?: DeviceIdProvider | null;\n autoSignIn?: AutoSignInConfig | null;\n },\n ) {\n this.storageKey = storageKey;\n this.deviceIdProvider = options?.deviceIdProvider ?? null;\n this.autoSignInConfig = options?.autoSignIn ?? null;\n }\n\n /** @internal */\n _setApi(api: ApiClient): void {\n this.api = api;\n }\n\n async init(): Promise<void> {\n // Idempotent: concurrent or repeat callers (e.g. host module-load\n // init plus the React provider's useEffect init) share a single run\n // so autoSignIn does not fire twice and race against itself on the\n // backend. On rejection we clear the cached promise so a retry can\n // run — caching a rejected promise would brick init() for the rest\n // of the app lifetime.\n if (this.initPromise) return this.initPromise;\n this.initPromise = this._init().catch((err) => {\n this.initPromise = null;\n throw err;\n });\n return this.initPromise;\n }\n\n private async _init(): Promise<void> {\n if (this.storage) {\n try {\n const storedRefresh = await this.storage.getItem(\n `${this.storageKey}_refresh_token`,\n );\n const storedUser = await this.storage.getItem(\n `${this.storageKey}_user`,\n );\n const storedDeviceId = await this.storage.getItem(\n `${this.storageKey}_device_id`,\n );\n\n if (storedRefresh) {\n this.refreshTokenValue = storedRefresh;\n }\n if (storedUser) {\n try {\n this.user = JSON.parse(storedUser);\n } catch {\n // Corrupted user data in storage, ignore\n }\n }\n if (storedDeviceId) {\n this.deviceId = storedDeviceId;\n }\n } catch (error) {\n console.warn(\"[CodixusClient] Failed to restore auth state from storage:\", error);\n }\n }\n\n // Auto signIn: if the host app opted in and we have no live session yet\n // (cold start, app data cleared, fresh install), reach out to the\n // backend with the device-bound identifier so the existing user is\n // restored before any UI hits an authenticated route.\n if (\n this.autoSignInConfig?.enabled &&\n !this.refreshTokenValue\n ) {\n try {\n const deviceInfo = await this.autoSignInConfig.getDeviceInfo();\n const metadata = this.autoSignInConfig.getMetadata\n ? await this.autoSignInConfig.getMetadata()\n : undefined;\n await this.signIn({ deviceInfo, metadata });\n } catch (error) {\n this.autoSignInConfig.onError?.(error);\n }\n }\n\n this._isLoading = false;\n this.notify();\n }\n\n async signIn(\n params: SignInParams,\n ): Promise<{ user: Record<string, unknown>; isNewUser: boolean }> {\n // Coalesce concurrent signIn calls (e.g. autoSignIn racing a manual\n // signIn from a UI handler) onto a single network request.\n if (this.signInPromise) return this.signInPromise;\n this.signInPromise = this._signIn(params).finally(() => {\n this.signInPromise = null;\n });\n return this.signInPromise;\n }\n\n private async _signIn(\n params: SignInParams,\n ): Promise<{ user: Record<string, unknown>; isNewUser: boolean }> {\n const providerId = this.deviceIdProvider\n ? await this.deviceIdProvider.getDeviceId()\n : null;\n const deviceId =\n params.deviceId ??\n this.deviceId ??\n providerId ??\n this.generateDeviceId();\n\n const response = await this.api.post<AuthTokenResponse>(\"/auth/token\", {\n deviceId,\n deviceInfo: params.deviceInfo,\n metadata: params.metadata,\n });\n\n const data = response.data;\n this.accessToken = data.accessToken;\n this.refreshTokenValue = data.refreshToken;\n this.user = data.user;\n this.deviceId = deviceId;\n\n // Persist. Storage failures (full disk, locked keychain post-restore,\n // EncryptedSharedPreferences key invalidation) must not strand the\n // in-memory session — the user is signed in for this run; the next\n // cold start will simply re-trigger autoSignIn.\n if (this.storage) {\n try {\n await this.storage.setItem(\n `${this.storageKey}_refresh_token`,\n data.refreshToken,\n );\n await this.storage.setItem(\n `${this.storageKey}_user`,\n JSON.stringify(data.user),\n );\n await this.storage.setItem(`${this.storageKey}_device_id`, deviceId);\n } catch (error) {\n console.warn(\"[CodixusClient] Failed to persist auth state:\", error);\n }\n }\n\n this.notify();\n return { user: data.user, isNewUser: data.isNewUser };\n }\n\n async getToken(): Promise<string | null> {\n if (this.accessToken) return this.accessToken;\n\n // Try refresh\n if (this.refreshTokenValue) {\n try {\n await this.forceRefresh();\n return this.accessToken;\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n async forceRefresh(): Promise<string | null> {\n if (!this.refreshTokenValue) return null;\n\n try {\n const response = await this.api.post<{\n success: boolean;\n accessToken: string;\n refreshToken: string;\n }>(\"/auth/refresh\", {\n refreshToken: this.refreshTokenValue,\n });\n\n this.accessToken = response.data.accessToken;\n this.refreshTokenValue = response.data.refreshToken;\n\n if (this.storage) {\n await this.storage.setItem(\n `${this.storageKey}_refresh_token`,\n response.data.refreshToken,\n );\n }\n\n return this.accessToken;\n } catch {\n // Refresh failed, clear auth state\n await this.signOut();\n return null;\n }\n }\n\n async signOut(): Promise<void> {\n // Notify server\n if (this.refreshTokenValue) {\n try {\n await this.api.post(\"/auth/logout\", {\n refreshToken: this.refreshTokenValue,\n });\n } catch {}\n }\n\n this.accessToken = null;\n this.refreshTokenValue = null;\n this.user = null;\n // Reset guards so a fresh signIn flow (or a re-init triggered by a\n // host that wants to re-authenticate after sign-out) can run. The\n // signInPromise is also cleared by its own .finally, but a signOut\n // racing against an in-flight signIn shouldn't keep the stale guard.\n this.initPromise = null;\n this.signInPromise = null;\n\n if (this.storage) {\n await this.storage.removeItem(`${this.storageKey}_refresh_token`);\n await this.storage.removeItem(`${this.storageKey}_user`);\n await this.storage.removeItem(`${this.storageKey}_device_id`);\n }\n\n this.notify();\n }\n\n getState(): AuthState {\n return {\n isAuthenticated: this.accessToken !== null || this.refreshTokenValue !== null,\n isLoading: this._isLoading,\n user: this.user,\n };\n }\n\n getDeviceId(): string | null {\n return this.deviceId;\n }\n\n onAuthStateChange(listener: AuthStateListener): () => void {\n this.listeners.add(listener);\n // Call immediately with current state\n listener(this.getState());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /** @internal - used by API interceptor */\n _getAccessToken(): string | null {\n return this.accessToken;\n }\n\n /** @internal - called by API interceptor after refresh */\n _setAccessToken(token: string): void {\n this.accessToken = token;\n }\n\n private notify(): void {\n const state = this.getState();\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n\n private generateDeviceId(): string {\n const bytes = new Uint8Array(16);\n if (typeof globalThis.crypto?.getRandomValues === \"function\") {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return \"dev-\" + Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n}\n","import axios, {\n type AxiosInstance,\n type AxiosRequestConfig,\n type AxiosResponse,\n} from \"axios\";\nimport type { AuthManager } from \"../auth/auth-manager.js\";\n\n// Crypto functions — injected from outside to avoid platform-specific imports\nexport interface CryptoProvider {\n sha256(data: string): Promise<string>;\n hmacSha256(secret: string, data: string): Promise<string>;\n randomUUID(): string;\n}\n\n// Default: no-op (signing disabled if no crypto provider)\nlet _crypto: CryptoProvider | null = null;\n\nexport function setCryptoProvider(provider: CryptoProvider): void {\n _crypto = provider;\n}\n\nfunction generateNonce(): string {\n if (_crypto) return _crypto.randomUUID();\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof globalThis.crypto?.getRandomValues === \"function\") {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport class ApiClient {\n readonly instance: AxiosInstance;\n private refreshPromise: Promise<string | null> | null = null;\n private appSecret: string | undefined;\n\n constructor(\n baseURL: string,\n private authManager: AuthManager,\n appSecret?: string,\n ) {\n this.appSecret = appSecret;\n\n this.instance = axios.create({\n baseURL,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // Request interceptor: add Bearer token + signing\n this.instance.interceptors.request.use(async (config) => {\n // Skip auth for auth endpoints\n if (!config.url?.includes(\"/auth/\")) {\n const token = this.authManager._getAccessToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Request signing (only if crypto provider is set)\n if (this.appSecret && _crypto) {\n const timestamp = Date.now().toString();\n const nonce = _crypto.randomUUID();\n const body =\n config.data && typeof config.data === \"object\"\n ? JSON.stringify(config.data)\n : (config.data ?? \"\");\n const bodyHash = body ? await _crypto.sha256(body) : \"\";\n const method = (config.method ?? \"GET\").toUpperCase();\n const url = config.url ?? \"/\";\n const payload = [method, url, timestamp, nonce, bodyHash].join(\"\\n\");\n const signature = await _crypto.hmacSha256(this.appSecret, payload);\n\n config.headers[\"X-Codixus-Timestamp\"] = timestamp;\n config.headers[\"X-Codixus-Nonce\"] = nonce;\n config.headers[\"X-Codixus-Signature\"] = signature;\n }\n\n return config;\n });\n\n // Response interceptor: handle 401 with token refresh\n this.instance.interceptors.response.use(\n (response) => response,\n async (error) => {\n if (error.response?.status === 401) {\n const originalRequest = error.config;\n if (originalRequest && !originalRequest._retry) {\n originalRequest._retry = true;\n\n try {\n if (!this.refreshPromise) {\n this.refreshPromise = this.authManager\n .forceRefresh()\n .finally(() => {\n this.refreshPromise = null;\n });\n }\n\n const newToken = await this.refreshPromise;\n if (newToken) {\n originalRequest.headers.Authorization = `Bearer ${newToken}`;\n return this.instance(originalRequest);\n }\n } catch (refreshError) {\n console.warn(\"[CodixusClient] Token refresh failed:\", refreshError);\n }\n }\n }\n return Promise.reject(error);\n },\n );\n }\n\n async get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.get<T>(url, config);\n }\n\n async post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.post<T>(url, data, config);\n }\n\n async patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.patch<T>(url, data, config);\n }\n\n async delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.delete<T>(url, config);\n }\n\n async put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {\n return this.instance.put<T>(url, data, config);\n }\n}\n","import type { ApiClient } from \"../api/api-client.js\";\n\nexport interface FindOptions {\n sort?: Record<string, 1 | -1>;\n limit?: number;\n skip?: number;\n cursor?: string | number;\n}\n\nexport class Collection<T = Record<string, unknown>> {\n constructor(\n private api: ApiClient,\n private basePath: string,\n ) {}\n\n async find(\n filter?: Record<string, unknown>,\n options?: FindOptions,\n ): Promise<T[]> {\n const params = new URLSearchParams();\n if (filter && Object.keys(filter).length > 0) {\n params.set(\"filter\", JSON.stringify(filter));\n }\n if (options?.sort) params.set(\"sort\", JSON.stringify(options.sort));\n if (options?.limit) params.set(\"limit\", String(options.limit));\n if (options?.skip) params.set(\"skip\", String(options.skip));\n if (options?.cursor) params.set(\"cursor\", String(options.cursor));\n\n const qs = params.toString();\n const url = qs ? `${this.basePath}?${qs}` : this.basePath;\n const { data } = await this.api.get<{ success: boolean; data: T[]; nextCursor?: string | null }>(url);\n return data.data;\n }\n\n async findWithCursor(\n filter?: Record<string, unknown>,\n options?: FindOptions,\n ): Promise<{ data: T[]; nextCursor: string | number | null }> {\n const params = new URLSearchParams();\n if (filter && Object.keys(filter).length > 0) {\n params.set(\"filter\", JSON.stringify(filter));\n }\n if (options?.sort) params.set(\"sort\", JSON.stringify(options.sort));\n if (options?.limit) params.set(\"limit\", String(options.limit));\n if (options?.cursor) params.set(\"cursor\", String(options.cursor));\n\n const qs = params.toString();\n const url = qs ? `${this.basePath}?${qs}` : this.basePath;\n const { data } = await this.api.get<{ success: boolean; data: T[]; nextCursor: string | number | null }>(url);\n return { data: data.data, nextCursor: data.nextCursor };\n }\n\n async findById(id: string): Promise<T | null> {\n try {\n const { data } = await this.api.get<{ success: boolean; data: T }>(\n `${this.basePath}/${id}`,\n );\n return data.data;\n } catch (error: any) {\n if (error.response?.status === 404) return null;\n throw error;\n }\n }\n\n async create(doc: Partial<T> & Record<string, unknown>): Promise<T> {\n const { data } = await this.api.post<{ success: boolean; data: T }>(\n this.basePath,\n doc,\n );\n return data.data;\n }\n\n async updateById(\n id: string,\n update: Record<string, unknown>,\n ): Promise<T> {\n const { data } = await this.api.patch<{ success: boolean; data: T }>(\n `${this.basePath}/${id}`,\n { update },\n );\n return data.data;\n }\n\n async deleteById(id: string): Promise<void> {\n await this.api.delete(`${this.basePath}/${id}`);\n }\n\n async count(filter?: Record<string, unknown>): Promise<number> {\n const { data } = await this.api.post<{ success: boolean; count: number }>(\n `${this.basePath}/count`,\n { filter: filter ?? {} },\n );\n return data.count;\n }\n}\n","import type { ApiClient } from \"../api/api-client.js\";\nimport type { AuthManager } from \"../auth/auth-manager.js\";\nimport type { PushAdapter } from \"./types.js\";\n\nfunction extractDeliveryId(\n payload: Record<string, unknown>,\n): string | undefined {\n if (typeof payload.deliveryId === \"string\" && payload.deliveryId) {\n return payload.deliveryId;\n }\n const data = payload.data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const nested = (data as Record<string, unknown>).deliveryId;\n if (typeof nested === \"string\" && nested) {\n return nested;\n }\n }\n return undefined;\n}\n\nexport class PushManager {\n constructor(\n private adapter: PushAdapter,\n private api: ApiClient,\n private auth: AuthManager,\n ) {}\n\n async register(): Promise<void> {\n const authToken = await this.auth.getToken();\n if (!authToken) {\n throw new Error(\"Not authenticated\");\n }\n\n const adapterToken = await this.adapter.getToken();\n if (!adapterToken) {\n return;\n }\n\n const body: Record<string, unknown> = {\n token: adapterToken.token,\n provider: adapterToken.provider,\n platform: adapterToken.platform,\n };\n\n try {\n body.permissionStatus = await this.adapter.getPermissionStatus();\n } catch {\n // omit permissionStatus, still POST\n }\n\n await this.api.post(\"/push/register\", body);\n }\n\n async unregister(): Promise<void> {\n const authToken = await this.auth.getToken();\n if (!authToken) {\n throw new Error(\"Not authenticated\");\n }\n\n await this.api.post(\"/push/unregister\", {});\n }\n\n async requestPermission(): Promise<boolean> {\n return this.adapter.requestPermission();\n }\n\n async getPermissionStatus(): Promise<\n \"granted\" | \"denied\" | \"undetermined\"\n > {\n return this.adapter.getPermissionStatus();\n }\n\n addNotificationOpenedListener(\n handler: (payload: Record<string, unknown>) => void,\n ): () => void {\n return this.adapter.addNotificationOpenedListener((payload) => {\n handler(payload);\n const deliveryId = extractDeliveryId(payload);\n if (deliveryId) {\n void this.reportOpen(deliveryId);\n }\n });\n }\n\n addNotificationReceivedListener(\n handler: (payload: Record<string, unknown>) => void,\n ): () => void {\n return this.adapter.addNotificationReceivedListener(handler);\n }\n\n private async reportOpen(deliveryId: string): Promise<void> {\n try {\n const authToken = await this.auth.getToken();\n if (!authToken) return;\n await this.api.post(\"/push/open\", { deliveryId });\n } catch {\n // fire-and-forget: swallow 404, 401, 5xx, network errors\n }\n }\n}\n"],"mappings":"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","names":["axios"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DeviceInfo, DeviceMetadata } from '@codixus/shared';
|
|
2
2
|
export { ApiResponse, AuthTokenRequest, AuthTokenResponse, AuthUser, CodixusError, DeviceInfo, DeviceMetadata, ErrorCodes, TokenPair } from '@codixus/shared';
|
|
3
3
|
import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
4
|
+
import { P as PushAdapter } from './types-maS8y9s9.cjs';
|
|
5
|
+
export { a as PushAdapterToken } from './types-maS8y9s9.cjs';
|
|
4
6
|
|
|
5
7
|
interface CryptoProvider {
|
|
6
8
|
sha256(data: string): Promise<string>;
|
|
@@ -26,6 +28,15 @@ interface StorageAdapter {
|
|
|
26
28
|
setItem(key: string, value: string): Promise<void> | void;
|
|
27
29
|
removeItem(key: string): Promise<void> | void;
|
|
28
30
|
}
|
|
31
|
+
interface DeviceIdProvider {
|
|
32
|
+
getDeviceId(): Promise<string | null> | string | null;
|
|
33
|
+
}
|
|
34
|
+
interface AutoSignInConfig {
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
getDeviceInfo(): DeviceInfo | Promise<DeviceInfo>;
|
|
37
|
+
getMetadata?(): DeviceMetadata | Promise<DeviceMetadata>;
|
|
38
|
+
onError?(error: unknown): void;
|
|
39
|
+
}
|
|
29
40
|
interface SignInParams {
|
|
30
41
|
deviceId?: string;
|
|
31
42
|
deviceInfo: DeviceInfo;
|
|
@@ -47,14 +58,23 @@ declare class AuthManager {
|
|
|
47
58
|
private storageKey;
|
|
48
59
|
private api;
|
|
49
60
|
private deviceId;
|
|
50
|
-
|
|
61
|
+
private deviceIdProvider;
|
|
62
|
+
private autoSignInConfig;
|
|
63
|
+
private initPromise;
|
|
64
|
+
private signInPromise;
|
|
65
|
+
constructor(storage: StorageAdapter | null, storageKey: string, options?: {
|
|
66
|
+
deviceIdProvider?: DeviceIdProvider | null;
|
|
67
|
+
autoSignIn?: AutoSignInConfig | null;
|
|
68
|
+
});
|
|
51
69
|
/** @internal */
|
|
52
70
|
_setApi(api: ApiClient): void;
|
|
53
71
|
init(): Promise<void>;
|
|
72
|
+
private _init;
|
|
54
73
|
signIn(params: SignInParams): Promise<{
|
|
55
74
|
user: Record<string, unknown>;
|
|
56
75
|
isNewUser: boolean;
|
|
57
76
|
}>;
|
|
77
|
+
private _signIn;
|
|
58
78
|
getToken(): Promise<string | null>;
|
|
59
79
|
forceRefresh(): Promise<string | null>;
|
|
60
80
|
signOut(): Promise<void>;
|
|
@@ -91,15 +111,33 @@ declare class Collection<T = Record<string, unknown>> {
|
|
|
91
111
|
count(filter?: Record<string, unknown>): Promise<number>;
|
|
92
112
|
}
|
|
93
113
|
|
|
114
|
+
declare class PushManager {
|
|
115
|
+
private adapter;
|
|
116
|
+
private api;
|
|
117
|
+
private auth;
|
|
118
|
+
constructor(adapter: PushAdapter, api: ApiClient, auth: AuthManager);
|
|
119
|
+
register(): Promise<void>;
|
|
120
|
+
unregister(): Promise<void>;
|
|
121
|
+
requestPermission(): Promise<boolean>;
|
|
122
|
+
getPermissionStatus(): Promise<"granted" | "denied" | "undetermined">;
|
|
123
|
+
addNotificationOpenedListener(handler: (payload: Record<string, unknown>) => void): () => void;
|
|
124
|
+
addNotificationReceivedListener(handler: (payload: Record<string, unknown>) => void): () => void;
|
|
125
|
+
private reportOpen;
|
|
126
|
+
}
|
|
127
|
+
|
|
94
128
|
interface CodixusClientConfig {
|
|
95
129
|
apiUrl: string;
|
|
96
130
|
storageKey?: string;
|
|
97
131
|
storage?: StorageAdapter | null;
|
|
98
132
|
appSecret?: string;
|
|
133
|
+
deviceIdProvider?: DeviceIdProvider | null;
|
|
134
|
+
autoSignIn?: AutoSignInConfig | null;
|
|
135
|
+
push?: PushAdapter;
|
|
99
136
|
}
|
|
100
137
|
declare class CodixusClient {
|
|
101
138
|
readonly auth: AuthManager;
|
|
102
139
|
readonly api: ApiClient;
|
|
140
|
+
readonly push?: PushManager;
|
|
103
141
|
constructor(config: CodixusClientConfig);
|
|
104
142
|
/**
|
|
105
143
|
* Create a typed collection accessor.
|
|
@@ -115,4 +153,4 @@ declare class CodixusClient {
|
|
|
115
153
|
init(): Promise<void>;
|
|
116
154
|
}
|
|
117
155
|
|
|
118
|
-
export { ApiClient, type AuthState, CodixusClient, type CodixusClientConfig, Collection, type CryptoProvider, type FindOptions, type SignInParams, type StorageAdapter, setCryptoProvider };
|
|
156
|
+
export { ApiClient, type AuthState, type AutoSignInConfig, CodixusClient, type CodixusClientConfig, Collection, type CryptoProvider, type DeviceIdProvider, type FindOptions, PushAdapter, type SignInParams, type StorageAdapter, setCryptoProvider };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DeviceInfo, DeviceMetadata } from '@codixus/shared';
|
|
2
2
|
export { ApiResponse, AuthTokenRequest, AuthTokenResponse, AuthUser, CodixusError, DeviceInfo, DeviceMetadata, ErrorCodes, TokenPair } from '@codixus/shared';
|
|
3
3
|
import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
4
|
+
import { P as PushAdapter } from './types-maS8y9s9.js';
|
|
5
|
+
export { a as PushAdapterToken } from './types-maS8y9s9.js';
|
|
4
6
|
|
|
5
7
|
interface CryptoProvider {
|
|
6
8
|
sha256(data: string): Promise<string>;
|
|
@@ -26,6 +28,15 @@ interface StorageAdapter {
|
|
|
26
28
|
setItem(key: string, value: string): Promise<void> | void;
|
|
27
29
|
removeItem(key: string): Promise<void> | void;
|
|
28
30
|
}
|
|
31
|
+
interface DeviceIdProvider {
|
|
32
|
+
getDeviceId(): Promise<string | null> | string | null;
|
|
33
|
+
}
|
|
34
|
+
interface AutoSignInConfig {
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
getDeviceInfo(): DeviceInfo | Promise<DeviceInfo>;
|
|
37
|
+
getMetadata?(): DeviceMetadata | Promise<DeviceMetadata>;
|
|
38
|
+
onError?(error: unknown): void;
|
|
39
|
+
}
|
|
29
40
|
interface SignInParams {
|
|
30
41
|
deviceId?: string;
|
|
31
42
|
deviceInfo: DeviceInfo;
|
|
@@ -47,14 +58,23 @@ declare class AuthManager {
|
|
|
47
58
|
private storageKey;
|
|
48
59
|
private api;
|
|
49
60
|
private deviceId;
|
|
50
|
-
|
|
61
|
+
private deviceIdProvider;
|
|
62
|
+
private autoSignInConfig;
|
|
63
|
+
private initPromise;
|
|
64
|
+
private signInPromise;
|
|
65
|
+
constructor(storage: StorageAdapter | null, storageKey: string, options?: {
|
|
66
|
+
deviceIdProvider?: DeviceIdProvider | null;
|
|
67
|
+
autoSignIn?: AutoSignInConfig | null;
|
|
68
|
+
});
|
|
51
69
|
/** @internal */
|
|
52
70
|
_setApi(api: ApiClient): void;
|
|
53
71
|
init(): Promise<void>;
|
|
72
|
+
private _init;
|
|
54
73
|
signIn(params: SignInParams): Promise<{
|
|
55
74
|
user: Record<string, unknown>;
|
|
56
75
|
isNewUser: boolean;
|
|
57
76
|
}>;
|
|
77
|
+
private _signIn;
|
|
58
78
|
getToken(): Promise<string | null>;
|
|
59
79
|
forceRefresh(): Promise<string | null>;
|
|
60
80
|
signOut(): Promise<void>;
|
|
@@ -91,15 +111,33 @@ declare class Collection<T = Record<string, unknown>> {
|
|
|
91
111
|
count(filter?: Record<string, unknown>): Promise<number>;
|
|
92
112
|
}
|
|
93
113
|
|
|
114
|
+
declare class PushManager {
|
|
115
|
+
private adapter;
|
|
116
|
+
private api;
|
|
117
|
+
private auth;
|
|
118
|
+
constructor(adapter: PushAdapter, api: ApiClient, auth: AuthManager);
|
|
119
|
+
register(): Promise<void>;
|
|
120
|
+
unregister(): Promise<void>;
|
|
121
|
+
requestPermission(): Promise<boolean>;
|
|
122
|
+
getPermissionStatus(): Promise<"granted" | "denied" | "undetermined">;
|
|
123
|
+
addNotificationOpenedListener(handler: (payload: Record<string, unknown>) => void): () => void;
|
|
124
|
+
addNotificationReceivedListener(handler: (payload: Record<string, unknown>) => void): () => void;
|
|
125
|
+
private reportOpen;
|
|
126
|
+
}
|
|
127
|
+
|
|
94
128
|
interface CodixusClientConfig {
|
|
95
129
|
apiUrl: string;
|
|
96
130
|
storageKey?: string;
|
|
97
131
|
storage?: StorageAdapter | null;
|
|
98
132
|
appSecret?: string;
|
|
133
|
+
deviceIdProvider?: DeviceIdProvider | null;
|
|
134
|
+
autoSignIn?: AutoSignInConfig | null;
|
|
135
|
+
push?: PushAdapter;
|
|
99
136
|
}
|
|
100
137
|
declare class CodixusClient {
|
|
101
138
|
readonly auth: AuthManager;
|
|
102
139
|
readonly api: ApiClient;
|
|
140
|
+
readonly push?: PushManager;
|
|
103
141
|
constructor(config: CodixusClientConfig);
|
|
104
142
|
/**
|
|
105
143
|
* Create a typed collection accessor.
|
|
@@ -115,4 +153,4 @@ declare class CodixusClient {
|
|
|
115
153
|
init(): Promise<void>;
|
|
116
154
|
}
|
|
117
155
|
|
|
118
|
-
export { ApiClient, type AuthState, CodixusClient, type CodixusClientConfig, Collection, type CryptoProvider, type FindOptions, type SignInParams, type StorageAdapter, setCryptoProvider };
|
|
156
|
+
export { ApiClient, type AuthState, type AutoSignInConfig, CodixusClient, type CodixusClientConfig, Collection, type CryptoProvider, type DeviceIdProvider, type FindOptions, PushAdapter, type SignInParams, type StorageAdapter, setCryptoProvider };
|