@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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +585 -2
  3. package/dist/cjs/client.js +173 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/core/api.js +518 -0
  6. package/dist/cjs/core/api.js.map +1 -0
  7. package/dist/cjs/core/auth.js +293 -0
  8. package/dist/cjs/core/auth.js.map +1 -0
  9. package/dist/cjs/core/crypto.js +160 -0
  10. package/dist/cjs/core/crypto.js.map +1 -0
  11. package/dist/cjs/core/errors.js +114 -0
  12. package/dist/cjs/core/errors.js.map +1 -0
  13. package/dist/cjs/core/http.js +70 -0
  14. package/dist/cjs/core/http.js.map +1 -0
  15. package/dist/cjs/core/models.js +105 -0
  16. package/dist/cjs/core/models.js.map +1 -0
  17. package/dist/cjs/core/push.js +79 -0
  18. package/dist/cjs/core/push.js.map +1 -0
  19. package/dist/cjs/core/router.js +124 -0
  20. package/dist/cjs/core/router.js.map +1 -0
  21. package/dist/cjs/core/runtime.js +37 -0
  22. package/dist/cjs/core/runtime.js.map +1 -0
  23. package/dist/cjs/core/sign.js +75 -0
  24. package/dist/cjs/core/sign.js.map +1 -0
  25. package/dist/cjs/core/storage.js +152 -0
  26. package/dist/cjs/core/storage.js.map +1 -0
  27. package/dist/cjs/core/transport-fetch.js +57 -0
  28. package/dist/cjs/core/transport-fetch.js.map +1 -0
  29. package/dist/cjs/core/transport.js +41 -0
  30. package/dist/cjs/core/transport.js.map +1 -0
  31. package/dist/cjs/core/types.js +5 -0
  32. package/dist/cjs/core/types.js.map +1 -0
  33. package/dist/cjs/index.js +111 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/package.json +3 -0
  36. package/dist/esm/client.d.ts +73 -0
  37. package/dist/esm/client.js +169 -0
  38. package/dist/esm/client.js.map +1 -0
  39. package/dist/esm/core/api.d.ts +377 -0
  40. package/dist/esm/core/api.js +506 -0
  41. package/dist/esm/core/api.js.map +1 -0
  42. package/dist/esm/core/auth.d.ts +69 -0
  43. package/dist/esm/core/auth.js +289 -0
  44. package/dist/esm/core/auth.js.map +1 -0
  45. package/dist/esm/core/crypto.d.ts +24 -0
  46. package/dist/esm/core/crypto.js +154 -0
  47. package/dist/esm/core/crypto.js.map +1 -0
  48. package/dist/esm/core/errors.d.ts +86 -0
  49. package/dist/esm/core/errors.js +108 -0
  50. package/dist/esm/core/errors.js.map +1 -0
  51. package/dist/esm/core/http.d.ts +24 -0
  52. package/dist/esm/core/http.js +56 -0
  53. package/dist/esm/core/http.js.map +1 -0
  54. package/dist/esm/core/models.d.ts +441 -0
  55. package/dist/esm/core/models.js +102 -0
  56. package/dist/esm/core/models.js.map +1 -0
  57. package/dist/esm/core/push.d.ts +54 -0
  58. package/dist/esm/core/push.js +74 -0
  59. package/dist/esm/core/push.js.map +1 -0
  60. package/dist/esm/core/router.d.ts +44 -0
  61. package/dist/esm/core/router.js +120 -0
  62. package/dist/esm/core/router.js.map +1 -0
  63. package/dist/esm/core/runtime.d.ts +23 -0
  64. package/dist/esm/core/runtime.js +33 -0
  65. package/dist/esm/core/runtime.js.map +1 -0
  66. package/dist/esm/core/sign.d.ts +54 -0
  67. package/dist/esm/core/sign.js +67 -0
  68. package/dist/esm/core/sign.js.map +1 -0
  69. package/dist/esm/core/storage.d.ts +73 -0
  70. package/dist/esm/core/storage.js +141 -0
  71. package/dist/esm/core/storage.js.map +1 -0
  72. package/dist/esm/core/transport-fetch.d.ts +2 -0
  73. package/dist/esm/core/transport-fetch.js +54 -0
  74. package/dist/esm/core/transport-fetch.js.map +1 -0
  75. package/dist/esm/core/transport.d.ts +23 -0
  76. package/dist/esm/core/transport.js +36 -0
  77. package/dist/esm/core/transport.js.map +1 -0
  78. package/dist/esm/core/types.d.ts +76 -0
  79. package/dist/esm/core/types.js +2 -0
  80. package/dist/esm/core/types.js.map +1 -0
  81. package/dist/esm/index.d.ts +37 -0
  82. package/dist/esm/index.js +47 -0
  83. package/dist/esm/index.js.map +1 -0
  84. package/package.json +63 -4
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ElectricOpenPlatform = exports.ElectricOpenPlatformClient = void 0;
4
+ /**
5
+ * The SDK facade.
6
+ *
7
+ * Everything is composed here so the public surface stays a single object:
8
+ *
9
+ * ```ts
10
+ * import { ElectricOpenPlatform } from '@wdywdy/electric-open-platform';
11
+ *
12
+ * await ElectricOpenPlatform.configure({ appKey, appSecret, redirectUri, projectCode });
13
+ * await ElectricOpenPlatform.login('yfdq01', '******');
14
+ * const boxes = await ElectricOpenPlatform.box.list();
15
+ * ```
16
+ */
17
+ const api_js_1 = require("./core/api.js");
18
+ const auth_js_1 = require("./core/auth.js");
19
+ const http_js_1 = require("./core/http.js");
20
+ const push_js_1 = require("./core/push.js");
21
+ const runtime_js_1 = require("./core/runtime.js");
22
+ const router_js_1 = require("./core/router.js");
23
+ const storage_js_1 = require("./core/storage.js");
24
+ class ElectricOpenPlatformClient {
25
+ constructor() {
26
+ this.credentials = {};
27
+ }
28
+ /**
29
+ * Configures the SDK. Safe to call again (e.g. after the user switches
30
+ * project) — previous timers are released and tokens for the old `appKey` are
31
+ * left untouched on disk.
32
+ */
33
+ async configure(config) {
34
+ assertConfig(config);
35
+ this.dispose();
36
+ this.config = config;
37
+ this.credentials = { username: config.username, password: config.password };
38
+ // 存储:config.store(自定义后端,最高)> config.storage 指定的内置后端
39
+ const backend = await (0, storage_js_1.resolveBackend)(config.storage ?? 'auto', config.store);
40
+ this.backend = backend;
41
+ const store = new storage_js_1.TokenStore(backend, config.appKey);
42
+ const auth = new auth_js_1.AuthManager(store, config);
43
+ const router = new router_js_1.RouterClient(config, auth, () => this.credentials);
44
+ // 传输:config.transport(最高)> 调用方 setTransport 注入的实现 > 内置 fetch
45
+ (0, http_js_1.setTransport)((0, http_js_1.resolveTransport)(config.transport, (0, http_js_1.hasExplicitTransport)() ? (0, http_js_1.currentTransport)() : undefined));
46
+ this.auth = auth;
47
+ this.router = router;
48
+ this.project = new api_js_1.ProjectApi(router);
49
+ this.box = new api_js_1.BoxApi(router);
50
+ this.channel = new api_js_1.ChannelApi(router);
51
+ this.control = new api_js_1.ControlApi(router);
52
+ this.alarm = new api_js_1.AlarmApi(router);
53
+ this.stats = new api_js_1.StatsApi(router);
54
+ this.scene = new api_js_1.SceneApi(router);
55
+ this.push = new push_js_1.PushApi(router);
56
+ this.thirdparty = new api_js_1.ThirdPartyDeviceApi(router);
57
+ await auth.restore();
58
+ }
59
+ /** True once `configure()` succeeded. */
60
+ get isConfigured() {
61
+ return !!this.router;
62
+ }
63
+ /** Where tokens are persisted — useful on a diagnostics screen. */
64
+ async storageBackend() {
65
+ return this.backend?.name ?? 'none';
66
+ }
67
+ // --------------------------------------------------------------------- auth
68
+ /** Headless login with the platform account (POST /oauth/authverify2.as). */
69
+ async login(username, password) {
70
+ const auth = this.requireAuth();
71
+ this.credentials = { username, password };
72
+ const code = await auth.fetchCode({ username, password });
73
+ const tokens = await auth.exchangeCode(code);
74
+ return { success: true, code, expiresIn: secondsUntil(tokens.expiresAt), expiresAt: tokens.expiresAt };
75
+ }
76
+ /** Redirect-flow: the URL to open in a browser for the platform's login page. */
77
+ getAuthorizeUrl(options = {}) {
78
+ return this.requireAuth().getAuthorizeUrl(options);
79
+ }
80
+ /**
81
+ * Redirect-flow step 2: pass the full redirect URL (or the bare code) received
82
+ * by your `redirectUri` endpoint.
83
+ */
84
+ async handleRedirect(urlOrCode) {
85
+ const auth = this.requireAuth();
86
+ const code = auth_js_1.AuthManager.extractCode(urlOrCode) ?? urlOrCode;
87
+ return auth.exchangeCode(code);
88
+ }
89
+ /** Renews the token now instead of waiting for the timer. */
90
+ async refreshToken() {
91
+ return this.requireAuth().refresh();
92
+ }
93
+ get currentToken() {
94
+ return this.auth?.current ?? null;
95
+ }
96
+ async logout() {
97
+ this.credentials = {};
98
+ this.config = this.config ? { ...this.config, username: undefined, password: undefined } : this.config;
99
+ await this.auth?.logout();
100
+ }
101
+ /**
102
+ * Escape hatch for platform methods that are not (yet) wrapped, e.g. new
103
+ * `GET_*` endpoints added after this release. Signs, retries and unwraps for
104
+ * you, so prefer it over hand-rolling `fetch`.
105
+ */
106
+ async invoke(method, params = {}) {
107
+ return this.requireRouter().call(method, { params });
108
+ }
109
+ /** Current configuration with the secret masked. */
110
+ describe() {
111
+ const c = this.config;
112
+ if (!c)
113
+ return { configured: false };
114
+ return {
115
+ configured: true,
116
+ appKey: c.appKey,
117
+ appSecret: c.appSecret ? `****${c.appSecret.slice(-4)}` : '',
118
+ redirectUri: c.redirectUri,
119
+ baseUrl: c.baseUrl ?? 'https://open.snd02.com',
120
+ projectCode: c.projectCode,
121
+ storage: c.storage ?? 'auto',
122
+ /** 实际生效的存储后端名(内置 memory/localStorage,或自定义 store 的 name) */
123
+ storageBackend: this.backend?.name ?? 'none',
124
+ /** 运行宿主:node / browser / unknown(仅诊断用,不参与能力选择) */
125
+ runtime: (0, runtime_js_1.detectRuntime)(),
126
+ /** 实际生效的网络传输实现 */
127
+ transport: (0, http_js_1.currentTransportName)(),
128
+ token: this.auth?.current
129
+ ? { ...this.auth.current, accessToken: mask(this.auth.current.accessToken) }
130
+ : null,
131
+ };
132
+ }
133
+ /** Releases timers; call from `ngOnDestroy` / `useEffect` cleanup. */
134
+ dispose() {
135
+ this.auth?.dispose();
136
+ this.auth = undefined;
137
+ this.router = undefined;
138
+ }
139
+ requireAuth() {
140
+ if (!this.auth)
141
+ throw new Error('SDK 尚未初始化,请先调用 configure({ appKey, appSecret, redirectUri })');
142
+ return this.auth;
143
+ }
144
+ requireRouter() {
145
+ if (!this.router)
146
+ throw new Error('SDK 尚未初始化,请先调用 configure()');
147
+ return this.router;
148
+ }
149
+ }
150
+ exports.ElectricOpenPlatformClient = ElectricOpenPlatformClient;
151
+ function assertConfig(config) {
152
+ const missing = [];
153
+ if (!config.appKey)
154
+ missing.push('appKey');
155
+ if (!config.appSecret)
156
+ missing.push('appSecret');
157
+ if (!config.redirectUri)
158
+ missing.push('redirectUri');
159
+ if (missing.length)
160
+ throw new Error(`缺少必填配置:${missing.join(', ')}`);
161
+ if (config.redirectUri && !/^https?:\/\//i.test(config.redirectUri)) {
162
+ throw new Error('redirectUri 必须是 http(s) 绝对地址(会参与签名,需与平台登记一致)');
163
+ }
164
+ }
165
+ function secondsUntil(epochMs) {
166
+ return Math.max(0, Math.round((epochMs - Date.now()) / 1000));
167
+ }
168
+ function mask(token) {
169
+ return token.length <= 8 ? '****' : `${token.slice(0, 6)}…${token.slice(-4)}`;
170
+ }
171
+ /** Default singleton instance. Also exported as the named `ElectricOpenPlatform`. */
172
+ exports.ElectricOpenPlatform = new ElectricOpenPlatformClient();
173
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}