@h-ai/capacitor 0.1.0-alpha.18 → 0.1.0-alpha.19

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 CHANGED
@@ -1,17 +1,16 @@
1
1
  # @h-ai/capacitor
2
2
 
3
- Capacitor 原生桥接模块,为 hai Framework 移动应用提供安全 Token 存储、设备信息、推送通知、相机与状态栏等原生能力的统一封装。
3
+ Capacitor 原生桥接模块,为 hai Framework 移动应用提供原生安全 Token 存储、设备信息、推送通知、相机与状态栏等能力的统一封装。
4
4
 
5
5
  ## 支持的能力
6
6
 
7
- | 能力 | 依赖插件 | 说明 |
8
- | ---------- | --------------------------------------- | ------------------------------------------------------------- |
9
- | Token 存储 | `@capacitor/preferences`(必需) | 基于 SharedPreferences / UserDefaults,比 localStorage 更安全 |
10
- | 设备信息 | `@capacitor/device`(可选) | 平台、版本、型号检测 |
11
- | 应用版本 | `@capacitor/app`(可选) | 读取 appVersion / appBuild |
12
- | 推送通知 | `@capacitor/push-notifications`(可选) | 注册 FCM/APNs Token、监听推送事件 |
13
- | 相机/相册 | `@capacitor/camera`(可选) | 拍照、选取相册图片 |
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
- * 基于 Capacitor Preferences 的 TokenStorage 实现,
187
- * 比浏览器 localStorage 更安全,适用于原生 App 场景。
187
+ * 基于原生安全存储插件的 TokenStorage 实现。
188
+ * 仅在 Capacitor 原生环境启用,拒绝回退到不安全的 Web 存储。
188
189
  *
189
190
  * @module capacitor-token-storage
190
191
  */
191
192
 
192
193
  /**
193
- * 创建基于 Capacitor Preferences 的 TokenStorage
194
+ * 创建基于原生安全存储的 TokenStorage
194
195
  *
195
- * 使用 `@capacitor/preferences` 插件进行持久化存储,
196
- * 在 Android 使用 SharedPreferences,iOS 使用 UserDefaults,
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.DEVICE_INFO_FAILED,
132
- capacitorM("capacitor_deviceInfoFailed"),
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 regListener;
150
- let errListener;
151
- const timer = setTimeout(() => {
152
- cleanup();
153
- reject(new Error("Push registration timed out"));
154
- }, REGISTER_TIMEOUT_MS);
155
- function cleanup() {
156
- clearTimeout(timer);
157
- regListener?.remove();
158
- errListener?.remove();
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
- PushNotifications.addListener("registration", (t) => {
161
- cleanup();
162
- resolve(t.value);
163
- }).then((l) => {
164
- regListener = l;
165
- });
166
- PushNotifications.addListener("registrationError", (error) => {
167
- cleanup();
168
- reject(error);
169
- }).then((l) => {
170
- errListener = l;
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.all(listeners.map((l) => l.remove()));
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 logger = core.logger.child({ module: "capacitor", scope: "token-storage" });
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 { value } = await Preferences.get({ key: PREF_ACCESS_TOKEN });
287
- return value;
339
+ const storage = await loadSecureStoragePlugin();
340
+ if (!storage)
341
+ return null;
342
+ return await storage.getItem(PREF_ACCESS_TOKEN);
288
343
  } catch (error) {
289
- logger.error("Failed to get access token from Preferences", { error });
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 { value } = await Preferences.get({ key: PREF_REFRESH_TOKEN });
296
- return value;
350
+ const storage = await loadSecureStoragePlugin();
351
+ if (!storage)
352
+ return null;
353
+ return await storage.getItem(PREF_REFRESH_TOKEN);
297
354
  } catch (error) {
298
- logger.error("Failed to get refresh token from Preferences", { error });
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
- await Preferences.set({ key: PREF_ACCESS_TOKEN, value: token });
361
+ const storage = await loadSecureStoragePlugin();
362
+ if (!storage)
363
+ return;
364
+ await storage.setItem(PREF_ACCESS_TOKEN, token);
305
365
  } catch (error) {
306
- logger.error("Failed to set access token in Preferences", { error });
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
- await Preferences.set({ key: PREF_REFRESH_TOKEN, value: token });
371
+ const storage = await loadSecureStoragePlugin();
372
+ if (!storage)
373
+ return;
374
+ await storage.setItem(PREF_REFRESH_TOKEN, token);
312
375
  } catch (error) {
313
- logger.error("Failed to set refresh token in Preferences", { error });
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
- Preferences.remove({ key: PREF_ACCESS_TOKEN }),
320
- Preferences.remove({ key: PREF_REFRESH_TOKEN })
385
+ storage.removeItem(PREF_ACCESS_TOKEN),
386
+ storage.removeItem(PREF_REFRESH_TOKEN)
321
387
  ]);
322
388
  } catch (error) {
323
- logger.error("Failed to clear tokens from Preferences", { error });
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 logger2 = core.logger.child({ module: "capacitor", scope: "main" });
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
- logger2.warn("Capacitor init already in progress, skipping concurrent call");
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
- logger2.warn("Capacitor module is already initialized, reinitializing");
485
+ logger3.warn("Capacitor module is already initialized, reinitializing");
420
486
  await capacitor.close();
421
487
  }
422
- logger2.info("Initializing capacitor module");
488
+ logger3.info("Initializing capacitor module");
423
489
  if (!isCapacitorAvailable()) {
424
- logger2.error("Capacitor is not available in current environment");
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
- logger2.error("Capacitor initialization failed, platform not detected");
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
- logger2.info("Capacitor module initialized", { platform });
507
+ logger3.info("Capacitor module initialized", { platform });
442
508
  return ok(void 0);
443
509
  } catch (cause) {
444
- logger2.error("Capacitor module initialization failed", { error: cause });
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
- logger2.info("Capacitor module is already closed, skipping");
522
+ logger3.info("Capacitor module is already closed, skipping");
457
523
  return;
458
524
  }
459
- logger2.info("Closing capacitor module");
525
+ logger3.info("Closing capacitor module");
460
526
  initialized = false;
461
527
  cachedPlatform = null;
462
- logger2.info("Capacitor module closed");
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.18",
4
+ "version": "0.1.0-alpha.19",
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/core": "^8.2.0",
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.18",
44
- "@h-ai/core": "0.1.0-alpha.18"
47
+ "@h-ai/api-client": "0.1.0-alpha.19",
48
+ "@h-ai/core": "0.1.0-alpha.19"
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",