@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,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFetchTransport = exports.DEFAULT_TIMEOUT_MS = exports.assertHttpOk = exports.parseBody = void 0;
4
+ exports.currentTransportName = currentTransportName;
5
+ exports.currentTransport = currentTransport;
6
+ exports.hasExplicitTransport = hasExplicitTransport;
7
+ exports.setTransport = setTransport;
8
+ exports.resetTransport = resetTransport;
9
+ exports.resolveTransport = resolveTransport;
10
+ exports.postForm = postForm;
11
+ /**
12
+ * 当前传输实现的注册表 + `postForm` 兼容入口。
13
+ *
14
+ * 历史上所有调用都走 `postForm`,现在它转发到「当前选定的 Transport」。
15
+ * 这样:
16
+ * - 既有调用点与测试无需改动;
17
+ * - 传输实现由使用方通过 `config.transport` / `setTransport()` 注入;
18
+ * - 未注入时一律用内置 `fetch`,不按宿主环境猜。
19
+ */
20
+ const errors_js_1 = require("./errors.js");
21
+ const transport_fetch_js_1 = require("./transport-fetch.js");
22
+ var transport_js_1 = require("./transport.js");
23
+ Object.defineProperty(exports, "parseBody", { enumerable: true, get: function () { return transport_js_1.parseBody; } });
24
+ Object.defineProperty(exports, "assertHttpOk", { enumerable: true, get: function () { return transport_js_1.assertHttpOk; } });
25
+ Object.defineProperty(exports, "DEFAULT_TIMEOUT_MS", { enumerable: true, get: function () { return transport_js_1.DEFAULT_TIMEOUT_MS; } });
26
+ var transport_fetch_js_2 = require("./transport-fetch.js");
27
+ Object.defineProperty(exports, "createFetchTransport", { enumerable: true, get: function () { return transport_fetch_js_2.createFetchTransport; } });
28
+ let current = (0, transport_fetch_js_1.createFetchTransport)();
29
+ /** 是否由调用方显式 setTransport 指定过(区别于默认的 fetch)。 */
30
+ let explicit = false;
31
+ /** 当前实际使用的传输实现名称,供诊断使用。 */
32
+ function currentTransportName() {
33
+ return current.name;
34
+ }
35
+ /** 当前传输实现的引用。 */
36
+ function currentTransport() {
37
+ return current;
38
+ }
39
+ /** 调用方是否显式设置过传输实现。 */
40
+ function hasExplicitTransport() {
41
+ return explicit;
42
+ }
43
+ /** 替换传输实现(插件在 configure 时按 config.transport / 已注入的实现决定)。 */
44
+ function setTransport(transport) {
45
+ current = transport;
46
+ explicit = true;
47
+ }
48
+ /** 恢复默认的 fetch 实现(测试用)。 */
49
+ function resetTransport() {
50
+ current = (0, transport_fetch_js_1.createFetchTransport)();
51
+ explicit = false;
52
+ }
53
+ /**
54
+ * 按优先级挑选传输实现:
55
+ * `config.transport`(最高)> configure() 之前 setTransport 注入的实现 > 内置 fetch。
56
+ *
57
+ * 这里**不做任何宿主探测**:同一个包在 Node、浏览器、Electron 里行为一致,
58
+ * 差异只来自使用方显式注入的实现。
59
+ */
60
+ function resolveTransport(explicitTransport, preset) {
61
+ return explicitTransport ?? preset ?? (0, transport_fetch_js_1.createFetchTransport)();
62
+ }
63
+ /** 用当前传输发送一次 form-urlencoded POST。 */
64
+ function postForm(req) {
65
+ if (!current) {
66
+ return Promise.reject(new errors_js_1.ElectricOpenPlatformError(errors_js_1.TransportCodes.NETWORK, '未配置网络传输实现'));
67
+ }
68
+ return current.postForm(req);
69
+ }
70
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":";;;AAsBA,oDAEC;AAGD,4CAEC;AAGD,oDAEC;AAGD,oCAGC;AAGD,wCAGC;AASD,4CAEC;AAGD,4BAOC;AAnED;;;;;;;;GAQG;AACH,2CAAwE;AAExE,6DAA4D;AAG5D,+CAA6E;AAApE,yGAAA,SAAS,OAAA;AAAE,4GAAA,YAAY,OAAA;AAAE,kHAAA,kBAAkB,OAAA;AACpD,2DAA4D;AAAnD,0HAAA,oBAAoB,OAAA;AAE7B,IAAI,OAAO,GAAc,IAAA,yCAAoB,GAAE,CAAC;AAChD,+CAA+C;AAC/C,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,2BAA2B;AAC3B,SAAgB,oBAAoB;IAClC,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,iBAAiB;AACjB,SAAgB,gBAAgB;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sBAAsB;AACtB,SAAgB,oBAAoB;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4DAA4D;AAC5D,SAAgB,YAAY,CAAC,SAAoB;IAC/C,OAAO,GAAG,SAAS,CAAC;IACpB,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,2BAA2B;AAC3B,SAAgB,cAAc;IAC5B,OAAO,GAAG,IAAA,yCAAoB,GAAE,CAAC;IACjC,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,iBAA6B,EAAE,MAAkB;IAChF,OAAO,iBAAiB,IAAI,MAAM,IAAI,IAAA,yCAAoB,GAAE,CAAC;AAC/D,CAAC;AAED,sCAAsC;AACtC,SAAgB,QAAQ,CAAC,GAAgB;IACvC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,qCAAyB,CAAC,0BAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CACnE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * Typed models for the open platform's `data` payloads.
4
+ *
5
+ * Field names mirror the wire format exactly (including the odd ones such as
6
+ * `aTUp` or `mxgl`) so that mapping mistakes are caught at compile time rather
7
+ * than surfacing as `undefined` in the UI.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.MeterQueryType = exports.ThirdPartyEquipmentType = exports.PushType = exports.AlarmType = exports.EquipmentType = void 0;
11
+ /** 设备类型 */
12
+ var EquipmentType;
13
+ (function (EquipmentType) {
14
+ EquipmentType[EquipmentType["MicroBreaker"] = 1] = "MicroBreaker";
15
+ EquipmentType[EquipmentType["ElectricalFire"] = 2] = "ElectricalFire";
16
+ EquipmentType[EquipmentType["LiquidLevel"] = 4] = "LiquidLevel";
17
+ EquipmentType[EquipmentType["Pressure"] = 5] = "Pressure";
18
+ EquipmentType[EquipmentType["SmokeForSafe"] = 6] = "SmokeForSafe";
19
+ EquipmentType[EquipmentType["GasForSafe"] = 7] = "GasForSafe";
20
+ EquipmentType[EquipmentType["SmokeZac"] = 10] = "SmokeZac";
21
+ EquipmentType[EquipmentType["TempHumidity"] = 11] = "TempHumidity";
22
+ EquipmentType[EquipmentType["SmartMeter"] = 12] = "SmartMeter";
23
+ EquipmentType[EquipmentType["GasZac"] = 13] = "GasZac";
24
+ EquipmentType[EquipmentType["Lux"] = 14] = "Lux";
25
+ EquipmentType[EquipmentType["SmartWaterMeter"] = 16] = "SmartWaterMeter";
26
+ EquipmentType[EquipmentType["SmokeWanlin"] = 29] = "SmokeWanlin";
27
+ EquipmentType[EquipmentType["TempWanlin"] = 39] = "TempWanlin";
28
+ EquipmentType[EquipmentType["SmokeHaiman"] = 42] = "SmokeHaiman";
29
+ EquipmentType[EquipmentType["GasHaiman"] = 45] = "GasHaiman";
30
+ })(EquipmentType || (exports.EquipmentType = EquipmentType = {}));
31
+ exports.AlarmType = {
32
+ ShortCircuit: 1,
33
+ LeakageMonitor: 2,
34
+ Overload: 3,
35
+ Overcurrent: 4,
36
+ Overvoltage: 5,
37
+ Undervoltage: 6,
38
+ Temperature: 7,
39
+ Surge: 8,
40
+ LeakageProtectOk: 9,
41
+ LeakageSelfTestIncomplete: 10,
42
+ Arc: 11,
43
+ LeakageWarning: 12,
44
+ CurrentWarning: 13,
45
+ OvervoltageWarning: 14,
46
+ UndervoltageWarning: 15,
47
+ CommWarning: 16,
48
+ PhaseLoss: 17,
49
+ ThreePhaseUnbalance: 18,
50
+ ThreePhaseSequence: 19,
51
+ PowerLoss: 53,
52
+ BoxOpen: 54,
53
+ TemperatureWarning: 55,
54
+ Humidity: 56,
55
+ Input: 57,
56
+ PowerNormal: 58,
57
+ MalignantLoad: 62,
58
+ Config: 1001,
59
+ Offline: 1002,
60
+ SwitchOffNotice: 1003,
61
+ SwitchOnNotice: 1004,
62
+ AbnormalOpen: 1005,
63
+ LeakageProtection: 1016,
64
+ Smoke: 2002,
65
+ Gas: 2006,
66
+ Pressure: 2003,
67
+ LiquidLevel: 2004,
68
+ DeviceFault: 9000,
69
+ CommFault: 9001,
70
+ };
71
+ /** Push type 1=告警 2=节点状态 3=事件通知 */
72
+ var PushType;
73
+ (function (PushType) {
74
+ PushType[PushType["Alarm"] = 1] = "Alarm";
75
+ PushType[PushType["ChannelStatus"] = 2] = "ChannelStatus";
76
+ PushType[PushType["Event"] = 3] = "Event";
77
+ })(PushType || (exports.PushType = PushType = {}));
78
+ /**
79
+ * 第三方设备类型(GET_THR_DEVICE_STATUS 的 equipmentType)。
80
+ * 注意:这些是「非微断」设备,微断(1)/电气火灾(2) 不走这个接口。
81
+ */
82
+ var ThirdPartyEquipmentType;
83
+ (function (ThirdPartyEquipmentType) {
84
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["LiquidLevel"] = 4] = "LiquidLevel";
85
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["Pressure"] = 5] = "Pressure";
86
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["SmokeForSafe"] = 6] = "SmokeForSafe";
87
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["GasForSafe"] = 7] = "GasForSafe";
88
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["SmokeZac"] = 10] = "SmokeZac";
89
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["TempHumidity"] = 11] = "TempHumidity";
90
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["SmartMeter"] = 12] = "SmartMeter";
91
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["GasZac"] = 13] = "GasZac";
92
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["Lux"] = 14] = "Lux";
93
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["SmartWaterMeter"] = 16] = "SmartWaterMeter";
94
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["SmokeWanlin"] = 29] = "SmokeWanlin";
95
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["TempWanlin"] = 39] = "TempWanlin";
96
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["SmokeHaiman"] = 42] = "SmokeHaiman";
97
+ ThirdPartyEquipmentType[ThirdPartyEquipmentType["GasHaiman"] = 45] = "GasHaiman";
98
+ })(ThirdPartyEquipmentType || (exports.ThirdPartyEquipmentType = ThirdPartyEquipmentType = {}));
99
+ /** 智能水表(CHaobiamao) 查询模式:0=实时抄表,1=时间范围 */
100
+ var MeterQueryType;
101
+ (function (MeterQueryType) {
102
+ MeterQueryType[MeterQueryType["Realtime"] = 0] = "Realtime";
103
+ MeterQueryType[MeterQueryType["Range"] = 1] = "Range";
104
+ })(MeterQueryType || (exports.MeterQueryType = MeterQueryType = {}));
105
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/core/models.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,WAAW;AACX,IAAY,aAiBX;AAjBD,WAAY,aAAa;IACvB,iEAAgB,CAAA;IAChB,qEAAkB,CAAA;IAClB,+DAAe,CAAA;IACf,yDAAY,CAAA;IACZ,iEAAgB,CAAA;IAChB,6DAAc,CAAA;IACd,0DAAa,CAAA;IACb,kEAAiB,CAAA;IACjB,8DAAe,CAAA;IACf,sDAAW,CAAA;IACX,gDAAQ,CAAA;IACR,wEAAoB,CAAA;IACpB,gEAAgB,CAAA;IAChB,8DAAe,CAAA;IACf,gEAAgB,CAAA;IAChB,4DAAc,CAAA;AAChB,CAAC,EAjBW,aAAa,6BAAb,aAAa,QAiBxB;AAmLY,QAAA,SAAS,GAAG;IACvB,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,CAAC;IACjB,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;IACd,KAAK,EAAE,CAAC;IACR,gBAAgB,EAAE,CAAC;IACnB,yBAAyB,EAAE,EAAE;IAC7B,GAAG,EAAE,EAAE;IACP,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,EAAE;IAClB,kBAAkB,EAAE,EAAE;IACtB,mBAAmB,EAAE,EAAE;IACvB,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,mBAAmB,EAAE,EAAE;IACvB,kBAAkB,EAAE,EAAE;IACtB,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,kBAAkB,EAAE,EAAE;IACtB,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,EAAE;IACf,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,IAAI;IAClB,iBAAiB,EAAE,IAAI;IACvB,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,IAAI;IACT,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,IAAI;CACP,CAAC;AA8GX,mCAAmC;AACnC,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,yDAAiB,CAAA;IACjB,yCAAS,CAAA;AACX,CAAC,EAJW,QAAQ,wBAAR,QAAQ,QAInB;AAED;;;GAGG;AACH,IAAY,uBAeX;AAfD,WAAY,uBAAuB;IACjC,mFAAe,CAAA;IACf,6EAAY,CAAA;IACZ,qFAAgB,CAAA;IAChB,iFAAc,CAAA;IACd,8EAAa,CAAA;IACb,sFAAiB,CAAA;IACjB,kFAAe,CAAA;IACf,0EAAW,CAAA;IACX,oEAAQ,CAAA;IACR,4FAAoB,CAAA;IACpB,oFAAgB,CAAA;IAChB,kFAAe,CAAA;IACf,oFAAgB,CAAA;IAChB,gFAAc,CAAA;AAChB,CAAC,EAfW,uBAAuB,uCAAvB,uBAAuB,QAelC;AAmBD,0CAA0C;AAC1C,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,2DAAY,CAAA;IACZ,qDAAS,CAAA;AACX,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PushApi = void 0;
4
+ exports.verifyPushKey = verifyPushKey;
5
+ const crypto_js_1 = require("./crypto.js");
6
+ const models_js_1 = require("./models.js");
7
+ /**
8
+ * 消息推送订阅管理 SUBSCRIBE_PUSH_SERVICE.
9
+ *
10
+ * Note this is *server → your backend* push, not a WebSocket to the app. On a
11
+ * mobile app you normally keep using polling (or run the receiver on your own
12
+ * backend and relay via your own channel); the helpers here exist so an app can
13
+ * configure/inspect the subscription from a settings screen.
14
+ */
15
+ class PushApi {
16
+ constructor(client) {
17
+ this.client = client;
18
+ }
19
+ call(cmd, params = {}) {
20
+ return this.client.call('SUBSCRIBE_PUSH_SERVICE', { params: { cmd, ...params } });
21
+ }
22
+ /** QUERY — inspect the current subscription for a push type. */
23
+ query(pushType) {
24
+ return this.call('QUERY', { pushType });
25
+ }
26
+ /**
27
+ * SUBSCRIBE — also used to modify (same pushType replaces the previous one).
28
+ * IMPORTANT: the platform immediately POSTs a `detect` probe to `url` and
29
+ * fails the call ("url请求错误") unless your endpoint answers `{code:0, msg:<detect>}`.
30
+ */
31
+ subscribe(args) {
32
+ const typeNumbers = Array.isArray(args.typeNumbers)
33
+ ? args.typeNumbers.join(',')
34
+ : (args.typeNumbers ?? (args.pushType === models_js_1.PushType.Alarm ? '-1' : '0'));
35
+ return this.call('SUBSCRIBE', {
36
+ pushType: args.pushType,
37
+ url: args.url,
38
+ salt: args.salt,
39
+ timeRanges: args.timeRanges,
40
+ projectCode: args.projectCode ?? '*',
41
+ pushEnable: args.pushEnable,
42
+ typeNumbers,
43
+ pushMode: args.pushMode,
44
+ equipmentTypes: Array.isArray(args.equipmentTypes)
45
+ ? args.equipmentTypes.join(',')
46
+ : args.equipmentTypes,
47
+ });
48
+ }
49
+ unsubscribe(projectCode = '*') {
50
+ return this.call('UNSUBSCRIBE', { projectCode });
51
+ }
52
+ /** FAILED_CHECK — is the endpoint still healthy? */
53
+ failedCheck(pushType) {
54
+ return this.call('FAILED_CHECK', { pushType });
55
+ }
56
+ /** FAILED_RESET — re-enable pushing after the platform auto-disabled it. */
57
+ failedReset(pushType, pushEnable = 1) {
58
+ return this.call('FAILED_RESET', { pushType, pushEnable });
59
+ }
60
+ }
61
+ exports.PushApi = PushApi;
62
+ /**
63
+ * Verifies an inbound push against the documented `key` scheme, for use in the
64
+ * backend endpoint you register via {@link PushApi.subscribe}.
65
+ *
66
+ * `key = md5(salt + dateTime)` where dateTime is the alarm date (`yyyy-MM-dd`);
67
+ * in batch mode (`pushMode: "1"`) the platform uses today's date instead.
68
+ */
69
+ function verifyPushKey(args) {
70
+ const day = args.batch ? formatDay(args.now ?? new Date()) : (args.dateTime ?? '').slice(0, 10);
71
+ if (!day)
72
+ return false;
73
+ return (0, crypto_js_1.md5)(args.salt + day) === args.key.toLowerCase();
74
+ }
75
+ function formatDay(d) {
76
+ const pad = (n) => String(n).padStart(2, '0');
77
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
78
+ }
79
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/core/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterClient = void 0;
4
+ const errors_js_1 = require("./errors.js");
5
+ const http_js_1 = require("./http.js");
6
+ const sign_js_1 = require("./sign.js");
7
+ const types_js_1 = require("./types.js");
8
+ const ROUTER_PATH = '/invoke/router.as';
9
+ /** Params controlled by the client — rejected in the caller's `params`. */
10
+ const RESERVED_PARAMS = new Set(['client_id', 'method', 'access_token', 'timestamp', 'sign']);
11
+ class RouterClient {
12
+ constructor(config, auth, credentials) {
13
+ /** Once any signed call succeeds we can attribute 签名 errors to provisioning. */
14
+ this.hasAnySuccess = false;
15
+ this.auth = auth;
16
+ this.logger = config.logger;
17
+ this.credentials = credentials;
18
+ this.config = {
19
+ appKey: config.appKey,
20
+ appSecret: config.appSecret,
21
+ baseUrl: (config.baseUrl ?? types_js_1.DEFAULT_BASE_URL).replace(/\/+$/, ''),
22
+ timeoutMs: config.timeoutMs ?? 20000,
23
+ projectCode: config.projectCode,
24
+ };
25
+ }
26
+ /**
27
+ * Calls one platform method and returns its `data` payload.
28
+ *
29
+ * @throws ElectricOpenPlatformError for transport failures and non-zero codes.
30
+ */
31
+ async call(method, options = {}) {
32
+ const params = { ...(options.params ?? {}) };
33
+ for (const key of Object.keys(params)) {
34
+ if (RESERVED_PARAMS.has(key)) {
35
+ throw new errors_js_1.ElectricOpenPlatformError(errors_js_1.TransportCodes.INVALID_ARGUMENT, `参数 ${key} 由插件自动生成,请勿手动传入`, { method });
36
+ }
37
+ }
38
+ const projectCode = options.projectCode ?? this.config.projectCode;
39
+ if (projectCode !== undefined && params.projectCode === undefined) {
40
+ params.projectCode = projectCode;
41
+ }
42
+ const accessToken = await this.auth.getAccessToken(this.credentials());
43
+ const { body, params: signed } = (0, sign_js_1.buildSignedRequest)({
44
+ appKey: this.config.appKey,
45
+ appSecret: this.config.appSecret,
46
+ method,
47
+ accessToken,
48
+ params,
49
+ });
50
+ this.emit('request', method, {
51
+ timestamp: signed.timestamp,
52
+ params: redact(signed),
53
+ });
54
+ const res = await (0, http_js_1.postForm)({
55
+ url: `${this.config.baseUrl}${ROUTER_PATH}`,
56
+ body,
57
+ timeoutMs: options.timeoutMs ?? this.config.timeoutMs,
58
+ signal: options.signal,
59
+ });
60
+ const envelope = res.data;
61
+ if (!envelope || typeof envelope !== 'object') {
62
+ throw new errors_js_1.ElectricOpenPlatformError(errors_js_1.TransportCodes.PARSE, '接口返回格式异常(非 JSON 对象)', { method, details: res.raw });
63
+ }
64
+ const code = String(envelope.code ?? errors_js_1.PlatformCodes.FAILED);
65
+ if (code === errors_js_1.PlatformCodes.OK) {
66
+ this.hasAnySuccess = true;
67
+ this.emit('response', method, { code, success: envelope.success });
68
+ return envelope.data;
69
+ }
70
+ // Token expired / session gone: renew once, then retry the same request.
71
+ if ((code === errors_js_1.PlatformCodes.TOKEN_EXPIRED || code === errors_js_1.PlatformCodes.NOT_LOGGED_IN) && !options._retried) {
72
+ this.emit('error', method, { code, message: 'accessToken 失效,正在刷新后重试' });
73
+ await this.renewToken(code);
74
+ return this.call(method, { ...options, _retried: true });
75
+ }
76
+ const err = new errors_js_1.ElectricOpenPlatformError(code, envelope.message, {
77
+ method,
78
+ details: res.data,
79
+ });
80
+ this.emit('error', method, { code, message: envelope.message });
81
+ if (envelope.message && /限额|超过.*次数|quota/i.test(envelope.message)) {
82
+ throw new errors_js_1.ElectricOpenPlatformError(errors_js_1.TransportCodes.QUOTA, envelope.message, {
83
+ method,
84
+ details: res.data,
85
+ });
86
+ }
87
+ // The platform signals "method not enabled for this appKey" with either
88
+ // "接口名称(X)无效!" or — misleadingly — "无效的接口方法参数签名!".
89
+ // We can only be sure it is a provisioning problem (and not a signing bug)
90
+ // when another call with the same key has already succeeded this session.
91
+ const notProvisionedHint = /接口方法参数签名/.test(envelope.message ?? '') ||
92
+ /接口名称\(.*\)无效/.test(envelope.message ?? '');
93
+ if (notProvisionedHint && this.hasAnySuccess) {
94
+ throw new errors_js_1.ElectricOpenPlatformError(errors_js_1.TransportCodes.NOT_PROVISIONED, `接口 ${method} 未对当前 appKey 开通(平台提示:${envelope.message})。请联系平台商务开通该接口权限。`, { method, details: res.data });
95
+ }
96
+ throw err;
97
+ }
98
+ /** Convenience: call a method that returns a paginated `data` object. */
99
+ async callPaged(method, options = {}) {
100
+ return this.call(method, options);
101
+ }
102
+ async renewToken(code) {
103
+ this.emit('token', 'router', { reason: `code=${code}` });
104
+ await this.auth.recover(this.credentials());
105
+ }
106
+ emit(type, method, detail) {
107
+ this.logger?.({ type, method, detail, message: `${type} ${method}`, at: new Date().toISOString() });
108
+ }
109
+ }
110
+ exports.RouterClient = RouterClient;
111
+ /** Strips secrets from a logged params object. */
112
+ function redact(params) {
113
+ const copy = { ...params };
114
+ if (copy.sign)
115
+ copy.sign = `${copy.sign.slice(0, 6)}…`;
116
+ if (copy.access_token)
117
+ copy.access_token = `${copy.access_token.slice(0, 6)}…`;
118
+ if (copy.passwd)
119
+ copy.passwd = '***';
120
+ if (copy.client_secret)
121
+ copy.client_secret = `${copy.client_secret.slice(0, 6)}…`;
122
+ return copy;
123
+ }
124
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/core/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * 运行时探测 —— **只用于诊断输出,不参与任何能力选择**。
4
+ *
5
+ * 旧版本会按宿主环境自动装配三套传输实现(原生 HTTP / 原生桥 / fetch),
6
+ * 那是本包与 Capacitor、Cordova 耦合的唯一来源。现在传输实现只来自:
7
+ *
8
+ * 1. `configure({ transport })` 显式指定
9
+ * 2. `configure()` 之前用 `setTransport()` 注入
10
+ * 3. 默认 {@link createFetchTransport}
11
+ *
12
+ * 也就是说:**同一个包在 Node、浏览器、Electron、小程序容器里行为完全一致**,
13
+ * 差异只由使用方注入的 transport / store 决定,而不是由运行时的全局对象猜出来。
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.detectRuntime = detectRuntime;
17
+ exports.hasGlobalFetch = hasGlobalFetch;
18
+ /**
19
+ * 判断当前运行时,不抛错。
20
+ *
21
+ * Electron 渲染进程同时有 `window` 与 `process.versions.node`,这里归为 `browser`
22
+ * (它的网络能力仍然受 WebView 同源策略限制);主进程归为 `node`。
23
+ */
24
+ function detectRuntime() {
25
+ const g = globalThis;
26
+ const hasWindow = typeof g.window !== 'undefined' && typeof g.document !== 'undefined';
27
+ if (hasWindow)
28
+ return 'browser';
29
+ if (typeof g.process?.versions?.node === 'string')
30
+ return 'node';
31
+ return 'unknown';
32
+ }
33
+ /** 当前运行时是否有可用的全局 `fetch`(Node ≥ 18 / 现代浏览器都有)。 */
34
+ function hasGlobalFetch() {
35
+ return typeof globalThis.fetch === 'function';
36
+ }
37
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/runtime.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAUH,sCAUC;AAGD,wCAEC;AArBD;;;;;GAKG;AACH,SAAgB,aAAa;IAC3B,MAAM,CAAC,GAAG,UAIT,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC;IACvF,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IACjE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kDAAkD;AAClD,SAAgB,cAAc;IAC5B,OAAO,OAAQ,UAAkC,CAAC,KAAK,KAAK,UAAU,CAAC;AACzE,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.signParams = signParams;
4
+ exports.stringifyParam = stringifyParam;
5
+ exports.buildSignedRequest = buildSignedRequest;
6
+ exports.encodeForm = encodeForm;
7
+ exports.signAuthCodeSecret = signAuthCodeSecret;
8
+ exports.signRefreshSecret = signRefreshSecret;
9
+ const crypto_js_1 = require("./crypto.js");
10
+ /**
11
+ * Computes the platform `sign` parameter.
12
+ *
13
+ * Spec (apiCallDescription): take every parameter except `sign`, sort by
14
+ * parameter **name** ascending, concatenate the **values** in that order, then
15
+ * append `appSecret` and MD5 the resulting UTF-8 string.
16
+ *
17
+ * Two details that bite in practice and are handled here:
18
+ * - sorting is by key name, not by key=value pairs;
19
+ * - `null` / `undefined` params are dropped, but empty strings are kept
20
+ * (they are real values, e.g. an explicitly blank `room` filter).
21
+ */
22
+ function signParams({ params, appSecret }) {
23
+ const keys = Object.keys(params)
24
+ .filter((k) => k !== 'sign' && params[k] !== null && params[k] !== undefined)
25
+ .sort();
26
+ let raw = '';
27
+ for (const key of keys)
28
+ raw += stringifyParam(params[key]);
29
+ return (0, crypto_js_1.md5)(raw + appSecret);
30
+ }
31
+ function stringifyParam(value) {
32
+ if (value === null || value === undefined)
33
+ return '';
34
+ if (typeof value === 'boolean')
35
+ return value ? 'true' : 'false';
36
+ return String(value);
37
+ }
38
+ /**
39
+ * Builds the full, signed, form-urlencoded body for `POST /invoke/router.as`.
40
+ * `timestamp` is generated in local time as `yyyyMMddHHmmss` unless supplied.
41
+ */
42
+ function buildSignedRequest(args) {
43
+ const { appKey, appSecret, method, accessToken, params = {} } = args;
44
+ const timestamp = args.timestamp ?? (0, crypto_js_1.formatTimestamp)(args.now ?? new Date());
45
+ const merged = {
46
+ ...params,
47
+ client_id: appKey,
48
+ method,
49
+ access_token: accessToken,
50
+ timestamp,
51
+ };
52
+ const sign = signParams({ params: merged, appSecret });
53
+ const finalParams = { sign };
54
+ for (const [k, v] of Object.entries(merged)) {
55
+ if (v === null || v === undefined)
56
+ continue;
57
+ finalParams[k] = stringifyParam(v);
58
+ }
59
+ return { body: encodeForm(finalParams), params: finalParams, sign, timestamp };
60
+ }
61
+ /** `application/x-www-form-urlencoded` serializer matching Java/`querystring`. */
62
+ function encodeForm(params) {
63
+ return Object.keys(params)
64
+ .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)
65
+ .join('&');
66
+ }
67
+ /** OAuth2 `client_secret` for the token endpoint: MD5(appKey + grant + redirect + code + secret). */
68
+ function signAuthCodeSecret(args) {
69
+ return (0, crypto_js_1.md5)(`${args.appKey}authorization_code${args.redirectUri}${args.code}${args.appSecret}`);
70
+ }
71
+ /** OAuth2 `client_secret` for the refresh endpoint: MD5(appKey + grant + redirect + refreshToken + secret). */
72
+ function signRefreshSecret(args) {
73
+ return (0, crypto_js_1.md5)(`${args.appKey}refresh_token${args.redirectUri}${args.refreshToken}${args.appSecret}`);
74
+ }
75
+ //# sourceMappingURL=sign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign.js","sourceRoot":"","sources":["../../../src/core/sign.ts"],"names":[],"mappings":"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"}