@ckylinmc/mp-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # @ckylinmc/mp-sdk
2
+
3
+ 此包为 VibeCoding 娱乐项目之一,仅用来实验原生应用接入 Lynx 相关功能,相关代码皆为 AI 编写,请勿在生产环境使用。
4
+
5
+ CKyLyn 小程序桥 SDK:小程序侧与宿主能力交互的**唯一推荐入口**。单文件、零依赖,
6
+ TypeScript 编写,随包附带完整类型声明(JS 项目同样获得类型提示)。
7
+
8
+ **双通道**:
9
+
10
+ | 通道 | 承载 | 说明 |
11
+ |---|---|---|
12
+ | 事件桥 `CkylMpBridge` | 权限/授权弹窗、SAF 选择/保存对话框、下载、定位、扫码、deeplink/返回、`http.stream`、controlFolder 文本操作、WebRTC 信令 | 交互/低频/推送型,永久保留 |
13
+ | 原生模块 `CkylMpFile` / `CkylMpWebRtc` / `CkylMpShare` | 文件字节、WebRTC 实时收发、非文本分享 | 二进制/高频,`byte[] ↔ ArrayBuffer` 直达 |
14
+
15
+ SDK 按 `hasNativeCapability()` 探测宿主:有新模块走字节直达;旧宿主自动回退事件桥
16
+ (写入/文本分享),读取/文件分享**明确失败**(`NOT_IMPLEMENTED`),绝不静默降级到
17
+ 不等价能力。完整降级矩阵见仓库 `docs/ERRORS.md`。
18
+
19
+ ## 安装
20
+
21
+ ```bash
22
+ # bun(推荐)
23
+ bun add @ckylinmc/mp-sdk
24
+
25
+ # npm
26
+ npm i @ckylinmc/mp-sdk
27
+ ```
28
+
29
+ 包内容仅含 `dist/`(`ckylmp.js` + `ckylmp.d.ts`)与 `skills/`(AI 技能,见下文);
30
+ **完整文档(`docs/`)不进入 npm 包**,请从仓库或下方链接获取。
31
+
32
+ ## 快速开始
33
+
34
+ ```ts
35
+ import { requestPerms, getToken, store, share, onDownloadProgress } from "@ckylinmc/mp-sdk";
36
+
37
+ // 1. 申请权限(必须已在宿主后台 mpindex.perms 声明,否则 PERM_NOT_DECLARED)
38
+ const allowed = await requestPerms([
39
+ "store",
40
+ { perm: "token", description: "用于同步你的任务数据" },
41
+ ]);
42
+
43
+ // 2. 先订阅推送再触发调用
44
+ const off = onDownloadProgress(({ bytesWritten, totalBytes }) => console.log(bytesWritten, "/", totalBytes));
45
+ await store.set("draft", JSON.stringify(draft));
46
+ const token = await getToken();
47
+ await share({ text: "分享内容", title: "分享给好友" });
48
+ off();
49
+ ```
50
+
51
+ > 首次 `invoke`/`on` 时 SDK 惰性注册 `GlobalEventEmitter` 监听(**仅后台线程生效**),
52
+ > 请把首个桥调用放在首帧后台路径(`useEffect`、事件处理器)里。
53
+
54
+ ## ReactLynx 小程序接入(双线程纪律)
55
+
56
+ ReactLynx 编译期将模块图整体纳入主线程可执行产物,桥 SDK 属 **background-only** 模块。
57
+ 请建立一个本地包装层(模板工程即此模式):
58
+
59
+ ```ts
60
+ // src/lib/ckylmp.ts(项目内)
61
+ import "background-only";
62
+ export * from "@ckylinmc/mp-sdk";
63
+ ```
64
+
65
+ - 包装层必须带 `import 'background-only'` 标记(编译期护栏);
66
+ - 业务代码统一从 `./lib/ckylmp` 导入(**不要**直接从 `@ckylinmc/mp-sdk` 导入);
67
+ - 桥调用只出现在事件处理器 / `useEffect` / 显式后台函数(`'background only'` 指令);
68
+ - 渲染作用域(JSX 表达式、`useState` 初始化器)禁止引用桥标识符,需要类型时
69
+ 直接 `import type { ... } from "@ckylinmc/mp-sdk"`(纯类型引用不进入模块图)。
70
+
71
+ ## 权限与能力速览
72
+
73
+ 15 项可申请权限(`backevent` 为隐式权限:声明即生效、不可申请):`store` `token`
74
+ `profile` `sendintent` `webrtc` `share` `download` `scanqr` `location` `writefile`
75
+ `selectfolder` `selectfile` `readfile` `selectmedia` `controlfolder`。
76
+
77
+ 核心 API(全部需先 `requestPerms` 对应权限,未声明 → `PERM_NOT_DECLARED`):
78
+
79
+ | 类别 | API |
80
+ |---|---|
81
+ | 启动/返回 | `getLaunchOptions` / `onDeeplinkCalled` / `onBackPress` / `exitApp` |
82
+ | 权限身份 | `requestPerms` / `getToken` / `getProfile` |
83
+ | 存储 | `store.get/set/remove/keys/clear` |
84
+ | 系统能力 | `share` / `download` / `scanQR` / `getLocation` / `sendIntent` |
85
+ | 文件 | `writeFile` / `selectFolder` / `selectFiles` / `readFile` / `readFileBytes` / `selectMedia` |
86
+ | 目录控制 | `requestFolderScope` / `folderScopes` / `controlFolder.*` |
87
+ | WebRTC | `createPeerConnection` / `setSpeaker` |
88
+ | HTTP 流 | `streamHttp` |
89
+ | 通用 | `on` / `off` / `hasNativeCapability` / `isBridgeAvailable` |
90
+
91
+ ## 错误处理
92
+
93
+ 所有失败以 `CkylMpError` 抛出(`code` + `message` + `extra`):
94
+
95
+ ```ts
96
+ import { CkylMpError } from "@ckylinmc/mp-sdk";
97
+
98
+ try {
99
+ await requestPerms(["location"]);
100
+ } catch (e) {
101
+ if (e instanceof CkylMpError) {
102
+ switch (e.code) {
103
+ case "PERM_NOT_DECLARED": /* 未在 perms 声明;e.extra.undeclared 为问题项 */
104
+ case "PERM_DENIED": /* 未授权/已拒绝/运行时权限被拒 */
105
+ case "AUTH_REQUIRED": /* 宿主未登录 */
106
+ case "USER_CANCELLED": /* 用户取消 */
107
+ case "FILE_TOO_LARGE": /* 读取超限(事件桥 1MB / 二进制 16MB) */
108
+ case "SCOPE_NOT_GRANTED": /* 路径未命中已授权 scope */
109
+ case "SCOPE_REJECTED": /* 所选目录与声明 scope 不符 */
110
+ case "NOT_IMPLEMENTED": /* 当前宿主不支持 */
111
+ case "TIMEOUT": /* SDK 侧兜底超时(默认 10s) */
112
+ case "INTERNAL": /* 宿主内部错误/定位超时等 */
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ ## 文档与 AI 技能
119
+
120
+ - **完整文档**(不随包分发):仓库 `docs/` 下——
121
+ `PERMISSIONS.md`(权限系统)/ `API.md`(全部 API 参数·行为·示例)/
122
+ `ERRORS.md`(错误码·超时·降级)/ `EVENTS.md`(推送事件)/ `WORKFLOW.md`(开发与打包全流程)。
123
+ - **AI 技能**(随包分发):`skills/ckylmp-sdk/` 为可由 AI 助手导入的使用技能,
124
+ 导入方式:`cp -r node_modules/@ckylinmc/mp-sdk/skills/* <你的AI技能目录>`(DSH 为
125
+ `~/.dsh/skills/`),仓库内 `skills/README.md` 有详细说明。
package/UNLICENSE ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <https://unlicense.org>
@@ -0,0 +1,473 @@
1
+ /**
2
+ * CKyLyn 小程序桥 TS SDK(单文件,零依赖)。
3
+ *
4
+ * 双通道(宿主侧实现见 `app/mp-lynx/src/main/java/in/ckyl/superapp/mplynx/bridge/`,
5
+ * 规范见 `app/docs/NATIVE_MODULES.md`):
6
+ *
7
+ * 1. **事件桥**(兼容/交互,永久保留):
8
+ * - JS→宿主:`NativeModules.CkylMpBridge.invoke(msgid, event, payloadJson)`
9
+ * - 宿主→JS 回执:`ckylinmp::reply` → `[msgid, event, ok, dataJson, errorJson]`
10
+ * - 宿主→JS 推送:`ckylinmp::event` → `[event, dataJson]`(下载进度等)
11
+ * 回执按 msgid 关联(对齐旧版 apibridge.js 语义),默认 10s 超时。
12
+ * 2. **原生模块**(二进制/高频;byte[] ↔ ArrayBuffer 直达,无 base64):
13
+ * - `NativeModules.CkylMpFile.{readBytes,saveBytes,scopeReadBytes,scopeWriteBytes}`
14
+ * - `NativeModules.CkylMpWebRtc.{sendText,sendBytes,setMicrophone,setSpeaker}`
15
+ * - `NativeModules.CkylMpShare.shareFile(spec)`
16
+ * 回执统一 `(errorCode|null, errorMessage|null, meta|null, bytes|null)`;
17
+ * 缺模块(旧宿主)时按 API 降级(写入/文本分享回退事件桥;读取/文件分享明确失败)。
18
+ *
19
+ * ⚠️ 约定:GlobalEventEmitter 监听必须注册于**后台线程**(Lynx 4.0.0 行为),
20
+ * 本 SDK 在首次调用时惰性注册,请勿在渲染关键路径上延迟首次调用时机。
21
+ */
22
+ /** 原生模块可用性探测(缺模块 = 旧宿主,SDK 按 API 降级/明确失败) */
23
+ export type NativeModuleName = "CkylMpFile" | "CkylMpWebRtc" | "CkylMpShare";
24
+ /** 权限 key(与宿主 `MpPerm` 一致;未声明者申请会被拒绝) */
25
+ export type PermKey = "store" | "token" | "profile" | "sendintent" | "webrtc" | "share" | "download" | "scanqr" | "location" | "writefile" | "selectfolder" | "selectfile" | "readfile" | "selectmedia" | "controlfolder";
26
+ /** requestPerms 单项:字符串或带描述对象(描述展示为弹窗灰色小字) */
27
+ export type PermAsk = PermKey | {
28
+ perm: PermKey;
29
+ description?: string;
30
+ };
31
+ export interface BridgeErrorPayload {
32
+ code: string;
33
+ message: string;
34
+ undeclared?: string[];
35
+ [key: string]: unknown;
36
+ }
37
+ /** 桥错误:宿主结构化错误码(见 docs/MP_PERMS.md 错误码表) */
38
+ export declare class CkylMpError extends Error {
39
+ readonly code: string;
40
+ readonly extra: Record<string, unknown>;
41
+ constructor(code: string, message: string, extra?: Record<string, unknown>);
42
+ }
43
+ export interface DownloadResult {
44
+ downloadId: number;
45
+ filename: string;
46
+ }
47
+ export interface DownloadProgress {
48
+ downloadId: number;
49
+ bytesWritten: number;
50
+ totalBytes: number;
51
+ }
52
+ export interface LocationResult {
53
+ latitude: number;
54
+ longitude: number;
55
+ accuracy: number;
56
+ provider: string;
57
+ time: number;
58
+ }
59
+ export interface ShareOptions {
60
+ text?: string;
61
+ title?: string;
62
+ /**
63
+ * 非文本附件(原生模块通道):`uri`(SAF/媒体选择结果)或
64
+ * `data`(Blob/ArrayBuffer/视图,字节直达)至少其一;两者都提供时优先 `data`。
65
+ * 旧宿主不支持文件分享(抛 NOT_IMPLEMENTED,不回退)。
66
+ */
67
+ file?: ShareFileSpec;
68
+ }
69
+ /** 分享附件:uri(直用)或 data(字节态,≤32MB,宿主落临时文件) */
70
+ export interface ShareFileSpec {
71
+ uri?: string;
72
+ data?: Blob | ArrayBuffer | Uint8Array;
73
+ filename?: string;
74
+ mime?: string;
75
+ }
76
+ /** sendIntent 载荷:仅支持白名单字段(宿主结构性消毒,禁 URI 授权 flag) */
77
+ export interface IntentSpec {
78
+ action: string;
79
+ data?: string;
80
+ categories?: string[];
81
+ package?: string;
82
+ extras?: Record<string, string>;
83
+ }
84
+ /** 文件/媒体选择结果中的单项 */
85
+ export interface PickedFile {
86
+ uri: string;
87
+ name: string;
88
+ size?: number;
89
+ mime?: string;
90
+ }
91
+ /** selectMedia 后置过滤未命中的项 */
92
+ export interface SkippedFile {
93
+ uri: string;
94
+ name: string;
95
+ reason: string;
96
+ }
97
+ /** readfile 结果:type 决定 data 的编码(text = 原始 UTF-8 文本 / binary = base64) */
98
+ export interface ReadFileResult {
99
+ uri: string;
100
+ name: string;
101
+ size: number;
102
+ mime?: string;
103
+ type: "text" | "binary";
104
+ encoding: "utf8" | "base64";
105
+ data: string;
106
+ }
107
+ /** select folder 结果 */
108
+ export interface PickedFolder {
109
+ uri: string;
110
+ name: string;
111
+ displayPath?: string;
112
+ }
113
+ /** controlfolder 已授权范围 */
114
+ export interface FolderScope {
115
+ scope: string;
116
+ uri: string;
117
+ name: string;
118
+ displayPath?: string;
119
+ }
120
+ /** controlfolder 目录条目 */
121
+ export interface FolderEntry {
122
+ path: string;
123
+ name: string;
124
+ type: "file" | "dir";
125
+ size?: number;
126
+ mime?: string;
127
+ uri: string;
128
+ }
129
+ /** 探测某原生模块是否可用(缺模块 = 旧宿主) */
130
+ export declare function hasNativeCapability(module: NativeModuleName): boolean;
131
+ /** 订阅宿主推送事件(如 download_progress、webrtc_binary);返回取消函数 */
132
+ export declare function on(event: string, handler: (data: unknown, bytes?: ArrayBuffer) => void): () => void;
133
+ /** 取消订阅 */
134
+ export declare function off(event: string, handler: (data: unknown, bytes?: ArrayBuffer) => void): void;
135
+ /** 小程序启动参数(launchOptions) */
136
+ export interface LaunchOptions {
137
+ /** 有序 key/value 对(`ckylin://mp/{uniId}?a=1&b=2` → `[["a","1"],["b","2"]]`) */
138
+ query: Array<[string, string]>;
139
+ }
140
+ /**
141
+ * 冷启动 deeplink 参数(宿主 globalProps 注入,同步可读;无参数 = 空数组)。
142
+ * 必须在启动早期调用(globalProps 渲染前即曝光,任意时点读取均含启动值)。
143
+ */
144
+ export declare function getLaunchOptions(): LaunchOptions;
145
+ /**
146
+ * 订阅「小程序已启动时」的带参 deeplink 推送(`deeplink_called`);
147
+ * 无参数的 deeplink 不推送。返回取消函数。
148
+ */
149
+ export declare function onDeeplinkCalled(handler: (options: LaunchOptions) => void): () => void;
150
+ /**
151
+ * 返回监听:注册后宿主**单次返回**推送 `back_press` 给本小程序(宿主不再双击退出),
152
+ * 小程序可借 `exitApp()` 在「返回到达最顶层」时退出。返回取消函数;全部取消后自动注销。
153
+ */
154
+ export declare function onBackPress(handler: () => void): () => void;
155
+ /** 退出本小程序(宿主关闭小程序任务;返回监听模式下「返回到底」的关闭出口) */
156
+ export declare function exitApp(): Promise<void>;
157
+ /**
158
+ * 批量申请权限(必须已在小程序 `perms` 字段声明)。
159
+ *
160
+ * - 全部已裁决:立即返回已允许列表,不弹窗;
161
+ * - 含待定项:宿主弹出一次性授权弹窗(仅一次/保持允许/永久拒绝);
162
+ * - 返回本次调用后生效允许的权限 key 列表(含历史已允许项)。
163
+ */
164
+ export declare function requestPerms(perms: PermAsk[]): Promise<PermKey[]>;
165
+ /**
166
+ * 获取作用域 token(需已授权 token 权限;未授权返回 PERM_DENIED,
167
+ * 请先 `requestPerms(["token"])`)。
168
+ */
169
+ export declare function getToken(): Promise<string>;
170
+ /** 宿主当前用户身份(getProfile 回执) */
171
+ export interface HostProfile {
172
+ userId: string;
173
+ nickname: string;
174
+ /** 头像缩略图 URL(150x150);无头像时缺省 */
175
+ avatar?: string;
176
+ }
177
+ /**
178
+ * 获取宿主当前用户的昵称/头像/UserId(需已授权 `profile` 权限;
179
+ * 未授权抛 `PERM_DENIED`,请先 `requestPerms(["profile"])`——首次弹授权窗,
180
+ * 文案「获取您的头像、昵称」;宿主未登录抛 `AUTH_REQUIRED`)。
181
+ */
182
+ export declare function getProfile(): Promise<HostProfile>;
183
+ export declare const store: {
184
+ get(key: string): Promise<string | null>;
185
+ set(key: string, value: string): Promise<void>;
186
+ remove(key: string): Promise<void>;
187
+ keys(): Promise<string[]>;
188
+ clear(): Promise<void>;
189
+ };
190
+ /**
191
+ * 系统分享面板:文本(事件桥)或 文本+图片/文件附件(原生模块通道)。
192
+ * `file` 提供时经 `CkylMpShare.shareFile`(bytes 落宿主临时文件,FileProvider
193
+ * 授权);仅文本时走事件桥 `share`(旧宿主兼容)。`text`/`file` 至少其一。
194
+ */
195
+ export declare function share(options: ShareOptions): Promise<void>;
196
+ /**
197
+ * 系统 DownloadManager 下载,返回下载 id 与文件名;
198
+ * 进度/完成/失败经推送事件分发(见 [onDownloadProgress]/[onDownloadSettled])。
199
+ * `openAfterComplete` = 完成后由宿主直接打开文件。
200
+ */
201
+ export declare function download(options: {
202
+ url: string;
203
+ filename?: string;
204
+ title?: string;
205
+ description?: string;
206
+ openAfterComplete?: boolean;
207
+ }): Promise<DownloadResult>;
208
+ /** 订阅下载进度推送;返回取消函数 */
209
+ export declare function onDownloadProgress(handler: (progress: DownloadProgress) => void): () => void;
210
+ /** 订阅下载完成/失败推送 */
211
+ export declare function onDownloadSettled(handler: (event: "download_complete" | "download_failed", data: unknown) => void): () => void;
212
+ /** 拉起宿主扫码页,返回二维码原文(用户取消抛 USER_CANCELLED) */
213
+ export declare function scanQR(): Promise<string>;
214
+ /** 获取当前位置(宿主运行时权限弹窗;超时抛 INTERNAL) */
215
+ export declare function getLocation(options?: {
216
+ timeoutMs?: number;
217
+ }): Promise<LocationResult>;
218
+ /** 经宿主转发 Intent(结构性消毒:仅 action/data/categories/package/string extras) */
219
+ export declare function sendIntent(spec: IntentSpec): Promise<void>;
220
+ /** 保存对话框:文件名可改、选择保存位置、保存或取消(需 writefile 权限) */
221
+ export declare function writeFile(options: {
222
+ /** 建议文件名(用户可在对话框中修改) */
223
+ filename?: string;
224
+ data: string | Blob | ArrayBuffer | Uint8Array;
225
+ /** 文本(默认)或 base64;Blob/二进制输入将自动转 base64 */
226
+ encoding?: "utf8" | "base64";
227
+ mime?: string;
228
+ }): Promise<{
229
+ uri: string;
230
+ name: string;
231
+ size: number;
232
+ }>;
233
+ /**
234
+ * 二进制读取(需 readfile 权限;**原生模块通道**,byte[] 直达):
235
+ * 返回字节而非 base64/文本,默认上限 8MB(maxBytes 上限 16MB,超限 FILE_TOO_LARGE)。
236
+ * 旧宿主不支持时抛 NOT_IMPLEMENTED(明确失败,不回退——1MB base64 不是等价能力)。
237
+ */
238
+ export declare function readFileBytes(options: {
239
+ uri: string;
240
+ maxBytes?: number;
241
+ }): Promise<{
242
+ uri: string;
243
+ name: string;
244
+ size: number;
245
+ mime?: string;
246
+ bytes: Uint8Array;
247
+ }>;
248
+ /** 目录选择:返回 tree URI + 展示名 + primary 真实路径(需 selectfolder 权限) */
249
+ export declare function selectFolder(options?: {
250
+ persist?: boolean;
251
+ }): Promise<PickedFolder>;
252
+ /**
253
+ * 文件选择:单/多选 + 类型过滤(MIME/扩展名)+ 默认打开目录(需 selectfile 权限)。
254
+ * `initialUri` 传 selectFolder 返回的 uri;`types` 为空 = 不限类型。
255
+ */
256
+ export declare function selectFiles(options?: {
257
+ multiple?: boolean;
258
+ types?: Array<{
259
+ mime?: string;
260
+ extensions?: string[];
261
+ }>;
262
+ initialUri?: string;
263
+ }): Promise<{
264
+ files: PickedFile[];
265
+ }>;
266
+ /**
267
+ * 读取指定 URI 文件内容(需 readfile 权限;文件 ≤1MB,超限抛 FILE_TOO_LARGE)。
268
+ * encoding: auto(默认,按内容判定文本/二进制)| utf8 | base64。
269
+ */
270
+ export declare function readFile(options: {
271
+ uri: string;
272
+ encoding?: "auto" | "utf8" | "base64";
273
+ maxBytes?: number;
274
+ }): Promise<ReadFileResult>;
275
+ /**
276
+ * 系统相册选择(需 selectmedia 权限):
277
+ * - 系统 Photo Picker(API 33+ 原生 / 30-32 backport / 更老设备降级 OpenDocument);
278
+ * - `mediaType` 图片/视频/全部;`multiple` 多选(maxCount 上限 20);
279
+ * - Photo Picker 不支持自定义类型过滤:`filters`/`maxSizeBytes` 为宿主**后置过滤**,
280
+ * 未命中项出现在 `skipped`。
281
+ */
282
+ export declare function selectMedia(options?: {
283
+ multiple?: boolean;
284
+ mediaType?: "image" | "video" | "all";
285
+ maxCount?: number;
286
+ filters?: Array<{
287
+ mime?: string;
288
+ extensions?: string[];
289
+ }>;
290
+ maxSizeBytes?: number;
291
+ }): Promise<{
292
+ files: PickedFile[];
293
+ skipped?: SkippedFile[];
294
+ }>;
295
+ /** 授权一个目录范围(需 controlfolder 权限;用户取消抛 USER_CANCELLED) */
296
+ export declare function requestFolderScope(scope: string): Promise<PickedFolder>;
297
+ /** 列出已授权范围 */
298
+ export declare function folderScopes(): Promise<{
299
+ scopes: FolderScope[];
300
+ }>;
301
+ /** controlfolder 操作集(path 均为绝对路径且必须在已授权 scope 前缀下) */
302
+ export declare const controlFolder: {
303
+ createDir(path: string): Promise<{
304
+ path: string;
305
+ }>;
306
+ createFile(path: string, options?: {
307
+ data?: string | Blob | ArrayBuffer | Uint8Array;
308
+ encoding?: "utf8" | "base64";
309
+ mime?: string;
310
+ }): Promise<{
311
+ path: string;
312
+ }>;
313
+ writeFile(path: string, options: {
314
+ data: string | Blob | ArrayBuffer | Uint8Array;
315
+ encoding?: "utf8" | "base64";
316
+ }): Promise<{
317
+ path: string;
318
+ }>;
319
+ /**
320
+ * 二进制读取(controlfolder 字节态;默认 8MB,上限 16MB,超限 FILE_TOO_LARGE)。
321
+ * 旧宿主不支持时抛 NOT_IMPLEMENTED。
322
+ */
323
+ readFileBytes(path: string, options?: {
324
+ maxBytes?: number;
325
+ }): Promise<{
326
+ path: string;
327
+ name: string;
328
+ size: number;
329
+ mime?: string;
330
+ bytes: Uint8Array;
331
+ }>;
332
+ /**
333
+ * 二进制写入(controlfolder 字节态,覆盖写,≤32MB;显式快路径,旧宿主 NOT_IMPLEMENTED)。
334
+ * 说明:`writeFile` 自动按输入走本路径或事件桥,正常情况下无需直接用本方法。
335
+ */
336
+ writeFileBytes(path: string, data: Blob | ArrayBuffer | Uint8Array, options?: {
337
+ mime?: string;
338
+ }): Promise<{
339
+ path: string;
340
+ }>;
341
+ readFile(path: string, options?: {
342
+ encoding?: "auto" | "utf8" | "base64";
343
+ }): Promise<ReadFileResult & {
344
+ path: string;
345
+ }>;
346
+ list(path?: string, options?: {
347
+ recursive?: boolean;
348
+ }): Promise<{
349
+ entries: FolderEntry[];
350
+ }>;
351
+ rename(path: string, newName: string): Promise<{
352
+ path: string;
353
+ }>;
354
+ delete(path: string): Promise<{
355
+ ok: boolean;
356
+ }>;
357
+ copy(src: string, dest: string): Promise<{
358
+ path: string;
359
+ }>;
360
+ move(src: string, dest: string): Promise<{
361
+ path: string;
362
+ }>;
363
+ };
364
+ export interface RtcIceServer {
365
+ urls: string | string[];
366
+ username?: string;
367
+ credential?: string;
368
+ }
369
+ export interface RtcConfig {
370
+ iceServers?: RtcIceServer[];
371
+ }
372
+ export interface RtcDescription {
373
+ sdp: string;
374
+ type: "offer" | "answer";
375
+ }
376
+ export interface RtcIceCandidate {
377
+ candidate: string;
378
+ sdpMid?: string;
379
+ sdpMLineIndex?: number;
380
+ }
381
+ /**
382
+ * 数据通道消息:文本为 UTF-8 原文;二进制经 [bytes](ArrayBuffer,字节直达)。
383
+ * [data] 仅二进制时为 null;旧宿主(无 CkylMpWebRtc)推送的 base64 二进制仍为
384
+ * `{data: base64, binary: true}`(legacy,bytes 缺省)。
385
+ */
386
+ export interface DataChannelMessage {
387
+ data: string | null;
388
+ bytes?: ArrayBuffer;
389
+ binary: boolean;
390
+ }
391
+ export declare class MpDataChannel {
392
+ readonly dcId: number;
393
+ readonly label: string;
394
+ private readonly pcId;
395
+ private messageHandlers;
396
+ constructor(pcId: string, dcId: number, label: string);
397
+ /** 发送文本(UTF-8);单条上限 64KB(事件桥路径) */
398
+ send(data: string): Promise<void>;
399
+ /**
400
+ * 发送二进制:**原生模块路径**(byte[] 直达,≤256KB;应用层自行分帧)。
401
+ * 旧宿主(无 CkylMpWebRtc)自动回退 base64 事件桥(≤48KB 实际字节)。
402
+ */
403
+ sendBytes(data: ArrayBuffer | Uint8Array): Promise<void>;
404
+ /** 发送二进制(base64 文本,legacy);解码后单条上限 64KB */
405
+ sendBinary(base64: string): Promise<void>;
406
+ /** 订阅消息;返回取消函数 */
407
+ onMessage(handler: (msg: DataChannelMessage) => void): () => void;
408
+ /** 内部分发入口([MpPeerConnection] 路由 webrtc_event / webrtc_binary 用) */
409
+ dispatch(data: string | null, binary: boolean, bytes?: ArrayBuffer): void;
410
+ }
411
+ /**
412
+ * P2P 连接(仅音频 + 数据通道)。回调属性按需赋值;
413
+ * [close] 后事件订阅自动解除。
414
+ */
415
+ export declare class MpPeerConnection {
416
+ readonly pcId: string;
417
+ onIceCandidate?: (candidate: RtcIceCandidate) => void;
418
+ onIceGatheringStateChange?: (state: string) => void;
419
+ onConnectionStateChange?: (state: string) => void;
420
+ /** 远端音频轨到达(宿主自动播放) */
421
+ onRemoteAudio?: (state: "added") => void;
422
+ /** 对端新建数据通道 */
423
+ onDataChannel?: (channel: MpDataChannel) => void;
424
+ private readonly channels;
425
+ private readonly unsubscribe;
426
+ constructor(pcId: string);
427
+ createOffer(): Promise<RtcDescription>;
428
+ createAnswer(): Promise<RtcDescription>;
429
+ setLocalDescription(desc: RtcDescription): Promise<void>;
430
+ setRemoteDescription(desc: RtcDescription): Promise<void>;
431
+ addIceCandidate(candidate: RtcIceCandidate): Promise<void>;
432
+ /** 新建本地数据通道(需先完成 offer/answer 协商) */
433
+ createDataChannel(label: string): Promise<MpDataChannel>;
434
+ /** 麦克风开关:首次开启触发宿主运行时权限弹窗(超时放宽至 60s) */
435
+ setMicrophone(enabled: boolean): Promise<void>;
436
+ /** 关闭并释放(幂等;同时解除事件订阅) */
437
+ close(): Promise<void>;
438
+ }
439
+ /**
440
+ * 新建 P2P 连接(需已授权 webrtc 权限,否则 PERM_DENIED)。
441
+ * 典型流程:createPeerConnection → createOffer/setLocalDescription →
442
+ * 信令交换 → setRemoteDescription/addIceCandidate → 建数据通道或开麦。
443
+ */
444
+ export declare function createPeerConnection(config?: RtcConfig): Promise<MpPeerConnection>;
445
+ /** 音频输出路由:`true` 扬声器,`false` 听筒 */
446
+ export declare function setSpeaker(enabled: boolean): Promise<void>;
447
+ /** 宿主桥是否可用(纯读全局,供探针判定 bridgeStreamOk;不触发监听注册) */
448
+ export declare function isBridgeAvailable(): boolean;
449
+ export interface HttpStreamRequest {
450
+ url: string;
451
+ method?: string;
452
+ headers?: Record<string, string>;
453
+ body?: string;
454
+ }
455
+ export interface HttpStreamHandlers {
456
+ /** 收到一行(宿主已 UTF-8 解码并去行尾;SSE 场景为 `data: ...` 等原始行) */
457
+ onLine(line: string): void;
458
+ /** 流正常结束(读到 EOF;被 cancel 时宿主亦回 end) */
459
+ onEnd(): void;
460
+ /** 流失败(HTTP 非 2xx 或 IO 异常且未被取消) */
461
+ onError(status: number, message: string): void;
462
+ }
463
+ export interface HttpStreamHandle {
464
+ streamId: string;
465
+ /** 取消流(宿主 Call.cancel 中断阻塞读;幂等) */
466
+ cancel(): Promise<void>;
467
+ }
468
+ /**
469
+ * 发起宿主 SSE 流式请求。先订阅 http_stream 再 invoke(宿主快速 ack),避免丢首行;
470
+ * end/error 到达即自动退订。返回句柄供主动 cancel。
471
+ */
472
+ export declare function streamHttp(req: HttpStreamRequest, handlers: HttpStreamHandlers): Promise<HttpStreamHandle>;
473
+ //# sourceMappingURL=ckylmp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ckylmp.d.ts","sourceRoot":"","sources":["../src/ckylmp.ts"],"names":[],"mappings":"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"}