@wdywdy/electric-open-platform 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +585 -2
- package/dist/cjs/client.js +173 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/core/api.js +518 -0
- package/dist/cjs/core/api.js.map +1 -0
- package/dist/cjs/core/auth.js +293 -0
- package/dist/cjs/core/auth.js.map +1 -0
- package/dist/cjs/core/crypto.js +160 -0
- package/dist/cjs/core/crypto.js.map +1 -0
- package/dist/cjs/core/errors.js +114 -0
- package/dist/cjs/core/errors.js.map +1 -0
- package/dist/cjs/core/http.js +70 -0
- package/dist/cjs/core/http.js.map +1 -0
- package/dist/cjs/core/models.js +105 -0
- package/dist/cjs/core/models.js.map +1 -0
- package/dist/cjs/core/push.js +79 -0
- package/dist/cjs/core/push.js.map +1 -0
- package/dist/cjs/core/router.js +124 -0
- package/dist/cjs/core/router.js.map +1 -0
- package/dist/cjs/core/runtime.js +37 -0
- package/dist/cjs/core/runtime.js.map +1 -0
- package/dist/cjs/core/sign.js +75 -0
- package/dist/cjs/core/sign.js.map +1 -0
- package/dist/cjs/core/storage.js +152 -0
- package/dist/cjs/core/storage.js.map +1 -0
- package/dist/cjs/core/transport-fetch.js +57 -0
- package/dist/cjs/core/transport-fetch.js.map +1 -0
- package/dist/cjs/core/transport.js +41 -0
- package/dist/cjs/core/transport.js.map +1 -0
- package/dist/cjs/core/types.js +5 -0
- package/dist/cjs/core/types.js.map +1 -0
- package/dist/cjs/index.js +111 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/client.d.ts +73 -0
- package/dist/esm/client.js +169 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/core/api.d.ts +377 -0
- package/dist/esm/core/api.js +506 -0
- package/dist/esm/core/api.js.map +1 -0
- package/dist/esm/core/auth.d.ts +69 -0
- package/dist/esm/core/auth.js +289 -0
- package/dist/esm/core/auth.js.map +1 -0
- package/dist/esm/core/crypto.d.ts +24 -0
- package/dist/esm/core/crypto.js +154 -0
- package/dist/esm/core/crypto.js.map +1 -0
- package/dist/esm/core/errors.d.ts +86 -0
- package/dist/esm/core/errors.js +108 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/http.d.ts +24 -0
- package/dist/esm/core/http.js +56 -0
- package/dist/esm/core/http.js.map +1 -0
- package/dist/esm/core/models.d.ts +441 -0
- package/dist/esm/core/models.js +102 -0
- package/dist/esm/core/models.js.map +1 -0
- package/dist/esm/core/push.d.ts +54 -0
- package/dist/esm/core/push.js +74 -0
- package/dist/esm/core/push.js.map +1 -0
- package/dist/esm/core/router.d.ts +44 -0
- package/dist/esm/core/router.js +120 -0
- package/dist/esm/core/router.js.map +1 -0
- package/dist/esm/core/runtime.d.ts +23 -0
- package/dist/esm/core/runtime.js +33 -0
- package/dist/esm/core/runtime.js.map +1 -0
- package/dist/esm/core/sign.d.ts +54 -0
- package/dist/esm/core/sign.js +67 -0
- package/dist/esm/core/sign.js.map +1 -0
- package/dist/esm/core/storage.d.ts +73 -0
- package/dist/esm/core/storage.js +141 -0
- package/dist/esm/core/storage.js.map +1 -0
- package/dist/esm/core/transport-fetch.d.ts +2 -0
- package/dist/esm/core/transport-fetch.js +54 -0
- package/dist/esm/core/transport-fetch.js.map +1 -0
- package/dist/esm/core/transport.d.ts +23 -0
- package/dist/esm/core/transport.js +36 -0
- package/dist/esm/core/transport.js.map +1 -0
- package/dist/esm/core/types.d.ts +76 -0
- package/dist/esm/core/types.js +2 -0
- package/dist/esm/core/types.js.map +1 -0
- package/dist/esm/index.d.ts +37 -0
- package/dist/esm/index.js +47 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +63 -4
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token / config persistence.
|
|
3
|
+
*
|
|
4
|
+
* The platform's own guidance is to keep one "central controller" that owns the
|
|
5
|
+
* access token, so tokens are persisted across restarts and renewed with the
|
|
6
|
+
* refresh token.
|
|
7
|
+
*
|
|
8
|
+
* 本包**不依赖任何平台 SDK**。存储后端由 {@link KeyValueStore} 抽象:
|
|
9
|
+
*
|
|
10
|
+
* | 模式 | 实现 | 说明 |
|
|
11
|
+
* | --- | --- | --- |
|
|
12
|
+
* | `auto`(默认) | `localStorage` → 内存 | 浏览器/Electron 渲染进程可用;Node 里退到内存 |
|
|
13
|
+
* | `localStorage` | `localStorage` | 拿不到时退到内存 |
|
|
14
|
+
* | `memory` | 内存 | 进程结束即丢,适合测试或一次性脚本 |
|
|
15
|
+
* | 自定义 | `config.store` | 想写入文件、Redis、数据库、iOS `UserDefaults`/Android
|
|
16
|
+
* `SharedPreferences` 时,自己实现 4 个方法传给 `configure({ store })` 即可 |
|
|
17
|
+
*
|
|
18
|
+
* 之前版本内置的宿主原生存储(Cordova SharedPreferences、Capacitor Preferences)已移除:
|
|
19
|
+
* 它们需要宿主桥接或额外依赖,与「纯 npm 包、任何项目都能用」的目标冲突。
|
|
20
|
+
* 同样的能力可以用自定义 store 在 10 行内实现,见 README。
|
|
21
|
+
*/
|
|
22
|
+
import type { StorageMode } from './types.js';
|
|
23
|
+
/**
|
|
24
|
+
* 最小键值存储契约。
|
|
25
|
+
*
|
|
26
|
+
* 实现只需保证 4 个方法;写入失败请抛出异常,调用方会降级处理而不是崩溃。
|
|
27
|
+
*/
|
|
28
|
+
export interface KeyValueStore {
|
|
29
|
+
/** 便于诊断:`client.storageBackend()` 与 `describe()` 会返回该名字。 */
|
|
30
|
+
readonly name: string;
|
|
31
|
+
get(key: string): Promise<string | null>;
|
|
32
|
+
set(key: string, value: string): Promise<void>;
|
|
33
|
+
remove(key: string): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
/** 内存后端:进程内共享,适合测试与一次性脚本。 */
|
|
36
|
+
export declare function createMemoryStore(): KeyValueStore;
|
|
37
|
+
export declare const memoryBackend: KeyValueStore;
|
|
38
|
+
/** 探活 localStorage:隐私模式/服务端渲染下读写都会抛错,此时返回 null。 */
|
|
39
|
+
export declare function createLocalStorageStore(): KeyValueStore | null;
|
|
40
|
+
/**
|
|
41
|
+
* 注入全局默认存储后端(如 iOS `UserDefaults` / Android `SharedPreferences`)。
|
|
42
|
+
*
|
|
43
|
+
* 与 `setTransport()` 对称:宿主应用在 bootstrap 阶段调用一次,之后所有
|
|
44
|
+
* `configure()` 都会用它,业务代码(组件、页面、共享模块)**不需要知道宿主是什么**。
|
|
45
|
+
* 传了 `config.store` 时以 `config.store` 为准。
|
|
46
|
+
*/
|
|
47
|
+
export declare function setDefaultStore(store: KeyValueStore): void;
|
|
48
|
+
/** 当前注入的全局默认存储后端(未注入为 undefined)。 */
|
|
49
|
+
export declare function getDefaultStore(): KeyValueStore | undefined;
|
|
50
|
+
/** 撤销全局默认存储后端(测试用)。 */
|
|
51
|
+
export declare function clearDefaultStore(): void;
|
|
52
|
+
/**
|
|
53
|
+
* 解析存储后端,优先级:
|
|
54
|
+
* `config.store`(最高)> `setDefaultStore()` 注入的全局后端 > `storage` 模式对应的内置后端。
|
|
55
|
+
*
|
|
56
|
+
* @param mode 配置里的 `storage`(默认 `auto`)
|
|
57
|
+
* @param custom 调用方在 `configure({ store })` 里传入的自定义 store
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolveBackend(mode?: StorageMode, custom?: KeyValueStore): KeyValueStore | Promise<KeyValueStore>;
|
|
60
|
+
/** Resets the cached backend — used by tests and after a `storage` config change. */
|
|
61
|
+
export declare function resetStorageBackend(): void;
|
|
62
|
+
export declare class TokenStore {
|
|
63
|
+
private readonly backend;
|
|
64
|
+
private readonly namespace;
|
|
65
|
+
constructor(backend: KeyValueStore, namespace: string);
|
|
66
|
+
private key;
|
|
67
|
+
readTokens<T>(): Promise<T | null>;
|
|
68
|
+
writeTokens(tokens: unknown): Promise<void>;
|
|
69
|
+
clear(): Promise<void>;
|
|
70
|
+
/** The backend actually in use, for diagnostics screens. */
|
|
71
|
+
get backendName(): string;
|
|
72
|
+
private safeRemove;
|
|
73
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
const memory = new Map();
|
|
2
|
+
/** 内存后端:进程内共享,适合测试与一次性脚本。 */
|
|
3
|
+
export function createMemoryStore() {
|
|
4
|
+
return {
|
|
5
|
+
name: 'memory',
|
|
6
|
+
async get(key) {
|
|
7
|
+
return memory.has(key) ? memory.get(key) : null;
|
|
8
|
+
},
|
|
9
|
+
async set(key, value) {
|
|
10
|
+
memory.set(key, value);
|
|
11
|
+
},
|
|
12
|
+
async remove(key) {
|
|
13
|
+
memory.delete(key);
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export const memoryBackend = createMemoryStore();
|
|
18
|
+
/** 探活 localStorage:隐私模式/服务端渲染下读写都会抛错,此时返回 null。 */
|
|
19
|
+
export function createLocalStorageStore() {
|
|
20
|
+
try {
|
|
21
|
+
if (typeof globalThis.localStorage === 'undefined')
|
|
22
|
+
return null;
|
|
23
|
+
const probe = '__eop_probe__';
|
|
24
|
+
globalThis.localStorage.setItem(probe, '1');
|
|
25
|
+
globalThis.localStorage.removeItem(probe);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
name: 'localStorage',
|
|
32
|
+
async get(key) {
|
|
33
|
+
return globalThis.localStorage.getItem(key);
|
|
34
|
+
},
|
|
35
|
+
async set(key, value) {
|
|
36
|
+
globalThis.localStorage.setItem(key, value);
|
|
37
|
+
},
|
|
38
|
+
async remove(key) {
|
|
39
|
+
globalThis.localStorage.removeItem(key);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
let resolved = null;
|
|
44
|
+
let defaultStore;
|
|
45
|
+
/**
|
|
46
|
+
* 注入全局默认存储后端(如 iOS `UserDefaults` / Android `SharedPreferences`)。
|
|
47
|
+
*
|
|
48
|
+
* 与 `setTransport()` 对称:宿主应用在 bootstrap 阶段调用一次,之后所有
|
|
49
|
+
* `configure()` 都会用它,业务代码(组件、页面、共享模块)**不需要知道宿主是什么**。
|
|
50
|
+
* 传了 `config.store` 时以 `config.store` 为准。
|
|
51
|
+
*/
|
|
52
|
+
export function setDefaultStore(store) {
|
|
53
|
+
defaultStore = store;
|
|
54
|
+
}
|
|
55
|
+
/** 当前注入的全局默认存储后端(未注入为 undefined)。 */
|
|
56
|
+
export function getDefaultStore() {
|
|
57
|
+
return defaultStore;
|
|
58
|
+
}
|
|
59
|
+
/** 撤销全局默认存储后端(测试用)。 */
|
|
60
|
+
export function clearDefaultStore() {
|
|
61
|
+
defaultStore = undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 解析存储后端,优先级:
|
|
65
|
+
* `config.store`(最高)> `setDefaultStore()` 注入的全局后端 > `storage` 模式对应的内置后端。
|
|
66
|
+
*
|
|
67
|
+
* @param mode 配置里的 `storage`(默认 `auto`)
|
|
68
|
+
* @param custom 调用方在 `configure({ store })` 里传入的自定义 store
|
|
69
|
+
*/
|
|
70
|
+
export function resolveBackend(mode = 'auto', custom) {
|
|
71
|
+
if (custom)
|
|
72
|
+
return custom;
|
|
73
|
+
if (defaultStore)
|
|
74
|
+
return defaultStore;
|
|
75
|
+
if (mode === 'memory')
|
|
76
|
+
return memoryBackend;
|
|
77
|
+
if (mode === 'localStorage')
|
|
78
|
+
return createLocalStorageStore() ?? memoryBackend;
|
|
79
|
+
// auto:localStorage → 内存(Node/SSR 没有 localStorage)
|
|
80
|
+
if (resolved)
|
|
81
|
+
return resolved;
|
|
82
|
+
resolved = createLocalStorageStore() ?? memoryBackend;
|
|
83
|
+
return resolved;
|
|
84
|
+
}
|
|
85
|
+
/** Resets the cached backend — used by tests and after a `storage` config change. */
|
|
86
|
+
export function resetStorageBackend() {
|
|
87
|
+
resolved = null;
|
|
88
|
+
}
|
|
89
|
+
export class TokenStore {
|
|
90
|
+
constructor(backend, namespace) {
|
|
91
|
+
this.backend = backend;
|
|
92
|
+
this.namespace = namespace;
|
|
93
|
+
}
|
|
94
|
+
key(name) {
|
|
95
|
+
return `eop:${this.namespace}:${name}`;
|
|
96
|
+
}
|
|
97
|
+
async readTokens() {
|
|
98
|
+
let raw = null;
|
|
99
|
+
try {
|
|
100
|
+
raw = await this.backend.get(this.key('tokens'));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// 自定义后端读失败不应让 App 启动即崩:当作没有 token,走重新登录。
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (!raw)
|
|
107
|
+
return null;
|
|
108
|
+
try {
|
|
109
|
+
return JSON.parse(raw);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Corrupt payload: drop it rather than crashing the app on boot.
|
|
113
|
+
await this.safeRemove();
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async writeTokens(tokens) {
|
|
118
|
+
try {
|
|
119
|
+
await this.backend.set(this.key('tokens'), JSON.stringify(tokens));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// 持久化失败不影响本次会话(内存里仍有 token),下次请求会自然重登。
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async clear() {
|
|
126
|
+
await this.safeRemove();
|
|
127
|
+
}
|
|
128
|
+
/** The backend actually in use, for diagnostics screens. */
|
|
129
|
+
get backendName() {
|
|
130
|
+
return this.backend.name;
|
|
131
|
+
}
|
|
132
|
+
async safeRemove() {
|
|
133
|
+
try {
|
|
134
|
+
await this.backend.remove(this.key('tokens'));
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
/* ignore */
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/core/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基于标准 `fetch` 的传输实现 —— 包内唯一的默认实现。
|
|
3
|
+
*
|
|
4
|
+
* 适用:Node ≥ 18、Electron 主进程、Deno/Bun、以及**同源或已配反向代理**的浏览器。
|
|
5
|
+
*
|
|
6
|
+
* ⚠️ 浏览器里直接请求 `open.snd02.com` 会被同源策略拦截:平台不返回 CORS 头。
|
|
7
|
+
* 浏览器场景请把 `baseUrl` 指向自己的代理/后端中转,或注入一个走原生网络的
|
|
8
|
+
* {@link Transport} 实现(见 README「在任何环境里使用」)。
|
|
9
|
+
*/
|
|
10
|
+
import { ElectricOpenPlatformError, TransportCodes } from './errors.js';
|
|
11
|
+
import { assertHttpOk, DEFAULT_TIMEOUT_MS, parseBody, } from './transport.js';
|
|
12
|
+
export function createFetchTransport() {
|
|
13
|
+
return {
|
|
14
|
+
name: 'fetch',
|
|
15
|
+
async postForm(req) {
|
|
16
|
+
if (req.signal?.aborted) {
|
|
17
|
+
throw new ElectricOpenPlatformError(TransportCodes.ABORTED, '请求已取消');
|
|
18
|
+
}
|
|
19
|
+
const headers = {
|
|
20
|
+
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
|
|
21
|
+
Accept: 'application/json, text/plain, */*',
|
|
22
|
+
...req.headers,
|
|
23
|
+
};
|
|
24
|
+
const timeoutMs = req.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
25
|
+
// AbortController 让超时行为不依赖运行时的具体实现
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
28
|
+
const onAbort = () => controller.abort();
|
|
29
|
+
req.signal?.addEventListener('abort', onAbort);
|
|
30
|
+
try {
|
|
31
|
+
const res = await fetch(req.url, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers,
|
|
34
|
+
body: req.body,
|
|
35
|
+
signal: controller.signal,
|
|
36
|
+
});
|
|
37
|
+
const raw = await res.text();
|
|
38
|
+
assertHttpOk(res.status, raw);
|
|
39
|
+
return { status: res.status, data: parseBody(raw), raw };
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (err instanceof ElectricOpenPlatformError)
|
|
43
|
+
throw err;
|
|
44
|
+
const aborted = err?.name === 'AbortError';
|
|
45
|
+
throw new ElectricOpenPlatformError(aborted ? TransportCodes.ABORTED : TransportCodes.NETWORK, aborted ? '请求超时或已取消' : `网络请求失败:${err?.message ?? err}`, { cause: err });
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
req.signal?.removeEventListener('abort', onAbort);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=transport-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-fetch.js","sourceRoot":"","sources":["../../../src/core/transport-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EACL,YAAY,EACZ,kBAAkB,EAGlB,SAAS,GAEV,MAAM,gBAAgB,CAAC;AAExB,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,CAAC,QAAQ,CAAC,GAAgB;YAC7B,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAI,yBAAyB,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,OAAO,GAAG;gBACd,cAAc,EAAE,kDAAkD;gBAClE,MAAM,EAAE,mCAAmC;gBAC3C,GAAG,GAAG,CAAC,OAAO;aACf,CAAC;YACF,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,kBAAkB,CAAC;YAEtD,mCAAmC;YACnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACzC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE/C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;oBAC/B,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC7B,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC9B,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YAC3D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,yBAAyB;oBAAE,MAAM,GAAG,CAAC;gBACxD,MAAM,OAAO,GAAI,GAAa,EAAE,IAAI,KAAK,YAAY,CAAC;gBACtD,MAAM,IAAI,yBAAyB,CACjC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EACzD,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAW,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,EACjE,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface HttpRequest {
|
|
2
|
+
url: string;
|
|
3
|
+
/** form-urlencoded body. */
|
|
4
|
+
body: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
}
|
|
9
|
+
export interface HttpResponse {
|
|
10
|
+
status: number;
|
|
11
|
+
/** Response body already parsed when it was JSON, otherwise the raw string. */
|
|
12
|
+
data: unknown;
|
|
13
|
+
raw: string;
|
|
14
|
+
}
|
|
15
|
+
export interface Transport {
|
|
16
|
+
/** 便于诊断:当前实际使用的传输实现名称。 */
|
|
17
|
+
readonly name: string;
|
|
18
|
+
postForm(req: HttpRequest): Promise<HttpResponse>;
|
|
19
|
+
}
|
|
20
|
+
export declare const DEFAULT_TIMEOUT_MS = 20000;
|
|
21
|
+
export declare function parseBody(raw: string): unknown;
|
|
22
|
+
/** 非 2xx 统一转成可识别的异常。 */
|
|
23
|
+
export declare function assertHttpOk(status: number, raw: string): void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable HTTP transport.
|
|
3
|
+
*
|
|
4
|
+
* 包内只提供一种实现({@link createFetchTransport},基于标准 `fetch`),
|
|
5
|
+
* 需要走原生网络栈、代理或自建网关时,实现 {@link Transport} 注入即可:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* await ElectricOpenPlatform.configure({ ...cfg, transport: myTransport });
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* 所有实现只负责「发出去、拿回来、把 HTTP 状态映射成异常」,
|
|
12
|
+
* 解析 JSON 与业务错误码由上层统一处理,保证不同传输实现的行为一致。
|
|
13
|
+
*/
|
|
14
|
+
import { ElectricOpenPlatformError, TransportCodes } from './errors.js';
|
|
15
|
+
export const DEFAULT_TIMEOUT_MS = 20000;
|
|
16
|
+
export function parseBody(raw) {
|
|
17
|
+
const trimmed = raw.trim();
|
|
18
|
+
if (trimmed === '')
|
|
19
|
+
return null;
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(trimmed);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return raw;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** 非 2xx 统一转成可识别的异常。 */
|
|
28
|
+
export function assertHttpOk(status, raw) {
|
|
29
|
+
if (status < 200 || status >= 300) {
|
|
30
|
+
throw new ElectricOpenPlatformError(TransportCodes.HTTP, `服务器返回 HTTP ${status}`, {
|
|
31
|
+
httpStatus: status,
|
|
32
|
+
details: raw,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/core/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwBxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAM,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,GAAW;IACtD,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,yBAAyB,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,MAAM,EAAE,EAAE;YAC/E,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** Shared configuration and token types. */
|
|
2
|
+
import type { KeyValueStore } from './storage.js';
|
|
3
|
+
import type { Transport } from './transport.js';
|
|
4
|
+
export interface ElectricConfig {
|
|
5
|
+
/** `appKey` from the open-platform console — sent as `client_id`. */
|
|
6
|
+
appKey: string;
|
|
7
|
+
/** `appSecret` — never leaves the device except as an MD5 digest. */
|
|
8
|
+
appSecret: string;
|
|
9
|
+
/** Registered callback URL; must match the console exactly (it is signed). */
|
|
10
|
+
redirectUri: string;
|
|
11
|
+
/** Defaults to `https://open.snd02.com`. */
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
/** Default `projectCode`, so most calls do not need to repeat it. */
|
|
14
|
+
projectCode?: string;
|
|
15
|
+
/** Request timeout in ms (default 20000). */
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
/** Renew the access token this many ms before it expires (default 60000). */
|
|
18
|
+
tokenRefreshSkewMs?: number;
|
|
19
|
+
/** `uname` used for the headless (authverify2) login flow. */
|
|
20
|
+
username?: string;
|
|
21
|
+
/** `passwd` used for the headless login flow. */
|
|
22
|
+
password?: string;
|
|
23
|
+
/** Where tokens are persisted. Default `auto`. */
|
|
24
|
+
storage?: StorageMode;
|
|
25
|
+
/**
|
|
26
|
+
* 自定义存储后端(优先级高于 `storage`)。
|
|
27
|
+
*
|
|
28
|
+
* 想把 token 写进文件、Redis、数据库,或 iOS `UserDefaults`/Android
|
|
29
|
+
* `SharedPreferences`,实现 {@link KeyValueStore} 的 4 个方法传进来即可,
|
|
30
|
+
* 包本身不会引入任何平台 SDK。
|
|
31
|
+
*/
|
|
32
|
+
store?: KeyValueStore;
|
|
33
|
+
/**
|
|
34
|
+
* 自定义网络传输实现。留空则用内置 `fetch`。
|
|
35
|
+
*
|
|
36
|
+
* 浏览器里平台不返回 CORS 头,直接调用会被同源策略拦截 —— 这种情况下要么
|
|
37
|
+
* 让 `baseUrl` 指向你自己的反向代理/后端中转,要么注入一个走原生网络的实现。
|
|
38
|
+
*/
|
|
39
|
+
transport?: Transport;
|
|
40
|
+
/** Called for every request/response when set. Console-friendly. */
|
|
41
|
+
logger?: ElectricLogger;
|
|
42
|
+
}
|
|
43
|
+
/** `auto` = localStorage → 内存;Node 里没有 localStorage 时自动退到内存。 */
|
|
44
|
+
export type StorageMode = 'auto' | 'localStorage' | 'memory';
|
|
45
|
+
export type ElectricLogger = (event: ElectricLogEvent) => void;
|
|
46
|
+
export interface ElectricLogEvent {
|
|
47
|
+
type: 'request' | 'response' | 'token' | 'error';
|
|
48
|
+
method?: string;
|
|
49
|
+
/** Never contains the access token or the secret; bodies are redacted. */
|
|
50
|
+
detail?: Record<string, unknown>;
|
|
51
|
+
message: string;
|
|
52
|
+
at: string;
|
|
53
|
+
}
|
|
54
|
+
export interface TokenSet {
|
|
55
|
+
accessToken: string;
|
|
56
|
+
refreshToken: string;
|
|
57
|
+
/** `tokenType` as returned — the platform sends `"BEARER"`. */
|
|
58
|
+
tokenType: string;
|
|
59
|
+
/** Unix epoch ms at which the access token expires. */
|
|
60
|
+
expiresAt: number;
|
|
61
|
+
}
|
|
62
|
+
export interface LoginResult {
|
|
63
|
+
success: true;
|
|
64
|
+
/** The OAuth temporary code that was exchanged. */
|
|
65
|
+
code: string;
|
|
66
|
+
expiresIn: number;
|
|
67
|
+
expiresAt: number;
|
|
68
|
+
}
|
|
69
|
+
/** Envelope every `router.as` response shares. */
|
|
70
|
+
export interface ApiEnvelope<T> {
|
|
71
|
+
code: string;
|
|
72
|
+
message?: string;
|
|
73
|
+
success?: boolean;
|
|
74
|
+
data: T;
|
|
75
|
+
}
|
|
76
|
+
export declare const DEFAULT_BASE_URL = "https://open.snd02.com";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"AAmFA,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* 智慧式用电数据开放平台(Mtsci Open Platform,open.snd02.com)的纯 TypeScript SDK。
|
|
4
|
+
*
|
|
5
|
+
* 零运行时依赖,Node ≥ 18 / 浏览器 / Electron / 任意前端框架通用;
|
|
6
|
+
* 需要走原生网络或自建网关时,注入一个 {@link Transport} 即可。
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { ElectricOpenPlatform } from '@wdywdy/electric-open-platform';
|
|
10
|
+
*
|
|
11
|
+
* await ElectricOpenPlatform.configure({
|
|
12
|
+
* appKey: 'O000093290',
|
|
13
|
+
* appSecret: process.env.EOP_APP_SECRET!, // keep out of source control
|
|
14
|
+
* redirectUri: 'http://yourserverurl/receive',
|
|
15
|
+
* projectCode: 'P00000104893',
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* await ElectricOpenPlatform.login('yfdq01', '…');
|
|
19
|
+
* const boxes = await ElectricOpenPlatform.box.listOnline();
|
|
20
|
+
* const [live] = await ElectricOpenPlatform.channel.realtime({ mac: boxes[0].mac });
|
|
21
|
+
* await ElectricOpenPlatform.control.switchCircuit({ mac: boxes[0].mac, action: 'close', addr: 1 });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export { ElectricOpenPlatform, ElectricOpenPlatformClient } from './client.js';
|
|
25
|
+
export { md5, formatTimestamp, formatAlarmTime } from './core/crypto.js';
|
|
26
|
+
export { signParams, buildSignedRequest, encodeForm, signAuthCodeSecret, signRefreshSecret, type ParamValue, } from './core/sign.js';
|
|
27
|
+
export { postForm, parseBody, createFetchTransport, resolveTransport, setTransport, resetTransport, currentTransport, currentTransportName, hasExplicitTransport, type HttpRequest, type HttpResponse, type Transport, } from './core/http.js';
|
|
28
|
+
export { detectRuntime, hasGlobalFetch, type Runtime } from './core/runtime.js';
|
|
29
|
+
export { ElectricOpenPlatformError, PlatformCodes, TransportCodes, describeCode, isElectricOpenPlatformError, type PlatformCode, type TransportCode, } from './core/errors.js';
|
|
30
|
+
export { DEFAULT_BASE_URL, type ElectricConfig, type ElectricLogger, type ElectricLogEvent, type StorageMode, type TokenSet, type LoginResult, type ApiEnvelope, } from './core/types.js';
|
|
31
|
+
export { TokenStore, resolveBackend, resetStorageBackend, createMemoryStore, createLocalStorageStore, memoryBackend, setDefaultStore, getDefaultStore, clearDefaultStore, type KeyValueStore, } from './core/storage.js';
|
|
32
|
+
export { AuthManager } from './core/auth.js';
|
|
33
|
+
export { RouterClient, type CallOptions } from './core/router.js';
|
|
34
|
+
export { verifyPushKey, type PushCmd } from './core/push.js';
|
|
35
|
+
export { ProjectApi, BoxApi, ChannelApi, ControlApi, AlarmApi, StatsApi, SceneApi, ThirdPartyDeviceApi, parseThirdPartyData, } from './core/api.js';
|
|
36
|
+
export { PushApi } from './core/push.js';
|
|
37
|
+
export * from './core/models.js';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* 智慧式用电数据开放平台(Mtsci Open Platform,open.snd02.com)的纯 TypeScript SDK。
|
|
4
|
+
*
|
|
5
|
+
* 零运行时依赖,Node ≥ 18 / 浏览器 / Electron / 任意前端框架通用;
|
|
6
|
+
* 需要走原生网络或自建网关时,注入一个 {@link Transport} 即可。
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { ElectricOpenPlatform } from '@wdywdy/electric-open-platform';
|
|
10
|
+
*
|
|
11
|
+
* await ElectricOpenPlatform.configure({
|
|
12
|
+
* appKey: 'O000093290',
|
|
13
|
+
* appSecret: process.env.EOP_APP_SECRET!, // keep out of source control
|
|
14
|
+
* redirectUri: 'http://yourserverurl/receive',
|
|
15
|
+
* projectCode: 'P00000104893',
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* await ElectricOpenPlatform.login('yfdq01', '…');
|
|
19
|
+
* const boxes = await ElectricOpenPlatform.box.listOnline();
|
|
20
|
+
* const [live] = await ElectricOpenPlatform.channel.realtime({ mac: boxes[0].mac });
|
|
21
|
+
* await ElectricOpenPlatform.control.switchCircuit({ mac: boxes[0].mac, action: 'close', addr: 1 });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export { ElectricOpenPlatform, ElectricOpenPlatformClient } from './client.js';
|
|
25
|
+
// Core building blocks — exported so host apps can sign their own calls or
|
|
26
|
+
// reuse the primitives in a backend.
|
|
27
|
+
export { md5, formatTimestamp, formatAlarmTime } from './core/crypto.js';
|
|
28
|
+
export { signParams, buildSignedRequest, encodeForm, signAuthCodeSecret, signRefreshSecret, } from './core/sign.js';
|
|
29
|
+
export { postForm, parseBody,
|
|
30
|
+
// 传输层:使用方可以显式指定实现(config.transport / setTransport),
|
|
31
|
+
// 未指定时一律用内置 fetch —— 不做宿主探测。
|
|
32
|
+
createFetchTransport, resolveTransport, setTransport, resetTransport, currentTransport, currentTransportName, hasExplicitTransport, } from './core/http.js';
|
|
33
|
+
export { detectRuntime, hasGlobalFetch } from './core/runtime.js';
|
|
34
|
+
export { ElectricOpenPlatformError, PlatformCodes, TransportCodes, describeCode, isElectricOpenPlatformError, } from './core/errors.js';
|
|
35
|
+
export { DEFAULT_BASE_URL, } from './core/types.js';
|
|
36
|
+
export { TokenStore, resolveBackend, resetStorageBackend, createMemoryStore, createLocalStorageStore, memoryBackend,
|
|
37
|
+
// 宿主应用在 bootstrap 阶段注入全局默认存储(与 setTransport 对称),
|
|
38
|
+
// 这样共享页面/组件无需引用任何平台 SDK。
|
|
39
|
+
setDefaultStore, getDefaultStore, clearDefaultStore, } from './core/storage.js';
|
|
40
|
+
export { AuthManager } from './core/auth.js';
|
|
41
|
+
export { RouterClient } from './core/router.js';
|
|
42
|
+
export { verifyPushKey } from './core/push.js';
|
|
43
|
+
// Domain APIs (for typing custom wrappers) and every wire model / enum.
|
|
44
|
+
export { ProjectApi, BoxApi, ChannelApi, ControlApi, AlarmApi, StatsApi, SceneApi, ThirdPartyDeviceApi, parseThirdPartyData, } from './core/api.js';
|
|
45
|
+
export { PushApi } from './core/push.js';
|
|
46
|
+
export * from './core/models.js';
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAE/E,2EAA2E;AAC3E,qCAAqC;AACrC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,QAAQ,EACR,SAAS;AACT,oDAAoD;AACpD,6BAA6B;AAC7B,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GAIrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAC;AAChF,OAAO,EACL,yBAAyB,EACzB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,2BAA2B,GAG5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,GAQjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,aAAa;AACb,iDAAiD;AACjD,yBAAyB;AACzB,eAAe,EACf,eAAe,EACf,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAoB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAgB,MAAM,gBAAgB,CAAC;AAE7D,wEAAwE;AACxE,OAAO,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,cAAc,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,65 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wdywdy/electric-open-platform",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "智慧式用电数据开放平台(open.snd02.com)的纯 TypeScript SDK:OAuth2 token 生命周期、MD5 参数签名,以及全部 router.as 接口的类型化封装。零运行时依赖,Node / 浏览器 / Electron / 任意前端框架通用。",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cjs/index.js",
|
|
7
|
+
"module": "dist/esm/index.js",
|
|
8
|
+
"types": "dist/esm/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/esm/index.d.ts",
|
|
12
|
+
"import": "./dist/esm/index.js",
|
|
13
|
+
"require": "./dist/cjs/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=18"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "npm run clean && npm run build:esm && npm run build:cjs",
|
|
28
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
29
|
+
"build:cjs": "tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.mjs",
|
|
30
|
+
"clean": "node -e \"import('node:fs').then(fs=>fs.rmSync('dist',{recursive:true,force:true}))\"",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest",
|
|
33
|
+
"lint": "tsc --noEmit -p tsconfig.json",
|
|
34
|
+
"demo": "vite --config vite.demo.config.ts",
|
|
35
|
+
"verify:live": "node scripts/verify-live.mjs",
|
|
36
|
+
"check:versions": "node scripts/check-versions.mjs",
|
|
37
|
+
"prepublishOnly": "npm run build"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"mantunsci",
|
|
41
|
+
"electric",
|
|
42
|
+
"snd02",
|
|
43
|
+
"iot",
|
|
44
|
+
"smart-power",
|
|
45
|
+
"open-platform",
|
|
46
|
+
"sdk",
|
|
47
|
+
"api-client",
|
|
48
|
+
"oauth2",
|
|
49
|
+
"typescript"
|
|
50
|
+
],
|
|
51
|
+
"author": "ACME 毅丰电器",
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"publishConfig": {
|
|
54
|
+
"access": "public"
|
|
55
|
+
},
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "https://github.com/lanyangayang/cordova-mantunsci-electric.git"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"typescript": "^5.6.3",
|
|
62
|
+
"vite": "^5.4.10",
|
|
63
|
+
"vitest": "^2.1.4"
|
|
64
|
+
}
|
|
65
|
+
}
|