@h-ai/capacitor 0.1.0-alpha.18 → 0.1.0-alpha.20
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/README.md +13 -9
- package/dist/index.d.ts +6 -6
- package/dist/index.js +116 -50
- package/dist/index.js.map +1 -1
- package/package.json +9 -4
package/README.md
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
# @h-ai/capacitor
|
|
2
2
|
|
|
3
|
-
Capacitor 原生桥接模块,为 hai Framework
|
|
3
|
+
Capacitor 原生桥接模块,为 hai Framework 移动应用提供原生安全 Token 存储、设备信息、推送通知、相机与状态栏等能力的统一封装。
|
|
4
4
|
|
|
5
5
|
## 支持的能力
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
| 状态栏 | `@capacitor/status-bar`(可选) | 沉浸式、背景色、样式配置 |
|
|
7
|
+
- **Token 存储**:`@aparajita/capacitor-secure-storage`(原生必需)。Android 使用 KeyStore + 加密 SharedPreferences,iOS 使用 Keychain;Web 不回退。
|
|
8
|
+
- **Preferences**:`@capacitor/preferences`(必需)。通用偏好数据存储,适合非敏感配置,不用于认证 Token。
|
|
9
|
+
- **设备信息**:`@capacitor/device`(可选)。平台、版本、型号检测。
|
|
10
|
+
- **应用版本**:`@capacitor/app`(可选)。读取 appVersion / appBuild。
|
|
11
|
+
- **推送通知**:`@capacitor/push-notifications`(可选)。注册 FCM/APNs Token、监听推送事件。
|
|
12
|
+
- **相机/相册**:`@capacitor/camera`(可选)。拍照、选取相册图片。
|
|
13
|
+
- **状态栏**:`@capacitor/status-bar`(可选)。沉浸式、背景色、样式配置。
|
|
15
14
|
|
|
16
15
|
## 快速开始
|
|
17
16
|
|
|
@@ -40,6 +39,8 @@ await apiClient.init({
|
|
|
40
39
|
})
|
|
41
40
|
```
|
|
42
41
|
|
|
42
|
+
`createCapacitorTokenStorage()` 仅在 Android/iOS 原生环境中持久化 token,并要求已安装 `@aparajita/capacitor-secure-storage`。纯 Web 环境下不会退化到 `localStorage`;`get*()` 返回 `null`,`set*()` / `clear()` 为 no-op。
|
|
43
|
+
|
|
43
44
|
### 设备信息与推送
|
|
44
45
|
|
|
45
46
|
```ts
|
|
@@ -86,6 +87,8 @@ const result = await capacitor.preferences.get('my_key')
|
|
|
86
87
|
await capacitor.preferences.remove('my_key')
|
|
87
88
|
```
|
|
88
89
|
|
|
90
|
+
`capacitor.preferences` 适合保存语言、主题、草稿等普通偏好数据;认证 Token 请使用 `createCapacitorTokenStorage()`。
|
|
91
|
+
|
|
89
92
|
## 配置
|
|
90
93
|
|
|
91
94
|
本模块无配置文件。`capacitor.init()` 仅检测 Capacitor 运行环境是否可用。
|
|
@@ -125,6 +128,7 @@ if (!result.success) {
|
|
|
125
128
|
| `HaiCapacitorError.PREFERENCES_SET_FAILED` | `hai:capacitor:012` | Preferences 写入失败 |
|
|
126
129
|
| `HaiCapacitorError.PREFERENCES_REMOVE_FAILED` | `hai:capacitor:013` | Preferences 删除失败 |
|
|
127
130
|
| `HaiCapacitorError.DEVICE_INFO_FAILED` | `hai:capacitor:020` | 设备信息获取失败 |
|
|
131
|
+
| `HaiCapacitorError.APP_VERSION_FAILED` | `hai:capacitor:021` | 应用版本获取失败 |
|
|
128
132
|
| `HaiCapacitorError.PUSH_REGISTER_FAILED` | `hai:capacitor:030` | 推送注册失败 |
|
|
129
133
|
| `HaiCapacitorError.PUSH_LISTEN_FAILED` | `hai:capacitor:031` | 推送监听失败 |
|
|
130
134
|
| `HaiCapacitorError.CAMERA_FAILED` | `hai:capacitor:040` | 相机操作失败 |
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ declare const HaiCapacitorError: {
|
|
|
11
11
|
readonly PREFERENCES_SET_FAILED: _h_ai_core.HaiErrorDef;
|
|
12
12
|
readonly PREFERENCES_REMOVE_FAILED: _h_ai_core.HaiErrorDef;
|
|
13
13
|
readonly DEVICE_INFO_FAILED: _h_ai_core.HaiErrorDef;
|
|
14
|
+
readonly APP_VERSION_FAILED: _h_ai_core.HaiErrorDef;
|
|
14
15
|
readonly PUSH_REGISTER_FAILED: _h_ai_core.HaiErrorDef;
|
|
15
16
|
readonly PUSH_LISTEN_FAILED: _h_ai_core.HaiErrorDef;
|
|
16
17
|
readonly CAMERA_FAILED: _h_ai_core.HaiErrorDef;
|
|
@@ -183,18 +184,17 @@ declare const capacitor: CapacitorFunctions;
|
|
|
183
184
|
/**
|
|
184
185
|
* @h-ai/capacitor — Token 存储
|
|
185
186
|
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
187
|
+
* 基于原生安全存储插件的 TokenStorage 实现。
|
|
188
|
+
* 仅在 Capacitor 原生环境启用,拒绝回退到不安全的 Web 存储。
|
|
188
189
|
*
|
|
189
190
|
* @module capacitor-token-storage
|
|
190
191
|
*/
|
|
191
192
|
|
|
192
193
|
/**
|
|
193
|
-
*
|
|
194
|
+
* 创建基于原生安全存储的 TokenStorage
|
|
194
195
|
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
* 比 localStorage 有更好的安全性。
|
|
196
|
+
* 在原生 Android/iOS 环境下使用 `@aparajita/capacitor-secure-storage`
|
|
197
|
+
* 保存 access token / refresh token;Web 环境不做不安全回退。
|
|
198
198
|
*
|
|
199
199
|
* @returns TokenStorage 实例
|
|
200
200
|
*
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,7 @@ var en_US_default = {
|
|
|
12
12
|
capacitor_preferencesSetFailed: "Failed to write to Capacitor Preferences",
|
|
13
13
|
capacitor_preferencesRemoveFailed: "Failed to remove from Capacitor Preferences",
|
|
14
14
|
capacitor_deviceInfoFailed: "Failed to get device info",
|
|
15
|
+
capacitor_appVersionFailed: "Failed to get app version",
|
|
15
16
|
capacitor_pushRegisterFailed: "Failed to register push notifications",
|
|
16
17
|
capacitor_pushListenFailed: "Failed to listen for push notifications",
|
|
17
18
|
capacitor_cameraFailed: "Failed to access camera",
|
|
@@ -28,6 +29,7 @@ var zh_CN_default = {
|
|
|
28
29
|
capacitor_preferencesSetFailed: "\u5199\u5165 Capacitor Preferences \u5931\u8D25",
|
|
29
30
|
capacitor_preferencesRemoveFailed: "\u5220\u9664 Capacitor Preferences \u5931\u8D25",
|
|
30
31
|
capacitor_deviceInfoFailed: "\u83B7\u53D6\u8BBE\u5907\u4FE1\u606F\u5931\u8D25",
|
|
32
|
+
capacitor_appVersionFailed: "\u83B7\u53D6\u5E94\u7528\u7248\u672C\u5931\u8D25",
|
|
31
33
|
capacitor_pushRegisterFailed: "\u6CE8\u518C\u63A8\u9001\u901A\u77E5\u5931\u8D25",
|
|
32
34
|
capacitor_pushListenFailed: "\u76D1\u542C\u63A8\u9001\u901A\u77E5\u5931\u8D25",
|
|
33
35
|
capacitor_cameraFailed: "\u8BBF\u95EE\u76F8\u673A\u5931\u8D25",
|
|
@@ -49,6 +51,7 @@ var CapacitorErrorInfo = {
|
|
|
49
51
|
PREFERENCES_SET_FAILED: "012:500",
|
|
50
52
|
PREFERENCES_REMOVE_FAILED: "013:500",
|
|
51
53
|
DEVICE_INFO_FAILED: "020:500",
|
|
54
|
+
APP_VERSION_FAILED: "021:500",
|
|
52
55
|
PUSH_REGISTER_FAILED: "030:500",
|
|
53
56
|
PUSH_LISTEN_FAILED: "031:500",
|
|
54
57
|
CAMERA_FAILED: "040:500",
|
|
@@ -128,12 +131,13 @@ async function getAppVersion() {
|
|
|
128
131
|
});
|
|
129
132
|
} catch (cause) {
|
|
130
133
|
return err(
|
|
131
|
-
HaiCapacitorError.
|
|
132
|
-
capacitorM("
|
|
134
|
+
HaiCapacitorError.APP_VERSION_FAILED,
|
|
135
|
+
capacitorM("capacitor_appVersionFailed"),
|
|
133
136
|
cause
|
|
134
137
|
);
|
|
135
138
|
}
|
|
136
139
|
}
|
|
140
|
+
var logger = core.logger.child({ module: "capacitor", scope: "push" });
|
|
137
141
|
async function registerPush() {
|
|
138
142
|
try {
|
|
139
143
|
const { PushNotifications } = await import('@capacitor/push-notifications');
|
|
@@ -146,30 +150,45 @@ async function registerPush() {
|
|
|
146
150
|
}
|
|
147
151
|
const REGISTER_TIMEOUT_MS = 3e4;
|
|
148
152
|
const token = await new Promise((resolve, reject) => {
|
|
149
|
-
let
|
|
150
|
-
let
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
153
|
+
let settled = false;
|
|
154
|
+
let listeners = [];
|
|
155
|
+
let timer;
|
|
156
|
+
async function cleanup() {
|
|
157
|
+
if (timer) {
|
|
158
|
+
clearTimeout(timer);
|
|
159
|
+
}
|
|
160
|
+
const removeResults = await Promise.allSettled(listeners.map((listener) => listener.remove()));
|
|
161
|
+
const rejectedCount = removeResults.filter((result) => result.status === "rejected").length;
|
|
162
|
+
if (rejectedCount > 0) {
|
|
163
|
+
logger.warn("Failed to remove push registration listeners", { rejectedCount });
|
|
164
|
+
}
|
|
159
165
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
166
|
+
function settleWith(handler, value) {
|
|
167
|
+
if (settled)
|
|
168
|
+
return;
|
|
169
|
+
settled = true;
|
|
170
|
+
void cleanup().finally(() => {
|
|
171
|
+
handler(value);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
timer = setTimeout(() => {
|
|
175
|
+
settleWith(reject, new Error("Push registration timed out"));
|
|
176
|
+
}, REGISTER_TIMEOUT_MS);
|
|
177
|
+
void Promise.all([
|
|
178
|
+
PushNotifications.addListener("registration", (t) => {
|
|
179
|
+
settleWith(resolve, t.value);
|
|
180
|
+
}),
|
|
181
|
+
PushNotifications.addListener("registrationError", (error) => {
|
|
182
|
+
settleWith(reject, error instanceof Error ? error : new Error(String(error)));
|
|
183
|
+
})
|
|
184
|
+
]).then(async (attachedListeners) => {
|
|
185
|
+
listeners = attachedListeners;
|
|
186
|
+
if (settled)
|
|
187
|
+
return;
|
|
188
|
+
await PushNotifications.register();
|
|
189
|
+
}).catch((error) => {
|
|
190
|
+
settleWith(reject, error instanceof Error ? error : new Error(String(error)));
|
|
171
191
|
});
|
|
172
|
-
PushNotifications.register();
|
|
173
192
|
});
|
|
174
193
|
return ok({ token });
|
|
175
194
|
} catch (cause) {
|
|
@@ -213,7 +232,11 @@ async function listenPush(callbacks) {
|
|
|
213
232
|
listeners.push(listener);
|
|
214
233
|
}
|
|
215
234
|
const cleanup = async () => {
|
|
216
|
-
await Promise.
|
|
235
|
+
const removeResults = await Promise.allSettled(listeners.map((listener) => listener.remove()));
|
|
236
|
+
const rejectedCount = removeResults.filter((result) => result.status === "rejected").length;
|
|
237
|
+
if (rejectedCount > 0) {
|
|
238
|
+
logger.warn("Failed to remove push listeners", { rejectedCount });
|
|
239
|
+
}
|
|
217
240
|
};
|
|
218
241
|
return ok(cleanup);
|
|
219
242
|
} catch (cause) {
|
|
@@ -276,51 +299,94 @@ async function hideStatusBar() {
|
|
|
276
299
|
);
|
|
277
300
|
}
|
|
278
301
|
}
|
|
279
|
-
var
|
|
302
|
+
var logger2 = core.logger.child({ module: "capacitor", scope: "token-storage" });
|
|
280
303
|
var PREF_ACCESS_TOKEN = "hai_access_token";
|
|
281
304
|
var PREF_REFRESH_TOKEN = "hai_refresh_token";
|
|
305
|
+
var secureStoragePromise = null;
|
|
306
|
+
var secureStorageWarningLogged = false;
|
|
307
|
+
function logSecureStorageUnavailable(reason, error) {
|
|
308
|
+
if (secureStorageWarningLogged)
|
|
309
|
+
return;
|
|
310
|
+
secureStorageWarningLogged = true;
|
|
311
|
+
logger2.warn("Capacitor secure token storage unavailable; token persistence is disabled", {
|
|
312
|
+
reason,
|
|
313
|
+
error
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
async function loadSecureStoragePlugin() {
|
|
317
|
+
if (!secureStoragePromise) {
|
|
318
|
+
secureStoragePromise = (async () => {
|
|
319
|
+
try {
|
|
320
|
+
const { Capacitor } = await import('@capacitor/core');
|
|
321
|
+
if (!Capacitor.isNativePlatform()) {
|
|
322
|
+
logSecureStorageUnavailable("non-native-platform");
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
const { SecureStorage } = await import('@aparajita/capacitor-secure-storage');
|
|
326
|
+
return SecureStorage;
|
|
327
|
+
} catch (error) {
|
|
328
|
+
logSecureStorageUnavailable("plugin-load-failed", error);
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
})();
|
|
332
|
+
}
|
|
333
|
+
return secureStoragePromise;
|
|
334
|
+
}
|
|
282
335
|
function createCapacitorTokenStorage() {
|
|
283
336
|
return {
|
|
284
337
|
async getAccessToken() {
|
|
285
338
|
try {
|
|
286
|
-
const
|
|
287
|
-
|
|
339
|
+
const storage = await loadSecureStoragePlugin();
|
|
340
|
+
if (!storage)
|
|
341
|
+
return null;
|
|
342
|
+
return await storage.getItem(PREF_ACCESS_TOKEN);
|
|
288
343
|
} catch (error) {
|
|
289
|
-
|
|
344
|
+
logger2.error("Failed to get access token from secure storage", { error });
|
|
290
345
|
return null;
|
|
291
346
|
}
|
|
292
347
|
},
|
|
293
348
|
async getRefreshToken() {
|
|
294
349
|
try {
|
|
295
|
-
const
|
|
296
|
-
|
|
350
|
+
const storage = await loadSecureStoragePlugin();
|
|
351
|
+
if (!storage)
|
|
352
|
+
return null;
|
|
353
|
+
return await storage.getItem(PREF_REFRESH_TOKEN);
|
|
297
354
|
} catch (error) {
|
|
298
|
-
|
|
355
|
+
logger2.error("Failed to get refresh token from secure storage", { error });
|
|
299
356
|
return null;
|
|
300
357
|
}
|
|
301
358
|
},
|
|
302
359
|
async setAccessToken(token) {
|
|
303
360
|
try {
|
|
304
|
-
|
|
361
|
+
const storage = await loadSecureStoragePlugin();
|
|
362
|
+
if (!storage)
|
|
363
|
+
return;
|
|
364
|
+
await storage.setItem(PREF_ACCESS_TOKEN, token);
|
|
305
365
|
} catch (error) {
|
|
306
|
-
|
|
366
|
+
logger2.error("Failed to set access token in secure storage", { error });
|
|
307
367
|
}
|
|
308
368
|
},
|
|
309
369
|
async setRefreshToken(token) {
|
|
310
370
|
try {
|
|
311
|
-
|
|
371
|
+
const storage = await loadSecureStoragePlugin();
|
|
372
|
+
if (!storage)
|
|
373
|
+
return;
|
|
374
|
+
await storage.setItem(PREF_REFRESH_TOKEN, token);
|
|
312
375
|
} catch (error) {
|
|
313
|
-
|
|
376
|
+
logger2.error("Failed to set refresh token in secure storage", { error });
|
|
314
377
|
}
|
|
315
378
|
},
|
|
316
379
|
async clear() {
|
|
317
380
|
try {
|
|
381
|
+
const storage = await loadSecureStoragePlugin();
|
|
382
|
+
if (!storage)
|
|
383
|
+
return;
|
|
318
384
|
await Promise.all([
|
|
319
|
-
|
|
320
|
-
|
|
385
|
+
storage.removeItem(PREF_ACCESS_TOKEN),
|
|
386
|
+
storage.removeItem(PREF_REFRESH_TOKEN)
|
|
321
387
|
]);
|
|
322
388
|
} catch (error) {
|
|
323
|
-
|
|
389
|
+
logger2.error("Failed to clear tokens from secure storage", { error });
|
|
324
390
|
}
|
|
325
391
|
}
|
|
326
392
|
};
|
|
@@ -363,7 +429,7 @@ async function safeRemovePreference(key) {
|
|
|
363
429
|
}
|
|
364
430
|
|
|
365
431
|
// src/capacitor-main.ts
|
|
366
|
-
var
|
|
432
|
+
var logger3 = core.logger.child({ module: "capacitor", scope: "main" });
|
|
367
433
|
var initialized = false;
|
|
368
434
|
var initInProgress = false;
|
|
369
435
|
var cachedPlatform = null;
|
|
@@ -407,7 +473,7 @@ function isCapacitorAvailable() {
|
|
|
407
473
|
var capacitor = {
|
|
408
474
|
async init() {
|
|
409
475
|
if (initInProgress) {
|
|
410
|
-
|
|
476
|
+
logger3.warn("Capacitor init already in progress, skipping concurrent call");
|
|
411
477
|
return err(
|
|
412
478
|
HaiCapacitorError.INIT_IN_PROGRESS,
|
|
413
479
|
capacitorM("capacitor_initInProgress")
|
|
@@ -416,12 +482,12 @@ var capacitor = {
|
|
|
416
482
|
initInProgress = true;
|
|
417
483
|
try {
|
|
418
484
|
if (initialized) {
|
|
419
|
-
|
|
485
|
+
logger3.warn("Capacitor module is already initialized, reinitializing");
|
|
420
486
|
await capacitor.close();
|
|
421
487
|
}
|
|
422
|
-
|
|
488
|
+
logger3.info("Initializing capacitor module");
|
|
423
489
|
if (!isCapacitorAvailable()) {
|
|
424
|
-
|
|
490
|
+
logger3.error("Capacitor is not available in current environment");
|
|
425
491
|
return err(
|
|
426
492
|
HaiCapacitorError.NOT_AVAILABLE,
|
|
427
493
|
capacitorM("capacitor_notAvailable")
|
|
@@ -430,7 +496,7 @@ var capacitor = {
|
|
|
430
496
|
const { Capacitor } = await import('@capacitor/core');
|
|
431
497
|
const platform = Capacitor.getPlatform();
|
|
432
498
|
if (!platform) {
|
|
433
|
-
|
|
499
|
+
logger3.error("Capacitor initialization failed, platform not detected");
|
|
434
500
|
return err(
|
|
435
501
|
HaiCapacitorError.INIT_FAILED,
|
|
436
502
|
capacitorM("capacitor_initFailed")
|
|
@@ -438,10 +504,10 @@ var capacitor = {
|
|
|
438
504
|
}
|
|
439
505
|
cachedPlatform = platform;
|
|
440
506
|
initialized = true;
|
|
441
|
-
|
|
507
|
+
logger3.info("Capacitor module initialized", { platform });
|
|
442
508
|
return ok(void 0);
|
|
443
509
|
} catch (cause) {
|
|
444
|
-
|
|
510
|
+
logger3.error("Capacitor module initialization failed", { error: cause });
|
|
445
511
|
return err(
|
|
446
512
|
HaiCapacitorError.INIT_FAILED,
|
|
447
513
|
capacitorM("capacitor_initFailed"),
|
|
@@ -453,13 +519,13 @@ var capacitor = {
|
|
|
453
519
|
},
|
|
454
520
|
async close() {
|
|
455
521
|
if (!initialized) {
|
|
456
|
-
|
|
522
|
+
logger3.info("Capacitor module is already closed, skipping");
|
|
457
523
|
return;
|
|
458
524
|
}
|
|
459
|
-
|
|
525
|
+
logger3.info("Closing capacitor module");
|
|
460
526
|
initialized = false;
|
|
461
527
|
cachedPlatform = null;
|
|
462
|
-
|
|
528
|
+
logger3.info("Capacitor module closed");
|
|
463
529
|
},
|
|
464
530
|
getPlatform() {
|
|
465
531
|
if (cachedPlatform) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../messages/en-US.json","../messages/zh-CN.json","../src/capacitor-i18n.ts","../src/capacitor-types.ts","../src/capacitor-camera.ts","../src/capacitor-device.ts","../src/capacitor-push.ts","../src/capacitor-status-bar.ts","../src/capacitor-token-storage.ts","../src/capacitor-main.ts"],"names":["core","ok","err","logger"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"capacitor_initFailed\": \"Capacitor initialization failed\",\n \"capacitor_initInProgress\": \"Capacitor initialization is already in progress\",\n \"capacitor_notAvailable\": \"Capacitor is not available in this environment\",\n \"capacitor_preferencesGetFailed\": \"Failed to read from Capacitor Preferences\",\n \"capacitor_preferencesSetFailed\": \"Failed to write to Capacitor Preferences\",\n \"capacitor_preferencesRemoveFailed\": \"Failed to remove from Capacitor Preferences\",\n \"capacitor_deviceInfoFailed\": \"Failed to get device info\",\n \"capacitor_pushRegisterFailed\": \"Failed to register push notifications\",\n \"capacitor_pushListenFailed\": \"Failed to listen for push notifications\",\n \"capacitor_cameraFailed\": \"Failed to access camera\",\n \"capacitor_statusBarFailed\": \"Failed to configure status bar\",\n \"capacitor_notInitialized\": \"Capacitor module is not initialized\"\n}\n","{\n \"capacitor_initFailed\": \"Capacitor 初始化失败\",\n \"capacitor_initInProgress\": \"Capacitor 正在初始化中\",\n \"capacitor_notAvailable\": \"当前环境不支持 Capacitor\",\n \"capacitor_preferencesGetFailed\": \"读取 Capacitor Preferences 失败\",\n \"capacitor_preferencesSetFailed\": \"写入 Capacitor Preferences 失败\",\n \"capacitor_preferencesRemoveFailed\": \"删除 Capacitor Preferences 失败\",\n \"capacitor_deviceInfoFailed\": \"获取设备信息失败\",\n \"capacitor_pushRegisterFailed\": \"注册推送通知失败\",\n \"capacitor_pushListenFailed\": \"监听推送通知失败\",\n \"capacitor_cameraFailed\": \"访问相机失败\",\n \"capacitor_statusBarFailed\": \"配置状态栏失败\",\n \"capacitor_notInitialized\": \"Capacitor 模块未初始化\"\n}\n","/**\n * @h-ai/capacitor — i18n\n *\n * 模块 i18n 文案访问入口。\n * @module capacitor-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\ntype CapacitorMessageKey = keyof typeof messagesZhCN\n\n/**\n * capacitor 模块 i18n 文案获取器\n *\n * @param key - 文案 Key\n * @returns 本地化后的文案字符串\n */\nexport const capacitorM = core.i18n.createMessageGetter<CapacitorMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n})\n","/**\n * @h-ai/capacitor — 类型定义\n *\n * Capacitor 原生桥接模块的公共类型。\n * @module capacitor-types\n */\n\nimport type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport { core } from '@h-ai/core'\n\nconst CapacitorErrorInfo = {\n INIT_FAILED: '001:500',\n NOT_AVAILABLE: '002:400',\n INIT_IN_PROGRESS: '003:409',\n NOT_INITIALIZED: '010:500',\n PREFERENCES_GET_FAILED: '011:500',\n PREFERENCES_SET_FAILED: '012:500',\n PREFERENCES_REMOVE_FAILED: '013:500',\n DEVICE_INFO_FAILED: '020:500',\n PUSH_REGISTER_FAILED: '030:500',\n PUSH_LISTEN_FAILED: '031:500',\n CAMERA_FAILED: '040:500',\n STATUS_BAR_FAILED: '050:500',\n} as const satisfies ErrorInfo\n\nexport const HaiCapacitorError = core.error.buildHaiErrorsDef('capacitor', CapacitorErrorInfo)\n\n// ─── 子操作接口 ───\n\n/** 设备信息操作 */\nexport interface DeviceOperations {\n /** 获取设备信息(平台、型号、系统版本等) */\n getInfo: () => Promise<HaiResult<DeviceInfo>>\n /** 获取应用版本信息 */\n getAppVersion: () => Promise<HaiResult<{ version: string, build: string }>>\n}\n\n/** 相机操作 */\nexport interface CameraOperations {\n /** 拍照或选取相册图片 */\n takePhoto: (options?: PhotoOptions) => Promise<HaiResult<PhotoResult>>\n}\n\n/** 推送通知操作 */\nexport interface PushOperations {\n /** 注册推送通知,返回设备 Token */\n register: () => Promise<HaiResult<PushRegistration>>\n /** 监听推送通知事件,返回清理函数 */\n listen: (callbacks: PushNotificationCallbacks) => Promise<HaiResult<() => Promise<void>>>\n}\n\n/** 状态栏操作 */\nexport interface StatusBarOperations {\n /** 配置状态栏(样式、背景色、沉浸式) */\n configure: (config: StatusBarConfig) => Promise<HaiResult<void>>\n /** 显示状态栏 */\n show: () => Promise<HaiResult<void>>\n /** 隐藏状态栏 */\n hide: () => Promise<HaiResult<void>>\n}\n\n/** Preferences 操作(安全读写,返回 HaiResult) */\nexport interface PreferencesOperations {\n /** 安全读取 Preference 值 */\n get: (key: string) => Promise<HaiResult<string | null>>\n /** 安全写入 Preference 值 */\n set: (key: string, value: string) => Promise<HaiResult<void>>\n /** 安全删除 Preference 值 */\n remove: (key: string) => Promise<HaiResult<void>>\n}\n\n// ─── 函数接口 ───\n\n/** Capacitor 模块服务对象接口 */\nexport interface CapacitorFunctions {\n /** 初始化 Capacitor 模块 */\n init: () => Promise<HaiResult<void>>\n /** 关闭模块,重置状态 */\n close: () => Promise<void>\n /** 获取当前平台 */\n getPlatform: () => string\n /** 是否运行在原生 App 中 */\n isNative: () => boolean\n /** 是否已初始化 */\n readonly isInitialized: boolean\n\n /** 设备信息操作 */\n readonly device: DeviceOperations\n /** 相机操作 */\n readonly camera: CameraOperations\n /** 推送通知操作 */\n readonly push: PushOperations\n /** 状态栏操作 */\n readonly statusBar: StatusBarOperations\n /** Preferences 安全读写操作 */\n readonly preferences: PreferencesOperations\n}\n\n// ─── 设备信息 ───\n\n/** 设备平台 */\nexport type DevicePlatform = 'ios' | 'android' | 'web'\n\n/** 设备信息 */\nexport interface DeviceInfo {\n /** 平台(ios / android / web) */\n platform: DevicePlatform\n /** 操作系统版本(如 '14.5') */\n osVersion: string\n /** 设备型号(如 'iPhone 14 Pro') */\n model: string\n /** 设备制造商 */\n manufacturer: string\n /** 是否为虚拟设备(模拟器) */\n isVirtual: boolean\n /** 应用版本 */\n appVersion?: string\n /** 应用 Build 号 */\n appBuild?: string\n}\n\n// ─── 推送通知 ───\n\n/** 推送通知数据 */\nexport interface PushNotification {\n /** 通知 ID */\n id: string\n /** 标题 */\n title?: string\n /** 正文 */\n body?: string\n /** 附加数据 */\n data?: Record<string, unknown>\n}\n\n/** 推送注册结果 */\nexport interface PushRegistration {\n /** 设备推送 Token */\n token: string\n}\n\n/** 推送通知回调 */\nexport interface PushNotificationCallbacks {\n /** 收到推送时调用 */\n onReceived?: (notification: PushNotification) => void\n /** 用户点击推送时调用 */\n onActionPerformed?: (notification: PushNotification) => void\n}\n\n// ─── 相机 ───\n\n/** 照片来源 */\nexport type PhotoSource = 'camera' | 'photos' | 'prompt'\n\n/** 照片选项 */\nexport interface PhotoOptions {\n /** 来源(默认 'prompt') */\n source?: PhotoSource\n /** 图片质量 0-100(默认 90) */\n quality?: number\n /** 最大宽度(像素) */\n width?: number\n /** 最大高度(像素) */\n height?: number\n /** 返回格式 */\n resultType?: 'uri' | 'base64' | 'dataUrl'\n}\n\n/** 照片结果 */\nexport interface PhotoResult {\n /** 图片路径或 base64 数据 */\n data: string\n /** MIME 类型 */\n format: string\n}\n\n// ─── 状态栏 ───\n\n/** 状态栏样式 */\nexport type StatusBarStyle = 'dark' | 'light' | 'default'\n\n/** 状态栏配置 */\nexport interface StatusBarConfig {\n /** 状态栏文字样式 */\n style?: StatusBarStyle\n /** 背景颜色(十六进制) */\n backgroundColor?: string\n /** 是否覆盖在内容上(沉浸式) */\n overlay?: boolean\n}\n","/**\n * @h-ai/capacitor — 相机 / 相册\n *\n * 封装 `@capacitor/camera` 插件,提供拍照与相册选择能力。\n *\n * @module capacitor-camera\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PhotoOptions, PhotoResult } from './capacitor-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\n/** 照片来源映射(内部使用) */\nconst SOURCE_MAP = {\n camera: 'Camera',\n photos: 'Photos',\n prompt: 'Prompt',\n} as const\n\n/** 结果类型映射(内部使用) */\nconst RESULT_TYPE_MAP = {\n uri: 'Uri',\n base64: 'Base64',\n dataUrl: 'DataUrl',\n} as const\n\n/**\n * 拍照或选取相册图片\n *\n * 需要安装 `@capacitor/camera` 插件。\n *\n * @param options - 照片选项\n * @returns 照片结果\n *\n * @example\n * ```ts\n * const result = await capacitor.camera.takePhoto({ source: 'camera', quality: 80 })\n * if (result.success) {\n * imageUrl = result.data.data\n * }\n * ```\n */\nexport async function takePhoto(options?: PhotoOptions): Promise<HaiResult<PhotoResult>> {\n try {\n const { Camera, CameraSource, CameraResultType } = await import('@capacitor/camera')\n\n const source = options?.source ?? 'prompt'\n const resultType = options?.resultType ?? 'uri'\n\n const photo = await Camera.getPhoto({\n quality: options?.quality ?? 90,\n source: CameraSource[SOURCE_MAP[source] as keyof typeof CameraSource],\n resultType: CameraResultType[RESULT_TYPE_MAP[resultType] as keyof typeof CameraResultType],\n width: options?.width,\n height: options?.height,\n })\n\n // 根据 resultType 返回对应数据\n let data: string\n if (resultType === 'base64') {\n data = photo.base64String ?? ''\n }\n else if (resultType === 'dataUrl') {\n data = photo.dataUrl ?? ''\n }\n else {\n data = photo.webPath ?? ''\n }\n\n return ok({\n data,\n format: photo.format,\n })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.CAMERA_FAILED,\n capacitorM('capacitor_cameraFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 设备信息\n *\n * 封装 `@capacitor/device` 插件,提供统一的设备信息读取接口。\n *\n * @module capacitor-device\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { DeviceInfo } from './capacitor-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\n/**\n * 获取设备信息\n *\n * 需要安装 `@capacitor/device` 插件。\n *\n * @returns 设备信息(平台、系统版本、型号等)\n *\n * @example\n * ```ts\n * const result = await capacitor.device.getInfo()\n * if (result.success) {\n * result.data.platform // 'android' | 'ios' | 'web'\n * }\n * ```\n */\nexport async function getDeviceInfo(): Promise<HaiResult<DeviceInfo>> {\n try {\n const { Device } = await import('@capacitor/device')\n const info = await Device.getInfo()\n\n return ok({\n platform: info.platform as DeviceInfo['platform'],\n osVersion: info.osVersion,\n model: info.model,\n manufacturer: info.manufacturer,\n isVirtual: info.isVirtual,\n })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.DEVICE_INFO_FAILED,\n capacitorM('capacitor_deviceInfoFailed'),\n cause,\n )\n }\n}\n\n/**\n * 获取应用版本信息\n *\n * @returns appVersion 与 appBuild\n *\n * @example\n * ```ts\n * const result = await capacitor.device.getAppVersion()\n * if (result.success) {\n * result.data.version // '1.0.0'\n * result.data.build // '42'\n * }\n * ```\n */\nexport async function getAppVersion(): Promise<HaiResult<{ version: string, build: string }>> {\n try {\n const { App } = await import('@capacitor/app')\n const info = await App.getInfo()\n\n return ok({\n version: info.version,\n build: info.build,\n })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.DEVICE_INFO_FAILED,\n capacitorM('capacitor_deviceInfoFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 推送通知\n *\n * 封装 `@capacitor/push-notifications` 插件,提供推送注册与消息监听。\n *\n * @module capacitor-push\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PushNotificationCallbacks, PushRegistration } from './capacitor-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\n/**\n * 注册推送通知\n *\n * 请求推送权限并注册设备 Token。需要安装 `@capacitor/push-notifications`。\n * 注册超过 30 秒未响应时自动超时。\n *\n * @returns 设备推送 Token\n *\n * @example\n * ```ts\n * const result = await capacitor.push.register()\n * if (result.success) {\n * await api.post('/push/register', { token: result.data.token })\n * }\n * ```\n */\nexport async function registerPush(): Promise<HaiResult<PushRegistration>> {\n try {\n const { PushNotifications } = await import('@capacitor/push-notifications')\n\n // 请求权限\n const permResult = await PushNotifications.requestPermissions()\n if (permResult.receive !== 'granted') {\n return err(\n HaiCapacitorError.PUSH_REGISTER_FAILED,\n capacitorM('capacitor_pushRegisterFailed'),\n )\n }\n\n // 注册并等待 Token(带超时防护)\n const REGISTER_TIMEOUT_MS = 30_000\n const token = await new Promise<string>((resolve, reject) => {\n let regListener: { remove: () => Promise<void> } | undefined\n let errListener: { remove: () => Promise<void> } | undefined\n\n const timer = setTimeout(() => {\n cleanup()\n reject(new Error('Push registration timed out'))\n }, REGISTER_TIMEOUT_MS)\n\n function cleanup() {\n clearTimeout(timer)\n regListener?.remove()\n errListener?.remove()\n }\n\n PushNotifications.addListener('registration', (t) => {\n cleanup()\n resolve(t.value)\n }).then((l) => { regListener = l })\n\n PushNotifications.addListener('registrationError', (error) => {\n cleanup()\n reject(error)\n }).then((l) => { errListener = l })\n\n PushNotifications.register()\n })\n\n return ok({ token })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PUSH_REGISTER_FAILED,\n capacitorM('capacitor_pushRegisterFailed'),\n cause,\n )\n }\n}\n\n/**\n * 监听推送通知事件\n *\n * @param callbacks - 回调配置(收到推送、点击推送)\n * @returns 包含清理函数的 HaiResult\n *\n * @example\n * ```ts\n * const result = await capacitor.push.listen({\n * onReceived: (n) => handlePushReceived(n),\n * onActionPerformed: (n) => router.goto('/notifications'),\n * })\n * if (result.success) {\n * // 停止监听\n * await result.data()\n * }\n * ```\n */\nexport async function listenPush(callbacks: PushNotificationCallbacks): Promise<HaiResult<() => Promise<void>>> {\n try {\n const { PushNotifications } = await import('@capacitor/push-notifications')\n const listeners: Array<{ remove: () => Promise<void> }> = []\n\n if (callbacks.onReceived) {\n const listener = await PushNotifications.addListener(\n 'pushNotificationReceived',\n (notification) => {\n callbacks.onReceived?.({\n id: notification.id,\n title: notification.title,\n body: notification.body,\n data: notification.data as Record<string, unknown>,\n })\n },\n )\n listeners.push(listener)\n }\n\n if (callbacks.onActionPerformed) {\n const listener = await PushNotifications.addListener(\n 'pushNotificationActionPerformed',\n (action) => {\n callbacks.onActionPerformed?.({\n id: action.notification.id,\n title: action.notification.title,\n body: action.notification.body,\n data: action.notification.data as Record<string, unknown>,\n })\n },\n )\n listeners.push(listener)\n }\n\n const cleanup = async () => {\n await Promise.all(listeners.map(l => l.remove()))\n }\n return ok(cleanup)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PUSH_LISTEN_FAILED,\n capacitorM('capacitor_pushListenFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 状态栏\n *\n * 封装 `@capacitor/status-bar` 插件,支持沉浸式状态栏配置。\n *\n * @module capacitor-status-bar\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { StatusBarConfig } from './capacitor-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\n/**\n * 配置状态栏\n *\n * 需要安装 `@capacitor/status-bar` 插件。\n *\n * @param config - 状态栏配置\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.statusBar.configure({\n * style: 'dark',\n * overlay: true,\n * backgroundColor: '#ffffff',\n * })\n * ```\n */\nexport async function configureStatusBar(config: StatusBarConfig): Promise<HaiResult<void>> {\n try {\n const { StatusBar, Style } = await import('@capacitor/status-bar')\n\n // 设置样式\n if (config.style) {\n const styleMap: Record<string, typeof Style[keyof typeof Style]> = {\n dark: Style.Dark,\n light: Style.Light,\n default: Style.Default,\n }\n await StatusBar.setStyle({ style: styleMap[config.style] ?? Style.Default })\n }\n\n // 设置背景色\n if (config.backgroundColor) {\n await StatusBar.setBackgroundColor({ color: config.backgroundColor })\n }\n\n // 设置覆盖模式\n if (config.overlay !== undefined) {\n await StatusBar.setOverlaysWebView({ overlay: config.overlay })\n }\n\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.STATUS_BAR_FAILED,\n capacitorM('capacitor_statusBarFailed'),\n cause,\n )\n }\n}\n\n/**\n * 显示状态栏\n *\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.statusBar.show()\n * ```\n */\nexport async function showStatusBar(): Promise<HaiResult<void>> {\n try {\n const { StatusBar } = await import('@capacitor/status-bar')\n await StatusBar.show()\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.STATUS_BAR_FAILED,\n capacitorM('capacitor_statusBarFailed'),\n cause,\n )\n }\n}\n\n/**\n * 隐藏状态栏\n *\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.statusBar.hide()\n * ```\n */\nexport async function hideStatusBar(): Promise<HaiResult<void>> {\n try {\n const { StatusBar } = await import('@capacitor/status-bar')\n await StatusBar.hide()\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.STATUS_BAR_FAILED,\n capacitorM('capacitor_statusBarFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — Token 存储\n *\n * 基于 Capacitor Preferences 的 TokenStorage 实现,\n * 比浏览器 localStorage 更安全,适用于原生 App 场景。\n *\n * @module capacitor-token-storage\n */\n\nimport type { TokenStorage } from '@h-ai/api-client'\nimport type { HaiResult } from '@h-ai/core'\nimport { Preferences } from '@capacitor/preferences'\nimport { core, err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\nconst logger = core.logger.child({ module: 'capacitor', scope: 'token-storage' })\n\n/** Preferences 存储 Key */\nconst PREF_ACCESS_TOKEN = 'hai_access_token'\nconst PREF_REFRESH_TOKEN = 'hai_refresh_token'\n\n/**\n * 创建基于 Capacitor Preferences 的 TokenStorage\n *\n * 使用 `@capacitor/preferences` 插件进行持久化存储,\n * 在 Android 使用 SharedPreferences,iOS 使用 UserDefaults,\n * 比 localStorage 有更好的安全性。\n *\n * @returns TokenStorage 实例\n *\n * @example\n * ```ts\n * import { createCapacitorTokenStorage } from '@h-ai/capacitor'\n * import { apiClient } from '@h-ai/api-client'\n *\n * await apiClient.init({\n * baseUrl: 'https://api.example.com/v1',\n * auth: {\n * storage: createCapacitorTokenStorage(),\n * refreshPath: '/auth/refresh',\n * },\n * })\n * ```\n */\nexport function createCapacitorTokenStorage(): TokenStorage {\n return {\n async getAccessToken(): Promise<string | null> {\n try {\n const { value } = await Preferences.get({ key: PREF_ACCESS_TOKEN })\n return value\n }\n catch (error) {\n logger.error('Failed to get access token from Preferences', { error })\n return null\n }\n },\n\n async getRefreshToken(): Promise<string | null> {\n try {\n const { value } = await Preferences.get({ key: PREF_REFRESH_TOKEN })\n return value\n }\n catch (error) {\n logger.error('Failed to get refresh token from Preferences', { error })\n return null\n }\n },\n\n async setAccessToken(token: string): Promise<void> {\n try {\n await Preferences.set({ key: PREF_ACCESS_TOKEN, value: token })\n }\n catch (error) {\n logger.error('Failed to set access token in Preferences', { error })\n }\n },\n\n async setRefreshToken(token: string): Promise<void> {\n try {\n await Preferences.set({ key: PREF_REFRESH_TOKEN, value: token })\n }\n catch (error) {\n logger.error('Failed to set refresh token in Preferences', { error })\n }\n },\n\n async clear(): Promise<void> {\n try {\n await Promise.all([\n Preferences.remove({ key: PREF_ACCESS_TOKEN }),\n Preferences.remove({ key: PREF_REFRESH_TOKEN }),\n ])\n }\n catch (error) {\n logger.error('Failed to clear tokens from Preferences', { error })\n }\n },\n }\n}\n\n/**\n * 安全读取 Preference 值(返回 HaiResult)\n *\n * @param key - Preference Key\n * @returns HaiResult 包裹的值\n *\n * @example\n * ```ts\n * const result = await capacitor.preferences.get('my_key')\n * if (result.success) {\n * result.data // 值或 null\n * }\n * ```\n */\nexport async function safeGetPreference(key: string): Promise<HaiResult<string | null>> {\n try {\n const { value } = await Preferences.get({ key })\n return ok(value)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PREFERENCES_GET_FAILED,\n capacitorM('capacitor_preferencesGetFailed'),\n cause,\n )\n }\n}\n\n/**\n * 安全写入 Preference 值\n *\n * @param key - Preference Key\n * @param value - 要写入的值\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.preferences.set('my_key', 'value')\n * ```\n */\nexport async function safeSetPreference(key: string, value: string): Promise<HaiResult<void>> {\n try {\n await Preferences.set({ key, value })\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PREFERENCES_SET_FAILED,\n capacitorM('capacitor_preferencesSetFailed'),\n cause,\n )\n }\n}\n\n/**\n * 安全删除 Preference 值\n *\n * @param key - Preference Key\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.preferences.remove('my_key')\n * ```\n */\nexport async function safeRemovePreference(key: string): Promise<HaiResult<void>> {\n try {\n await Preferences.remove({ key })\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PREFERENCES_REMOVE_FAILED,\n capacitorM('capacitor_preferencesRemoveFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 模块入口(生命周期管理)\n *\n * 提供 Capacitor 原生桥接的初始化与环境检测。\n * `capacitor.init()` 应在应用启动时调用,用于检测 Capacitor 环境可用性。\n *\n * @module capacitor-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { CameraOperations, CapacitorFunctions, DeviceOperations, PreferencesOperations, PushOperations, StatusBarOperations } from './capacitor-types.js'\nimport { core, err, ok } from '@h-ai/core'\nimport { takePhoto } from './capacitor-camera.js'\nimport { getAppVersion, getDeviceInfo } from './capacitor-device.js'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { listenPush, registerPush } from './capacitor-push.js'\nimport { configureStatusBar, hideStatusBar, showStatusBar } from './capacitor-status-bar.js'\nimport { safeGetPreference, safeRemovePreference, safeSetPreference } from './capacitor-token-storage.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\nconst logger = core.logger.child({ module: 'capacitor', scope: 'main' })\n\n/** 是否已初始化 */\nlet initialized = false\n\n/** 是否正在初始化中(并发防护) */\nlet initInProgress = false\n\n/** 缓存平台信息 */\nlet cachedPlatform: string | null = null\n\n// ─── 未初始化代理 ───\n\nconst notInitialized = core.module.createNotInitializedKit(\n HaiCapacitorError.NOT_INITIALIZED,\n () => capacitorM('capacitor_notInitialized'),\n)\n\nconst notInitializedDevice = notInitialized.proxy<DeviceOperations>()\nconst notInitializedCamera = notInitialized.proxy<CameraOperations>()\nconst notInitializedPush = notInitialized.proxy<PushOperations>()\nconst notInitializedStatusBar = notInitialized.proxy<StatusBarOperations>()\nconst notInitializedPreferences = notInitialized.proxy<PreferencesOperations>()\n\n// ─── 已初始化时的操作实现 ───\n\nconst deviceOps: DeviceOperations = {\n getInfo: getDeviceInfo,\n getAppVersion,\n}\n\nconst cameraOps: CameraOperations = {\n takePhoto,\n}\n\nconst pushOps: PushOperations = {\n register: registerPush,\n listen: listenPush,\n}\n\nconst statusBarOps: StatusBarOperations = {\n configure: configureStatusBar,\n show: showStatusBar,\n hide: hideStatusBar,\n}\n\nconst preferencesOps: PreferencesOperations = {\n get: safeGetPreference,\n set: safeSetPreference,\n remove: safeRemovePreference,\n}\n\n// ─── 检测 Capacitor 是否可用(模块内部使用) ───\n\nfunction isCapacitorAvailable(): boolean {\n try {\n // window 上由 Capacitor 运行时注入 Capacitor 全局对象,lib.dom 未声明该属性,故强转为可查库的 Record\n return typeof window !== 'undefined'\n && (window as unknown as Record<string, unknown>).Capacitor !== undefined\n }\n catch {\n return false\n }\n}\n\n// ─── 服务对象 ───\n\n/**\n * Capacitor 模块服务对象\n *\n * @example\n * ```ts\n * import { capacitor } from '@h-ai/capacitor'\n *\n * const result = await capacitor.init()\n * if (result.success) {\n * const info = await capacitor.device.getInfo()\n * await capacitor.statusBar.configure({ style: 'dark', overlay: true })\n * }\n * ```\n */\nexport const capacitor: CapacitorFunctions = {\n async init(): Promise<HaiResult<void>> {\n // 并发初始化防护:避免多次 init 同时执行导致资源泄漏\n if (initInProgress) {\n logger.warn('Capacitor init already in progress, skipping concurrent call')\n return err(\n HaiCapacitorError.INIT_IN_PROGRESS,\n capacitorM('capacitor_initInProgress'),\n )\n }\n initInProgress = true\n\n try {\n if (initialized) {\n logger.warn('Capacitor module is already initialized, reinitializing')\n await capacitor.close()\n }\n\n logger.info('Initializing capacitor module')\n\n if (!isCapacitorAvailable()) {\n logger.error('Capacitor is not available in current environment')\n return err(\n HaiCapacitorError.NOT_AVAILABLE,\n capacitorM('capacitor_notAvailable'),\n )\n }\n\n const { Capacitor } = await import('@capacitor/core')\n const platform = Capacitor.getPlatform()\n\n if (!platform) {\n logger.error('Capacitor initialization failed, platform not detected')\n return err(\n HaiCapacitorError.INIT_FAILED,\n capacitorM('capacitor_initFailed'),\n )\n }\n\n cachedPlatform = platform\n initialized = true\n logger.info('Capacitor module initialized', { platform })\n return ok(undefined)\n }\n catch (cause) {\n logger.error('Capacitor module initialization failed', { error: cause })\n return err(\n HaiCapacitorError.INIT_FAILED,\n capacitorM('capacitor_initFailed'),\n cause,\n )\n }\n finally {\n initInProgress = false\n }\n },\n\n async close() {\n if (!initialized) {\n logger.info('Capacitor module is already closed, skipping')\n return\n }\n logger.info('Closing capacitor module')\n initialized = false\n cachedPlatform = null\n logger.info('Capacitor module closed')\n },\n\n getPlatform(): string {\n if (cachedPlatform) {\n return cachedPlatform\n }\n try {\n // 同 isCapacitorAvailable:Capacitor 全局仅在运行时由 native bridge 注入,需强转后读取\n const cap = (window as unknown as Record<string, unknown>).Capacitor as { getPlatform?: () => string } | undefined\n return cap?.getPlatform?.() ?? 'web'\n }\n catch {\n return 'web'\n }\n },\n\n isNative(): boolean {\n try {\n const cap = (window as unknown as Record<string, unknown>).Capacitor as { isNativePlatform?: () => boolean } | undefined\n return cap?.isNativePlatform?.() ?? false\n }\n catch {\n return false\n }\n },\n\n get isInitialized(): boolean {\n return initialized\n },\n\n get device(): DeviceOperations {\n return initialized ? deviceOps : notInitializedDevice\n },\n\n get camera(): CameraOperations {\n return initialized ? cameraOps : notInitializedCamera\n },\n\n get push(): PushOperations {\n return initialized ? pushOps : notInitializedPush\n },\n\n get statusBar(): StatusBarOperations {\n return initialized ? statusBarOps : notInitializedStatusBar\n },\n\n get preferences(): PreferencesOperations {\n return initialized ? preferencesOps : notInitializedPreferences\n },\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../messages/en-US.json","../messages/zh-CN.json","../src/capacitor-i18n.ts","../src/capacitor-types.ts","../src/capacitor-camera.ts","../src/capacitor-device.ts","../src/capacitor-push.ts","../src/capacitor-status-bar.ts","../src/capacitor-token-storage.ts","../src/capacitor-main.ts"],"names":["core","ok","err","logger"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"capacitor_initFailed\": \"Capacitor initialization failed\",\n \"capacitor_initInProgress\": \"Capacitor initialization is already in progress\",\n \"capacitor_notAvailable\": \"Capacitor is not available in this environment\",\n \"capacitor_preferencesGetFailed\": \"Failed to read from Capacitor Preferences\",\n \"capacitor_preferencesSetFailed\": \"Failed to write to Capacitor Preferences\",\n \"capacitor_preferencesRemoveFailed\": \"Failed to remove from Capacitor Preferences\",\n \"capacitor_deviceInfoFailed\": \"Failed to get device info\",\n \"capacitor_appVersionFailed\": \"Failed to get app version\",\n \"capacitor_pushRegisterFailed\": \"Failed to register push notifications\",\n \"capacitor_pushListenFailed\": \"Failed to listen for push notifications\",\n \"capacitor_cameraFailed\": \"Failed to access camera\",\n \"capacitor_statusBarFailed\": \"Failed to configure status bar\",\n \"capacitor_notInitialized\": \"Capacitor module is not initialized\"\n}\n","{\n \"capacitor_initFailed\": \"Capacitor 初始化失败\",\n \"capacitor_initInProgress\": \"Capacitor 正在初始化中\",\n \"capacitor_notAvailable\": \"当前环境不支持 Capacitor\",\n \"capacitor_preferencesGetFailed\": \"读取 Capacitor Preferences 失败\",\n \"capacitor_preferencesSetFailed\": \"写入 Capacitor Preferences 失败\",\n \"capacitor_preferencesRemoveFailed\": \"删除 Capacitor Preferences 失败\",\n \"capacitor_deviceInfoFailed\": \"获取设备信息失败\",\n \"capacitor_appVersionFailed\": \"获取应用版本失败\",\n \"capacitor_pushRegisterFailed\": \"注册推送通知失败\",\n \"capacitor_pushListenFailed\": \"监听推送通知失败\",\n \"capacitor_cameraFailed\": \"访问相机失败\",\n \"capacitor_statusBarFailed\": \"配置状态栏失败\",\n \"capacitor_notInitialized\": \"Capacitor 模块未初始化\"\n}\n","/**\n * @h-ai/capacitor — i18n\n *\n * 模块 i18n 文案访问入口。\n * @module capacitor-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\ntype CapacitorMessageKey = keyof typeof messagesZhCN\n\n/**\n * capacitor 模块 i18n 文案获取器\n *\n * @param key - 文案 Key\n * @returns 本地化后的文案字符串\n */\nexport const capacitorM = core.i18n.createMessageGetter<CapacitorMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n})\n","/**\n * @h-ai/capacitor — 类型定义\n *\n * Capacitor 原生桥接模块的公共类型。\n * @module capacitor-types\n */\n\nimport type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport { core } from '@h-ai/core'\n\nconst CapacitorErrorInfo = {\n INIT_FAILED: '001:500',\n NOT_AVAILABLE: '002:400',\n INIT_IN_PROGRESS: '003:409',\n NOT_INITIALIZED: '010:500',\n PREFERENCES_GET_FAILED: '011:500',\n PREFERENCES_SET_FAILED: '012:500',\n PREFERENCES_REMOVE_FAILED: '013:500',\n DEVICE_INFO_FAILED: '020:500',\n APP_VERSION_FAILED: '021:500',\n PUSH_REGISTER_FAILED: '030:500',\n PUSH_LISTEN_FAILED: '031:500',\n CAMERA_FAILED: '040:500',\n STATUS_BAR_FAILED: '050:500',\n} as const satisfies ErrorInfo\n\nexport const HaiCapacitorError = core.error.buildHaiErrorsDef('capacitor', CapacitorErrorInfo)\n\n// ─── 子操作接口 ───\n\n/** 设备信息操作 */\nexport interface DeviceOperations {\n /** 获取设备信息(平台、型号、系统版本等) */\n getInfo: () => Promise<HaiResult<DeviceInfo>>\n /** 获取应用版本信息 */\n getAppVersion: () => Promise<HaiResult<{ version: string, build: string }>>\n}\n\n/** 相机操作 */\nexport interface CameraOperations {\n /** 拍照或选取相册图片 */\n takePhoto: (options?: PhotoOptions) => Promise<HaiResult<PhotoResult>>\n}\n\n/** 推送通知操作 */\nexport interface PushOperations {\n /** 注册推送通知,返回设备 Token */\n register: () => Promise<HaiResult<PushRegistration>>\n /** 监听推送通知事件,返回清理函数 */\n listen: (callbacks: PushNotificationCallbacks) => Promise<HaiResult<() => Promise<void>>>\n}\n\n/** 状态栏操作 */\nexport interface StatusBarOperations {\n /** 配置状态栏(样式、背景色、沉浸式) */\n configure: (config: StatusBarConfig) => Promise<HaiResult<void>>\n /** 显示状态栏 */\n show: () => Promise<HaiResult<void>>\n /** 隐藏状态栏 */\n hide: () => Promise<HaiResult<void>>\n}\n\n/** Preferences 操作(安全读写,返回 HaiResult) */\nexport interface PreferencesOperations {\n /** 安全读取 Preference 值 */\n get: (key: string) => Promise<HaiResult<string | null>>\n /** 安全写入 Preference 值 */\n set: (key: string, value: string) => Promise<HaiResult<void>>\n /** 安全删除 Preference 值 */\n remove: (key: string) => Promise<HaiResult<void>>\n}\n\n// ─── 函数接口 ───\n\n/** Capacitor 模块服务对象接口 */\nexport interface CapacitorFunctions {\n /** 初始化 Capacitor 模块 */\n init: () => Promise<HaiResult<void>>\n /** 关闭模块,重置状态 */\n close: () => Promise<void>\n /** 获取当前平台 */\n getPlatform: () => string\n /** 是否运行在原生 App 中 */\n isNative: () => boolean\n /** 是否已初始化 */\n readonly isInitialized: boolean\n\n /** 设备信息操作 */\n readonly device: DeviceOperations\n /** 相机操作 */\n readonly camera: CameraOperations\n /** 推送通知操作 */\n readonly push: PushOperations\n /** 状态栏操作 */\n readonly statusBar: StatusBarOperations\n /** Preferences 安全读写操作 */\n readonly preferences: PreferencesOperations\n}\n\n// ─── 设备信息 ───\n\n/** 设备平台 */\nexport type DevicePlatform = 'ios' | 'android' | 'web'\n\n/** 设备信息 */\nexport interface DeviceInfo {\n /** 平台(ios / android / web) */\n platform: DevicePlatform\n /** 操作系统版本(如 '14.5') */\n osVersion: string\n /** 设备型号(如 'iPhone 14 Pro') */\n model: string\n /** 设备制造商 */\n manufacturer: string\n /** 是否为虚拟设备(模拟器) */\n isVirtual: boolean\n /** 应用版本 */\n appVersion?: string\n /** 应用 Build 号 */\n appBuild?: string\n}\n\n// ─── 推送通知 ───\n\n/** 推送通知数据 */\nexport interface PushNotification {\n /** 通知 ID */\n id: string\n /** 标题 */\n title?: string\n /** 正文 */\n body?: string\n /** 附加数据 */\n data?: Record<string, unknown>\n}\n\n/** 推送注册结果 */\nexport interface PushRegistration {\n /** 设备推送 Token */\n token: string\n}\n\n/** 推送通知回调 */\nexport interface PushNotificationCallbacks {\n /** 收到推送时调用 */\n onReceived?: (notification: PushNotification) => void\n /** 用户点击推送时调用 */\n onActionPerformed?: (notification: PushNotification) => void\n}\n\n// ─── 相机 ───\n\n/** 照片来源 */\nexport type PhotoSource = 'camera' | 'photos' | 'prompt'\n\n/** 照片选项 */\nexport interface PhotoOptions {\n /** 来源(默认 'prompt') */\n source?: PhotoSource\n /** 图片质量 0-100(默认 90) */\n quality?: number\n /** 最大宽度(像素) */\n width?: number\n /** 最大高度(像素) */\n height?: number\n /** 返回格式 */\n resultType?: 'uri' | 'base64' | 'dataUrl'\n}\n\n/** 照片结果 */\nexport interface PhotoResult {\n /** 图片路径或 base64 数据 */\n data: string\n /** MIME 类型 */\n format: string\n}\n\n// ─── 状态栏 ───\n\n/** 状态栏样式 */\nexport type StatusBarStyle = 'dark' | 'light' | 'default'\n\n/** 状态栏配置 */\nexport interface StatusBarConfig {\n /** 状态栏文字样式 */\n style?: StatusBarStyle\n /** 背景颜色(十六进制) */\n backgroundColor?: string\n /** 是否覆盖在内容上(沉浸式) */\n overlay?: boolean\n}\n","/**\n * @h-ai/capacitor — 相机 / 相册\n *\n * 封装 `@capacitor/camera` 插件,提供拍照与相册选择能力。\n *\n * @module capacitor-camera\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PhotoOptions, PhotoResult } from './capacitor-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\n/** 照片来源映射(内部使用) */\nconst SOURCE_MAP = {\n camera: 'Camera',\n photos: 'Photos',\n prompt: 'Prompt',\n} as const\n\n/** 结果类型映射(内部使用) */\nconst RESULT_TYPE_MAP = {\n uri: 'Uri',\n base64: 'Base64',\n dataUrl: 'DataUrl',\n} as const\n\n/**\n * 拍照或选取相册图片\n *\n * 需要安装 `@capacitor/camera` 插件。\n *\n * @param options - 照片选项\n * @returns 照片结果\n *\n * @example\n * ```ts\n * const result = await capacitor.camera.takePhoto({ source: 'camera', quality: 80 })\n * if (result.success) {\n * imageUrl = result.data.data\n * }\n * ```\n */\nexport async function takePhoto(options?: PhotoOptions): Promise<HaiResult<PhotoResult>> {\n try {\n const { Camera, CameraSource, CameraResultType } = await import('@capacitor/camera')\n\n const source = options?.source ?? 'prompt'\n const resultType = options?.resultType ?? 'uri'\n\n const photo = await Camera.getPhoto({\n quality: options?.quality ?? 90,\n source: CameraSource[SOURCE_MAP[source] as keyof typeof CameraSource],\n resultType: CameraResultType[RESULT_TYPE_MAP[resultType] as keyof typeof CameraResultType],\n width: options?.width,\n height: options?.height,\n })\n\n // 根据 resultType 返回对应数据\n let data: string\n if (resultType === 'base64') {\n data = photo.base64String ?? ''\n }\n else if (resultType === 'dataUrl') {\n data = photo.dataUrl ?? ''\n }\n else {\n data = photo.webPath ?? ''\n }\n\n return ok({\n data,\n format: photo.format,\n })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.CAMERA_FAILED,\n capacitorM('capacitor_cameraFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 设备信息\n *\n * 封装 `@capacitor/device` 插件,提供统一的设备信息读取接口。\n *\n * @module capacitor-device\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { DeviceInfo } from './capacitor-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\n/**\n * 获取设备信息\n *\n * 需要安装 `@capacitor/device` 插件。\n *\n * @returns 设备信息(平台、系统版本、型号等)\n *\n * @example\n * ```ts\n * const result = await capacitor.device.getInfo()\n * if (result.success) {\n * result.data.platform // 'android' | 'ios' | 'web'\n * }\n * ```\n */\nexport async function getDeviceInfo(): Promise<HaiResult<DeviceInfo>> {\n try {\n const { Device } = await import('@capacitor/device')\n const info = await Device.getInfo()\n\n return ok({\n platform: info.platform as DeviceInfo['platform'],\n osVersion: info.osVersion,\n model: info.model,\n manufacturer: info.manufacturer,\n isVirtual: info.isVirtual,\n })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.DEVICE_INFO_FAILED,\n capacitorM('capacitor_deviceInfoFailed'),\n cause,\n )\n }\n}\n\n/**\n * 获取应用版本信息\n *\n * @returns appVersion 与 appBuild\n *\n * @example\n * ```ts\n * const result = await capacitor.device.getAppVersion()\n * if (result.success) {\n * result.data.version // '1.0.0'\n * result.data.build // '42'\n * }\n * ```\n */\nexport async function getAppVersion(): Promise<HaiResult<{ version: string, build: string }>> {\n try {\n const { App } = await import('@capacitor/app')\n const info = await App.getInfo()\n\n return ok({\n version: info.version,\n build: info.build,\n })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.APP_VERSION_FAILED,\n capacitorM('capacitor_appVersionFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 推送通知\n *\n * 封装 `@capacitor/push-notifications` 插件,提供推送注册与消息监听。\n *\n * @module capacitor-push\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PushNotificationCallbacks, PushRegistration } from './capacitor-types.js'\nimport { core, err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\nconst logger = core.logger.child({ module: 'capacitor', scope: 'push' })\n\n/**\n * 注册推送通知\n *\n * 请求推送权限并注册设备 Token。需要安装 `@capacitor/push-notifications`。\n * 注册超过 30 秒未响应时自动超时。\n *\n * @returns 设备推送 Token\n *\n * @example\n * ```ts\n * const result = await capacitor.push.register()\n * if (result.success) {\n * await api.post('/push/register', { token: result.data.token })\n * }\n * ```\n */\nexport async function registerPush(): Promise<HaiResult<PushRegistration>> {\n try {\n const { PushNotifications } = await import('@capacitor/push-notifications')\n\n // 请求权限\n const permResult = await PushNotifications.requestPermissions()\n if (permResult.receive !== 'granted') {\n return err(\n HaiCapacitorError.PUSH_REGISTER_FAILED,\n capacitorM('capacitor_pushRegisterFailed'),\n )\n }\n\n // 注册并等待 Token(带超时防护)\n const REGISTER_TIMEOUT_MS = 30_000\n const token = await new Promise<string>((resolve, reject) => {\n let settled = false\n let listeners: Array<{ remove: () => Promise<void> }> = []\n let timer: ReturnType<typeof setTimeout> | undefined\n\n async function cleanup(): Promise<void> {\n if (timer) {\n clearTimeout(timer)\n }\n const removeResults = await Promise.allSettled(listeners.map(listener => listener.remove()))\n const rejectedCount = removeResults.filter(result => result.status === 'rejected').length\n if (rejectedCount > 0) {\n logger.warn('Failed to remove push registration listeners', { rejectedCount })\n }\n }\n\n function settleWith(handler: (value: string | Error) => void, value: string | Error): void {\n if (settled)\n return\n\n settled = true\n void cleanup().finally(() => {\n handler(value)\n })\n }\n\n timer = setTimeout(() => {\n settleWith(reject as (value: string | Error) => void, new Error('Push registration timed out'))\n }, REGISTER_TIMEOUT_MS)\n\n void Promise.all([\n PushNotifications.addListener('registration', (t) => {\n settleWith(resolve as (value: string | Error) => void, t.value)\n }),\n PushNotifications.addListener('registrationError', (error) => {\n settleWith(reject as (value: string | Error) => void, error instanceof Error ? error : new Error(String(error)))\n }),\n ])\n .then(async (attachedListeners) => {\n listeners = attachedListeners\n if (settled)\n return\n\n await PushNotifications.register()\n })\n .catch((error) => {\n settleWith(reject as (value: string | Error) => void, error instanceof Error ? error : new Error(String(error)))\n })\n })\n\n return ok({ token })\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PUSH_REGISTER_FAILED,\n capacitorM('capacitor_pushRegisterFailed'),\n cause,\n )\n }\n}\n\n/**\n * 监听推送通知事件\n *\n * @param callbacks - 回调配置(收到推送、点击推送)\n * @returns 包含清理函数的 HaiResult\n *\n * @example\n * ```ts\n * const result = await capacitor.push.listen({\n * onReceived: (n) => handlePushReceived(n),\n * onActionPerformed: (n) => router.goto('/notifications'),\n * })\n * if (result.success) {\n * // 停止监听\n * await result.data()\n * }\n * ```\n */\nexport async function listenPush(callbacks: PushNotificationCallbacks): Promise<HaiResult<() => Promise<void>>> {\n try {\n const { PushNotifications } = await import('@capacitor/push-notifications')\n const listeners: Array<{ remove: () => Promise<void> }> = []\n\n if (callbacks.onReceived) {\n const listener = await PushNotifications.addListener(\n 'pushNotificationReceived',\n (notification) => {\n callbacks.onReceived?.({\n id: notification.id,\n title: notification.title,\n body: notification.body,\n data: notification.data as Record<string, unknown>,\n })\n },\n )\n listeners.push(listener)\n }\n\n if (callbacks.onActionPerformed) {\n const listener = await PushNotifications.addListener(\n 'pushNotificationActionPerformed',\n (action) => {\n callbacks.onActionPerformed?.({\n id: action.notification.id,\n title: action.notification.title,\n body: action.notification.body,\n data: action.notification.data as Record<string, unknown>,\n })\n },\n )\n listeners.push(listener)\n }\n\n const cleanup = async () => {\n const removeResults = await Promise.allSettled(listeners.map(listener => listener.remove()))\n const rejectedCount = removeResults.filter(result => result.status === 'rejected').length\n if (rejectedCount > 0) {\n logger.warn('Failed to remove push listeners', { rejectedCount })\n }\n }\n return ok(cleanup)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PUSH_LISTEN_FAILED,\n capacitorM('capacitor_pushListenFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 状态栏\n *\n * 封装 `@capacitor/status-bar` 插件,支持沉浸式状态栏配置。\n *\n * @module capacitor-status-bar\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { StatusBarConfig } from './capacitor-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\n/**\n * 配置状态栏\n *\n * 需要安装 `@capacitor/status-bar` 插件。\n *\n * @param config - 状态栏配置\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.statusBar.configure({\n * style: 'dark',\n * overlay: true,\n * backgroundColor: '#ffffff',\n * })\n * ```\n */\nexport async function configureStatusBar(config: StatusBarConfig): Promise<HaiResult<void>> {\n try {\n const { StatusBar, Style } = await import('@capacitor/status-bar')\n\n // 设置样式\n if (config.style) {\n const styleMap: Record<string, typeof Style[keyof typeof Style]> = {\n dark: Style.Dark,\n light: Style.Light,\n default: Style.Default,\n }\n await StatusBar.setStyle({ style: styleMap[config.style] ?? Style.Default })\n }\n\n // 设置背景色\n if (config.backgroundColor) {\n await StatusBar.setBackgroundColor({ color: config.backgroundColor })\n }\n\n // 设置覆盖模式\n if (config.overlay !== undefined) {\n await StatusBar.setOverlaysWebView({ overlay: config.overlay })\n }\n\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.STATUS_BAR_FAILED,\n capacitorM('capacitor_statusBarFailed'),\n cause,\n )\n }\n}\n\n/**\n * 显示状态栏\n *\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.statusBar.show()\n * ```\n */\nexport async function showStatusBar(): Promise<HaiResult<void>> {\n try {\n const { StatusBar } = await import('@capacitor/status-bar')\n await StatusBar.show()\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.STATUS_BAR_FAILED,\n capacitorM('capacitor_statusBarFailed'),\n cause,\n )\n }\n}\n\n/**\n * 隐藏状态栏\n *\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.statusBar.hide()\n * ```\n */\nexport async function hideStatusBar(): Promise<HaiResult<void>> {\n try {\n const { StatusBar } = await import('@capacitor/status-bar')\n await StatusBar.hide()\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.STATUS_BAR_FAILED,\n capacitorM('capacitor_statusBarFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — Token 存储\n *\n * 基于原生安全存储插件的 TokenStorage 实现。\n * 仅在 Capacitor 原生环境启用,拒绝回退到不安全的 Web 存储。\n *\n * @module capacitor-token-storage\n */\n\nimport type { TokenStorage } from '@h-ai/api-client'\nimport type { HaiResult } from '@h-ai/core'\nimport { Preferences } from '@capacitor/preferences'\nimport { core, err, ok } from '@h-ai/core'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\nconst logger = core.logger.child({ module: 'capacitor', scope: 'token-storage' })\n\ninterface SecureStoragePluginLike {\n getItem: (key: string) => Promise<string | null>\n setItem: (key: string, value: string) => Promise<void>\n removeItem: (key: string) => Promise<void>\n}\n\n/** Preferences 存储 Key */\nconst PREF_ACCESS_TOKEN = 'hai_access_token'\nconst PREF_REFRESH_TOKEN = 'hai_refresh_token'\n\nlet secureStoragePromise: Promise<SecureStoragePluginLike | null> | null = null\nlet secureStorageWarningLogged = false\n\nfunction logSecureStorageUnavailable(reason: string, error?: unknown): void {\n if (secureStorageWarningLogged)\n return\n\n secureStorageWarningLogged = true\n logger.warn('Capacitor secure token storage unavailable; token persistence is disabled', {\n reason,\n error,\n })\n}\n\nasync function loadSecureStoragePlugin(): Promise<SecureStoragePluginLike | null> {\n if (!secureStoragePromise) {\n secureStoragePromise = (async () => {\n try {\n const { Capacitor } = await import('@capacitor/core')\n if (!Capacitor.isNativePlatform()) {\n logSecureStorageUnavailable('non-native-platform')\n return null\n }\n\n const { SecureStorage } = await import('@aparajita/capacitor-secure-storage')\n return SecureStorage\n }\n catch (error) {\n logSecureStorageUnavailable('plugin-load-failed', error)\n return null\n }\n })()\n }\n\n return secureStoragePromise\n}\n\n/**\n * 创建基于原生安全存储的 TokenStorage\n *\n * 在原生 Android/iOS 环境下使用 `@aparajita/capacitor-secure-storage`\n * 保存 access token / refresh token;Web 环境不做不安全回退。\n *\n * @returns TokenStorage 实例\n *\n * @example\n * ```ts\n * import { createCapacitorTokenStorage } from '@h-ai/capacitor'\n * import { apiClient } from '@h-ai/api-client'\n *\n * await apiClient.init({\n * baseUrl: 'https://api.example.com/v1',\n * auth: {\n * storage: createCapacitorTokenStorage(),\n * refreshPath: '/auth/refresh',\n * },\n * })\n * ```\n */\nexport function createCapacitorTokenStorage(): TokenStorage {\n return {\n async getAccessToken(): Promise<string | null> {\n try {\n const storage = await loadSecureStoragePlugin()\n if (!storage)\n return null\n\n return await storage.getItem(PREF_ACCESS_TOKEN)\n }\n catch (error) {\n logger.error('Failed to get access token from secure storage', { error })\n return null\n }\n },\n\n async getRefreshToken(): Promise<string | null> {\n try {\n const storage = await loadSecureStoragePlugin()\n if (!storage)\n return null\n\n return await storage.getItem(PREF_REFRESH_TOKEN)\n }\n catch (error) {\n logger.error('Failed to get refresh token from secure storage', { error })\n return null\n }\n },\n\n async setAccessToken(token: string): Promise<void> {\n try {\n const storage = await loadSecureStoragePlugin()\n if (!storage)\n return\n\n await storage.setItem(PREF_ACCESS_TOKEN, token)\n }\n catch (error) {\n logger.error('Failed to set access token in secure storage', { error })\n }\n },\n\n async setRefreshToken(token: string): Promise<void> {\n try {\n const storage = await loadSecureStoragePlugin()\n if (!storage)\n return\n\n await storage.setItem(PREF_REFRESH_TOKEN, token)\n }\n catch (error) {\n logger.error('Failed to set refresh token in secure storage', { error })\n }\n },\n\n async clear(): Promise<void> {\n try {\n const storage = await loadSecureStoragePlugin()\n if (!storage)\n return\n\n await Promise.all([\n storage.removeItem(PREF_ACCESS_TOKEN),\n storage.removeItem(PREF_REFRESH_TOKEN),\n ])\n }\n catch (error) {\n logger.error('Failed to clear tokens from secure storage', { error })\n }\n },\n }\n}\n\n/**\n * 安全读取 Preference 值(返回 HaiResult)\n *\n * @param key - Preference Key\n * @returns HaiResult 包裹的值\n *\n * @example\n * ```ts\n * const result = await capacitor.preferences.get('my_key')\n * if (result.success) {\n * result.data // 值或 null\n * }\n * ```\n */\nexport async function safeGetPreference(key: string): Promise<HaiResult<string | null>> {\n try {\n const { value } = await Preferences.get({ key })\n return ok(value)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PREFERENCES_GET_FAILED,\n capacitorM('capacitor_preferencesGetFailed'),\n cause,\n )\n }\n}\n\n/**\n * 安全写入 Preference 值\n *\n * @param key - Preference Key\n * @param value - 要写入的值\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.preferences.set('my_key', 'value')\n * ```\n */\nexport async function safeSetPreference(key: string, value: string): Promise<HaiResult<void>> {\n try {\n await Preferences.set({ key, value })\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PREFERENCES_SET_FAILED,\n capacitorM('capacitor_preferencesSetFailed'),\n cause,\n )\n }\n}\n\n/**\n * 安全删除 Preference 值\n *\n * @param key - Preference Key\n * @returns HaiResult\n *\n * @example\n * ```ts\n * await capacitor.preferences.remove('my_key')\n * ```\n */\nexport async function safeRemovePreference(key: string): Promise<HaiResult<void>> {\n try {\n await Preferences.remove({ key })\n return ok(undefined)\n }\n catch (cause) {\n return err(\n HaiCapacitorError.PREFERENCES_REMOVE_FAILED,\n capacitorM('capacitor_preferencesRemoveFailed'),\n cause,\n )\n }\n}\n","/**\n * @h-ai/capacitor — 模块入口(生命周期管理)\n *\n * 提供 Capacitor 原生桥接的初始化与环境检测。\n * `capacitor.init()` 应在应用启动时调用,用于检测 Capacitor 环境可用性。\n *\n * @module capacitor-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { CameraOperations, CapacitorFunctions, DeviceOperations, PreferencesOperations, PushOperations, StatusBarOperations } from './capacitor-types.js'\nimport { core, err, ok } from '@h-ai/core'\nimport { takePhoto } from './capacitor-camera.js'\nimport { getAppVersion, getDeviceInfo } from './capacitor-device.js'\nimport { capacitorM } from './capacitor-i18n.js'\nimport { listenPush, registerPush } from './capacitor-push.js'\nimport { configureStatusBar, hideStatusBar, showStatusBar } from './capacitor-status-bar.js'\nimport { safeGetPreference, safeRemovePreference, safeSetPreference } from './capacitor-token-storage.js'\nimport { HaiCapacitorError } from './capacitor-types.js'\n\nconst logger = core.logger.child({ module: 'capacitor', scope: 'main' })\n\n/** 是否已初始化 */\nlet initialized = false\n\n/** 是否正在初始化中(并发防护) */\nlet initInProgress = false\n\n/** 缓存平台信息 */\nlet cachedPlatform: string | null = null\n\n// ─── 未初始化代理 ───\n\nconst notInitialized = core.module.createNotInitializedKit(\n HaiCapacitorError.NOT_INITIALIZED,\n () => capacitorM('capacitor_notInitialized'),\n)\n\nconst notInitializedDevice = notInitialized.proxy<DeviceOperations>()\nconst notInitializedCamera = notInitialized.proxy<CameraOperations>()\nconst notInitializedPush = notInitialized.proxy<PushOperations>()\nconst notInitializedStatusBar = notInitialized.proxy<StatusBarOperations>()\nconst notInitializedPreferences = notInitialized.proxy<PreferencesOperations>()\n\n// ─── 已初始化时的操作实现 ───\n\nconst deviceOps: DeviceOperations = {\n getInfo: getDeviceInfo,\n getAppVersion,\n}\n\nconst cameraOps: CameraOperations = {\n takePhoto,\n}\n\nconst pushOps: PushOperations = {\n register: registerPush,\n listen: listenPush,\n}\n\nconst statusBarOps: StatusBarOperations = {\n configure: configureStatusBar,\n show: showStatusBar,\n hide: hideStatusBar,\n}\n\nconst preferencesOps: PreferencesOperations = {\n get: safeGetPreference,\n set: safeSetPreference,\n remove: safeRemovePreference,\n}\n\n// ─── 检测 Capacitor 是否可用(模块内部使用) ───\n\nfunction isCapacitorAvailable(): boolean {\n try {\n // window 上由 Capacitor 运行时注入 Capacitor 全局对象,lib.dom 未声明该属性,故强转为可查库的 Record\n return typeof window !== 'undefined'\n && (window as unknown as Record<string, unknown>).Capacitor !== undefined\n }\n catch {\n return false\n }\n}\n\n// ─── 服务对象 ───\n\n/**\n * Capacitor 模块服务对象\n *\n * @example\n * ```ts\n * import { capacitor } from '@h-ai/capacitor'\n *\n * const result = await capacitor.init()\n * if (result.success) {\n * const info = await capacitor.device.getInfo()\n * await capacitor.statusBar.configure({ style: 'dark', overlay: true })\n * }\n * ```\n */\nexport const capacitor: CapacitorFunctions = {\n async init(): Promise<HaiResult<void>> {\n // 并发初始化防护:避免多次 init 同时执行导致资源泄漏\n if (initInProgress) {\n logger.warn('Capacitor init already in progress, skipping concurrent call')\n return err(\n HaiCapacitorError.INIT_IN_PROGRESS,\n capacitorM('capacitor_initInProgress'),\n )\n }\n initInProgress = true\n\n try {\n if (initialized) {\n logger.warn('Capacitor module is already initialized, reinitializing')\n await capacitor.close()\n }\n\n logger.info('Initializing capacitor module')\n\n if (!isCapacitorAvailable()) {\n logger.error('Capacitor is not available in current environment')\n return err(\n HaiCapacitorError.NOT_AVAILABLE,\n capacitorM('capacitor_notAvailable'),\n )\n }\n\n const { Capacitor } = await import('@capacitor/core')\n const platform = Capacitor.getPlatform()\n\n if (!platform) {\n logger.error('Capacitor initialization failed, platform not detected')\n return err(\n HaiCapacitorError.INIT_FAILED,\n capacitorM('capacitor_initFailed'),\n )\n }\n\n cachedPlatform = platform\n initialized = true\n logger.info('Capacitor module initialized', { platform })\n return ok(undefined)\n }\n catch (cause) {\n logger.error('Capacitor module initialization failed', { error: cause })\n return err(\n HaiCapacitorError.INIT_FAILED,\n capacitorM('capacitor_initFailed'),\n cause,\n )\n }\n finally {\n initInProgress = false\n }\n },\n\n async close() {\n if (!initialized) {\n logger.info('Capacitor module is already closed, skipping')\n return\n }\n logger.info('Closing capacitor module')\n initialized = false\n cachedPlatform = null\n logger.info('Capacitor module closed')\n },\n\n getPlatform(): string {\n if (cachedPlatform) {\n return cachedPlatform\n }\n try {\n // 同 isCapacitorAvailable:Capacitor 全局仅在运行时由 native bridge 注入,需强转后读取\n const cap = (window as unknown as Record<string, unknown>).Capacitor as { getPlatform?: () => string } | undefined\n return cap?.getPlatform?.() ?? 'web'\n }\n catch {\n return 'web'\n }\n },\n\n isNative(): boolean {\n try {\n const cap = (window as unknown as Record<string, unknown>).Capacitor as { isNativePlatform?: () => boolean } | undefined\n return cap?.isNativePlatform?.() ?? false\n }\n catch {\n return false\n }\n },\n\n get isInitialized(): boolean {\n return initialized\n },\n\n get device(): DeviceOperations {\n return initialized ? deviceOps : notInitializedDevice\n },\n\n get camera(): CameraOperations {\n return initialized ? cameraOps : notInitializedCamera\n },\n\n get push(): PushOperations {\n return initialized ? pushOps : notInitializedPush\n },\n\n get statusBar(): StatusBarOperations {\n return initialized ? statusBarOps : notInitializedStatusBar\n },\n\n get preferences(): PreferencesOperations {\n return initialized ? preferencesOps : notInitializedPreferences\n },\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/capacitor",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.20",
|
|
5
5
|
"description": "Hai Framework Capacitor bridge module for native mobile capabilities.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"exports": {
|
|
@@ -19,10 +19,14 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@capacitor
|
|
22
|
+
"@aparajita/capacitor-secure-storage": "^8.0.0",
|
|
23
|
+
"@capacitor/core": "^8.3.4",
|
|
23
24
|
"@capacitor/preferences": "^8.0.1"
|
|
24
25
|
},
|
|
25
26
|
"peerDependenciesMeta": {
|
|
27
|
+
"@aparajita/capacitor-secure-storage": {
|
|
28
|
+
"optional": true
|
|
29
|
+
},
|
|
26
30
|
"@capacitor/app": {
|
|
27
31
|
"optional": true
|
|
28
32
|
},
|
|
@@ -40,10 +44,11 @@
|
|
|
40
44
|
}
|
|
41
45
|
},
|
|
42
46
|
"dependencies": {
|
|
43
|
-
"@h-ai/api-client": "0.1.0-alpha.
|
|
44
|
-
"@h-ai/core": "0.1.0-alpha.
|
|
47
|
+
"@h-ai/api-client": "0.1.0-alpha.20",
|
|
48
|
+
"@h-ai/core": "0.1.0-alpha.20"
|
|
45
49
|
},
|
|
46
50
|
"devDependencies": {
|
|
51
|
+
"@aparajita/capacitor-secure-storage": "^8.0.0",
|
|
47
52
|
"@capacitor/app": "^8.0.1",
|
|
48
53
|
"@capacitor/camera": "^8.0.2",
|
|
49
54
|
"@capacitor/device": "^8.0.1",
|