@miaixz/sdk 0.5.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 (244) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +7 -0
  3. package/README.md +412 -0
  4. package/dist/api/client.d.ts +223 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +1069 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/endpoint.d.ts +10 -0
  9. package/dist/api/endpoint.d.ts.map +1 -0
  10. package/dist/api/endpoint.js +51 -0
  11. package/dist/api/endpoint.js.map +1 -0
  12. package/dist/api/errors.d.ts +180 -0
  13. package/dist/api/errors.d.ts.map +1 -0
  14. package/dist/api/errors.js +173 -0
  15. package/dist/api/errors.js.map +1 -0
  16. package/dist/api/index.d.ts +6 -0
  17. package/dist/api/index.d.ts.map +1 -0
  18. package/dist/api/index.js +5 -0
  19. package/dist/api/index.js.map +1 -0
  20. package/dist/api/request.d.ts +135 -0
  21. package/dist/api/request.d.ts.map +1 -0
  22. package/dist/api/request.js +2 -0
  23. package/dist/api/request.js.map +1 -0
  24. package/dist/api/response.d.ts +69 -0
  25. package/dist/api/response.d.ts.map +1 -0
  26. package/dist/api/response.js +43 -0
  27. package/dist/api/response.js.map +1 -0
  28. package/dist/api/telemetry.d.ts +139 -0
  29. package/dist/api/telemetry.d.ts.map +1 -0
  30. package/dist/api/telemetry.js +2 -0
  31. package/dist/api/telemetry.js.map +1 -0
  32. package/dist/appearance/appearance.d.ts +161 -0
  33. package/dist/appearance/appearance.d.ts.map +1 -0
  34. package/dist/appearance/appearance.js +614 -0
  35. package/dist/appearance/appearance.js.map +1 -0
  36. package/dist/appearance/index.d.ts +3 -0
  37. package/dist/appearance/index.d.ts.map +1 -0
  38. package/dist/appearance/index.js +3 -0
  39. package/dist/appearance/index.js.map +1 -0
  40. package/dist/auth/auth.d.ts +197 -0
  41. package/dist/auth/auth.d.ts.map +1 -0
  42. package/dist/auth/auth.js +314 -0
  43. package/dist/auth/auth.js.map +1 -0
  44. package/dist/auth/index.d.ts +2 -0
  45. package/dist/auth/index.d.ts.map +1 -0
  46. package/dist/auth/index.js +2 -0
  47. package/dist/auth/index.js.map +1 -0
  48. package/dist/config/config.d.ts +117 -0
  49. package/dist/config/config.d.ts.map +1 -0
  50. package/dist/config/config.js +241 -0
  51. package/dist/config/config.js.map +1 -0
  52. package/dist/config/index.d.ts +2 -0
  53. package/dist/config/index.d.ts.map +1 -0
  54. package/dist/config/index.js +2 -0
  55. package/dist/config/index.js.map +1 -0
  56. package/dist/consts/index.d.ts +35 -0
  57. package/dist/consts/index.d.ts.map +1 -0
  58. package/dist/consts/index.js +35 -0
  59. package/dist/consts/index.js.map +1 -0
  60. package/dist/context/context.d.ts +123 -0
  61. package/dist/context/context.d.ts.map +1 -0
  62. package/dist/context/context.js +252 -0
  63. package/dist/context/context.js.map +1 -0
  64. package/dist/context/index.d.ts +2 -0
  65. package/dist/context/index.d.ts.map +1 -0
  66. package/dist/context/index.js +2 -0
  67. package/dist/context/index.js.map +1 -0
  68. package/dist/contracts/host-context.d.ts +132 -0
  69. package/dist/contracts/host-context.d.ts.map +1 -0
  70. package/dist/contracts/host-context.js +2 -0
  71. package/dist/contracts/host-context.js.map +1 -0
  72. package/dist/contracts/index.d.ts +8 -0
  73. package/dist/contracts/index.d.ts.map +1 -0
  74. package/dist/contracts/index.js +2 -0
  75. package/dist/contracts/index.js.map +1 -0
  76. package/dist/contracts/lifecycle.d.ts +49 -0
  77. package/dist/contracts/lifecycle.d.ts.map +1 -0
  78. package/dist/contracts/lifecycle.js +2 -0
  79. package/dist/contracts/lifecycle.js.map +1 -0
  80. package/dist/contracts/module-manifest.d.ts +110 -0
  81. package/dist/contracts/module-manifest.d.ts.map +1 -0
  82. package/dist/contracts/module-manifest.js +317 -0
  83. package/dist/contracts/module-manifest.js.map +1 -0
  84. package/dist/contracts/navigation.d.ts +36 -0
  85. package/dist/contracts/navigation.d.ts.map +1 -0
  86. package/dist/contracts/navigation.js +11 -0
  87. package/dist/contracts/navigation.js.map +1 -0
  88. package/dist/contracts/permission.d.ts +8 -0
  89. package/dist/contracts/permission.d.ts.map +1 -0
  90. package/dist/contracts/permission.js +14 -0
  91. package/dist/contracts/permission.js.map +1 -0
  92. package/dist/contracts/post-message.d.ts +124 -0
  93. package/dist/contracts/post-message.d.ts.map +1 -0
  94. package/dist/contracts/post-message.js +2 -0
  95. package/dist/contracts/post-message.js.map +1 -0
  96. package/dist/contracts/route.d.ts +45 -0
  97. package/dist/contracts/route.d.ts.map +1 -0
  98. package/dist/contracts/route.js +35 -0
  99. package/dist/contracts/route.js.map +1 -0
  100. package/dist/events/events.d.ts +191 -0
  101. package/dist/events/events.d.ts.map +1 -0
  102. package/dist/events/events.js +486 -0
  103. package/dist/events/events.js.map +1 -0
  104. package/dist/events/index.d.ts +2 -0
  105. package/dist/events/index.d.ts.map +1 -0
  106. package/dist/events/index.js +2 -0
  107. package/dist/events/index.js.map +1 -0
  108. package/dist/files/files.d.ts +138 -0
  109. package/dist/files/files.d.ts.map +1 -0
  110. package/dist/files/files.js +144 -0
  111. package/dist/files/files.js.map +1 -0
  112. package/dist/files/index.d.ts +2 -0
  113. package/dist/files/index.d.ts.map +1 -0
  114. package/dist/files/index.js +2 -0
  115. package/dist/files/index.js.map +1 -0
  116. package/dist/formatters/index.d.ts +44 -0
  117. package/dist/formatters/index.d.ts.map +1 -0
  118. package/dist/formatters/index.js +50 -0
  119. package/dist/formatters/index.js.map +1 -0
  120. package/dist/i18n/default-translator.d.ts +17 -0
  121. package/dist/i18n/default-translator.d.ts.map +1 -0
  122. package/dist/i18n/default-translator.js +19 -0
  123. package/dist/i18n/default-translator.js.map +1 -0
  124. package/dist/i18n/i18n.d.ts +248 -0
  125. package/dist/i18n/i18n.d.ts.map +1 -0
  126. package/dist/i18n/i18n.js +617 -0
  127. package/dist/i18n/i18n.js.map +1 -0
  128. package/dist/i18n/index.d.ts +2 -0
  129. package/dist/i18n/index.d.ts.map +1 -0
  130. package/dist/i18n/index.js +2 -0
  131. package/dist/i18n/index.js.map +1 -0
  132. package/dist/index.d.ts +19 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +19 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/models/index.d.ts +2 -0
  137. package/dist/models/index.d.ts.map +1 -0
  138. package/dist/models/index.js +2 -0
  139. package/dist/models/index.js.map +1 -0
  140. package/dist/permissions/index.d.ts +2 -0
  141. package/dist/permissions/index.d.ts.map +1 -0
  142. package/dist/permissions/index.js +2 -0
  143. package/dist/permissions/index.js.map +1 -0
  144. package/dist/permissions/permissions.d.ts +67 -0
  145. package/dist/permissions/permissions.d.ts.map +1 -0
  146. package/dist/permissions/permissions.js +123 -0
  147. package/dist/permissions/permissions.js.map +1 -0
  148. package/dist/runtime/direct-host-bridge.d.ts +11 -0
  149. package/dist/runtime/direct-host-bridge.d.ts.map +1 -0
  150. package/dist/runtime/direct-host-bridge.js +299 -0
  151. package/dist/runtime/direct-host-bridge.js.map +1 -0
  152. package/dist/runtime/index.d.ts +5 -0
  153. package/dist/runtime/index.d.ts.map +1 -0
  154. package/dist/runtime/index.js +3 -0
  155. package/dist/runtime/index.js.map +1 -0
  156. package/dist/runtime/post-message-bridge.d.ts +20 -0
  157. package/dist/runtime/post-message-bridge.d.ts.map +1 -0
  158. package/dist/runtime/post-message-bridge.js +1115 -0
  159. package/dist/runtime/post-message-bridge.js.map +1 -0
  160. package/dist/sdk.d.ts +177 -0
  161. package/dist/sdk.d.ts.map +1 -0
  162. package/dist/sdk.js +214 -0
  163. package/dist/sdk.js.map +1 -0
  164. package/dist/storage/index.d.ts +2 -0
  165. package/dist/storage/index.d.ts.map +1 -0
  166. package/dist/storage/index.js +2 -0
  167. package/dist/storage/index.js.map +1 -0
  168. package/dist/storage/storage.d.ts +246 -0
  169. package/dist/storage/storage.d.ts.map +1 -0
  170. package/dist/storage/storage.js +358 -0
  171. package/dist/storage/storage.js.map +1 -0
  172. package/dist/types/api.d.ts +82 -0
  173. package/dist/types/api.d.ts.map +1 -0
  174. package/dist/types/api.js +2 -0
  175. package/dist/types/api.js.map +1 -0
  176. package/dist/types/appearance.d.ts +85 -0
  177. package/dist/types/appearance.d.ts.map +1 -0
  178. package/dist/types/appearance.js +48 -0
  179. package/dist/types/appearance.js.map +1 -0
  180. package/dist/types/config.d.ts +49 -0
  181. package/dist/types/config.d.ts.map +1 -0
  182. package/dist/types/config.js +2 -0
  183. package/dist/types/config.js.map +1 -0
  184. package/dist/types/context.d.ts +41 -0
  185. package/dist/types/context.d.ts.map +1 -0
  186. package/dist/types/context.js +2 -0
  187. package/dist/types/context.js.map +1 -0
  188. package/dist/types/file.d.ts +48 -0
  189. package/dist/types/file.d.ts.map +1 -0
  190. package/dist/types/file.js +2 -0
  191. package/dist/types/file.js.map +1 -0
  192. package/dist/types/index.d.ts +12 -0
  193. package/dist/types/index.d.ts.map +1 -0
  194. package/dist/types/index.js +12 -0
  195. package/dist/types/index.js.map +1 -0
  196. package/dist/types/organization.d.ts +56 -0
  197. package/dist/types/organization.d.ts.map +1 -0
  198. package/dist/types/organization.js +2 -0
  199. package/dist/types/organization.js.map +1 -0
  200. package/dist/types/pagination.d.ts +55 -0
  201. package/dist/types/pagination.d.ts.map +1 -0
  202. package/dist/types/pagination.js +13 -0
  203. package/dist/types/pagination.js.map +1 -0
  204. package/dist/types/permissions.d.ts +26 -0
  205. package/dist/types/permissions.d.ts.map +1 -0
  206. package/dist/types/permissions.js +2 -0
  207. package/dist/types/permissions.js.map +1 -0
  208. package/dist/types/space.d.ts +43 -0
  209. package/dist/types/space.d.ts.map +1 -0
  210. package/dist/types/space.js +2 -0
  211. package/dist/types/space.js.map +1 -0
  212. package/dist/types/tenant.d.ts +31 -0
  213. package/dist/types/tenant.d.ts.map +1 -0
  214. package/dist/types/tenant.js +2 -0
  215. package/dist/types/tenant.js.map +1 -0
  216. package/dist/types/user.d.ts +48 -0
  217. package/dist/types/user.d.ts.map +1 -0
  218. package/dist/types/user.js +2 -0
  219. package/dist/types/user.js.map +1 -0
  220. package/dist/utils/date.d.ts +9 -0
  221. package/dist/utils/date.d.ts.map +1 -0
  222. package/dist/utils/date.js +11 -0
  223. package/dist/utils/date.js.map +1 -0
  224. package/dist/utils/index.d.ts +5 -0
  225. package/dist/utils/index.d.ts.map +1 -0
  226. package/dist/utils/index.js +5 -0
  227. package/dist/utils/index.js.map +1 -0
  228. package/dist/utils/number.d.ts +11 -0
  229. package/dist/utils/number.d.ts.map +1 -0
  230. package/dist/utils/number.js +13 -0
  231. package/dist/utils/number.js.map +1 -0
  232. package/dist/utils/object.d.ts +9 -0
  233. package/dist/utils/object.d.ts.map +1 -0
  234. package/dist/utils/object.js +11 -0
  235. package/dist/utils/object.js.map +1 -0
  236. package/dist/utils/string.d.ts +9 -0
  237. package/dist/utils/string.d.ts.map +1 -0
  238. package/dist/utils/string.js +11 -0
  239. package/dist/utils/string.js.map +1 -0
  240. package/dist/validators/index.d.ts +8 -0
  241. package/dist/validators/index.d.ts.map +1 -0
  242. package/dist/validators/index.js +8 -0
  243. package/dist/validators/index.js.map +1 -0
  244. package/package.json +156 -0
@@ -0,0 +1,299 @@
1
+ import { MiaixzSdkError } from "../api/errors.js";
2
+ import { MIAIXZ_MODULE_PROTOCOL_VERSION, } from "../contracts/index.js";
3
+ import { isMiaixzModulePermission } from "../contracts/permission.js";
4
+ import { translateMiaixzDefaultMessage } from "../i18n/default-translator.js";
5
+ const moduleIdentifierPattern = /^[a-z][a-z0-9-]{1,63}$/;
6
+ /**
7
+ * Creates a localized Direct Bridge error without including caller-owned data.
8
+ *
9
+ * @param code - Stable Bridge error code.
10
+ * @param messageKey - Registered internationalization message key.
11
+ * @returns Localized SDK error.
12
+ */
13
+ function createBridgeError(code, messageKey) {
14
+ return new MiaixzSdkError(translateMiaixzDefaultMessage(messageKey), { code });
15
+ }
16
+ /**
17
+ * Determines whether a value is a plain record without a custom prototype.
18
+ *
19
+ * @param value - Runtime value to inspect.
20
+ * @returns Whether the value is a plain record.
21
+ */
22
+ function isPlainRecord(value) {
23
+ if (typeof value !== "object" || value === null || Array.isArray(value))
24
+ return false;
25
+ const prototype = Object.getPrototypeOf(value);
26
+ return prototype === Object.prototype || prototype === null;
27
+ }
28
+ /**
29
+ * Determines whether a record contains only the supplied keys.
30
+ *
31
+ * @param value - Record whose keys should be inspected.
32
+ * @param allowedKeys - Complete set of allowed keys.
33
+ * @returns Whether every enumerable own key is allowed.
34
+ */
35
+ function hasOnlyKeys(value, allowedKeys) {
36
+ return Object.keys(value).every((key) => allowedKeys.has(key));
37
+ }
38
+ /**
39
+ * Validates one module identifier before creating a bridge.
40
+ *
41
+ * @param moduleId - Module identifier to validate.
42
+ * @returns The unchanged valid identifier.
43
+ * @throws MiaixzSdkError When the identifier violates the module grammar.
44
+ */
45
+ function parseModuleId(moduleId) {
46
+ if (!moduleIdentifierPattern.test(moduleId)) {
47
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
48
+ }
49
+ return moduleId;
50
+ }
51
+ /**
52
+ * Validates and defensively copies one same-site navigation request.
53
+ *
54
+ * @param request - Navigation request to validate.
55
+ * @returns Frozen request containing a cloned state value.
56
+ * @throws MiaixzSdkError When the request or state is invalid.
57
+ */
58
+ function parseNavigationRequest(request) {
59
+ if (!isPlainRecord(request) ||
60
+ !hasOnlyKeys(request, new Set(["path", "replace", "state"])) ||
61
+ typeof request.path !== "string" ||
62
+ !request.path.startsWith("/") ||
63
+ request.path.startsWith("//") ||
64
+ request.path.includes("\\") ||
65
+ (request.replace !== undefined && typeof request.replace !== "boolean")) {
66
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
67
+ }
68
+ let state;
69
+ if (request.state !== undefined) {
70
+ try {
71
+ state = structuredClone(request.state);
72
+ }
73
+ catch {
74
+ throw createBridgeError("BRIDGE_NAVIGATION_STATE_INVALID", "sdk.error.bridge.navigationStateInvalid");
75
+ }
76
+ }
77
+ return Object.freeze({
78
+ path: request.path,
79
+ ...(request.replace === undefined ? {} : { replace: request.replace }),
80
+ ...(request.state === undefined ? {} : { state }),
81
+ });
82
+ }
83
+ /**
84
+ * Validates and freezes one non-wildcard module permission list.
85
+ *
86
+ * @param permissions - Permission list to validate.
87
+ * @returns Frozen defensive permission copy.
88
+ * @throws MiaixzSdkError When any permission is malformed.
89
+ */
90
+ function parsePermissions(permissions) {
91
+ if (!Array.isArray(permissions) || !permissions.every(isMiaixzModulePermission)) {
92
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
93
+ }
94
+ return Object.freeze([...permissions]);
95
+ }
96
+ /**
97
+ * Validates one event name against the module bound to the bridge.
98
+ *
99
+ * @param moduleId - Module identifier owning the bridge.
100
+ * @param type - Event type to validate.
101
+ * @returns The unchanged valid event type.
102
+ * @throws MiaixzSdkError When the event is outside the module namespace.
103
+ */
104
+ function parseEventType(moduleId, type) {
105
+ if (typeof type !== "string") {
106
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
107
+ }
108
+ const separator = type.indexOf(":");
109
+ const owner = type.slice(0, separator);
110
+ const eventName = type.slice(separator + 1);
111
+ if (separator < 0 ||
112
+ type.indexOf(":", separator + 1) >= 0 ||
113
+ owner !== moduleId ||
114
+ !moduleIdentifierPattern.test(owner) ||
115
+ !moduleIdentifierPattern.test(eventName)) {
116
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
117
+ }
118
+ return type;
119
+ }
120
+ /**
121
+ * Implements the same-runtime Host Bridge with explicit capability injection.
122
+ */
123
+ class MiaixzDirectHostBridge {
124
+ /**
125
+ * Micro-frontend protocol version implemented by the bridge.
126
+ */
127
+ protocolVersion = MIAIXZ_MODULE_PROTOCOL_VERSION;
128
+ #moduleId;
129
+ #adapter;
130
+ #subscriptions = new Set();
131
+ #disposed = false;
132
+ /**
133
+ * Creates one module-scoped Direct Bridge.
134
+ *
135
+ * @param options - Validated module identity and injected host capabilities.
136
+ */
137
+ constructor(options) {
138
+ this.#moduleId = parseModuleId(options.moduleId);
139
+ this.#adapter = options.adapter;
140
+ }
141
+ /**
142
+ * Reads the current non-sensitive host context.
143
+ *
144
+ * @returns Immutable runtime context from the host Adapter.
145
+ */
146
+ getContext() {
147
+ return Promise.resolve().then(() => {
148
+ this.#assertActive();
149
+ return this.#requireCapability("getContext")();
150
+ });
151
+ }
152
+ /**
153
+ * Sends a validated same-site navigation request to the host.
154
+ *
155
+ * @param request - Navigation request to validate and clone.
156
+ * @returns Promise settled after the host handles navigation.
157
+ */
158
+ navigate(request) {
159
+ return Promise.resolve().then(() => {
160
+ this.#assertActive();
161
+ const parsed = parseNavigationRequest(request);
162
+ return this.#requireCapability("navigate")(parsed);
163
+ });
164
+ }
165
+ /**
166
+ * Checks whether all validated permissions are available.
167
+ *
168
+ * @param permissions - Non-wildcard permissions to evaluate.
169
+ * @returns Whether every requested permission is available.
170
+ */
171
+ hasPermissions(permissions) {
172
+ return Promise.resolve().then(() => {
173
+ this.#assertActive();
174
+ const parsed = parsePermissions(permissions);
175
+ return this.#requireCapability("hasPermissions")(parsed);
176
+ });
177
+ }
178
+ /**
179
+ * Registers messages owned by the module bound to the bridge.
180
+ *
181
+ * @param namespace - Namespace that must equal the module identifier.
182
+ * @param catalog - Project message catalog to register.
183
+ * @returns Promise settled after the host registers the catalog.
184
+ */
185
+ registerMessages(namespace, catalog) {
186
+ return Promise.resolve().then(() => {
187
+ this.#assertActive();
188
+ if (namespace !== this.#moduleId) {
189
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
190
+ }
191
+ return this.#requireCapability("registerMessages")(namespace, catalog);
192
+ });
193
+ }
194
+ /**
195
+ * Emits one event owned by the module bound to the bridge.
196
+ *
197
+ * @typeParam T - Event payload type.
198
+ * @param type - Module-scoped event name.
199
+ * @param payload - Event payload delivered to the host.
200
+ * @returns Promise settled after event delivery.
201
+ */
202
+ emit(type, payload) {
203
+ return Promise.resolve().then(() => {
204
+ this.#assertActive();
205
+ const parsedType = parseEventType(this.#moduleId, type);
206
+ return this.#requireCapability("emit")(parsedType, payload);
207
+ });
208
+ }
209
+ /**
210
+ * Subscribes to one event owned by the module bound to the bridge.
211
+ *
212
+ * @typeParam T - Event payload type.
213
+ * @param type - Module-scoped event name.
214
+ * @param listener - Event listener invoked by the host.
215
+ * @returns Idempotent asynchronous unsubscribe function.
216
+ */
217
+ subscribe(type, listener) {
218
+ return Promise.resolve().then(async () => {
219
+ this.#assertActive();
220
+ const parsedType = parseEventType(this.#moduleId, type);
221
+ if (typeof listener !== "function") {
222
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
223
+ }
224
+ const unsubscribe = await this.#requireCapability("subscribe")(parsedType, listener);
225
+ if (typeof unsubscribe !== "function") {
226
+ throw createBridgeError("BRIDGE_MESSAGE_INVALID", "sdk.error.bridge.messageInvalid");
227
+ }
228
+ let cancelled = false;
229
+ const cancel = async () => {
230
+ if (cancelled)
231
+ return;
232
+ cancelled = true;
233
+ this.#subscriptions.delete(cancel);
234
+ await Promise.resolve().then(unsubscribe);
235
+ };
236
+ if (this.#disposed) {
237
+ try {
238
+ await cancel();
239
+ }
240
+ catch {
241
+ // Cleanup failures cannot replace the deterministic disposed result.
242
+ }
243
+ throw createBridgeError("BRIDGE_DISPOSED", "sdk.error.bridge.disposed");
244
+ }
245
+ this.#subscriptions.add(cancel);
246
+ return cancel;
247
+ });
248
+ }
249
+ /**
250
+ * Releases tracked subscriptions and prevents further Adapter calls.
251
+ */
252
+ dispose() {
253
+ if (this.#disposed)
254
+ return;
255
+ this.#disposed = true;
256
+ const subscriptions = [...this.#subscriptions];
257
+ this.#subscriptions.clear();
258
+ for (const unsubscribe of subscriptions) {
259
+ void unsubscribe().catch(() => undefined);
260
+ }
261
+ }
262
+ /**
263
+ * Rejects calls made after the bridge has been released.
264
+ *
265
+ * @throws MiaixzSdkError When the bridge has already been disposed.
266
+ */
267
+ #assertActive() {
268
+ if (this.#disposed) {
269
+ throw createBridgeError("BRIDGE_DISPOSED", "sdk.error.bridge.disposed");
270
+ }
271
+ }
272
+ /**
273
+ * Returns one injected Adapter capability.
274
+ *
275
+ * @typeParam Name - Adapter capability name.
276
+ * @param name - Capability to resolve.
277
+ * @returns Injected Adapter capability.
278
+ * @throws MiaixzSdkError When the host omitted the requested capability.
279
+ */
280
+ #requireCapability(name) {
281
+ const capability = this.#adapter[name];
282
+ if (capability === undefined) {
283
+ throw createBridgeError("BRIDGE_CAPABILITY_UNAVAILABLE", "sdk.error.bridge.capabilityUnavailable");
284
+ }
285
+ return capability;
286
+ }
287
+ }
288
+ /**
289
+ * Creates a module-scoped same-runtime Host Bridge.
290
+ *
291
+ * @param options - Module identity and explicitly injected host capabilities.
292
+ * @returns Host Bridge that delegates validated calls to the Adapter.
293
+ * @throws MiaixzSdkError When the module identifier is invalid.
294
+ * @public
295
+ */
296
+ export function createMiaixzDirectHostBridge(options) {
297
+ return new MiaixzDirectHostBridge(options);
298
+ }
299
+ //# sourceMappingURL=direct-host-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-host-bridge.js","sourceRoot":"","sources":["../../src/runtime/direct-host-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { MiaixzSdkError } from \"../api/errors.js\";\nimport {\n MIAIXZ_MODULE_PROTOCOL_VERSION,\n type MiaixzDirectHostBridgeOptions,\n type MiaixzHostAdapter,\n type MiaixzHostBridge,\n type MiaixzNavigationRequest,\n} from \"../contracts/index.js\";\nimport { isMiaixzModulePermission } from \"../contracts/permission.js\";\nimport { translateMiaixzDefaultMessage } from \"../i18n/default-translator.js\";\nimport type { MiaixzMessageCatalog } from \"../i18n/index.js\";\nimport type { MiaixzRuntimeContext } from \"../types/index.js\";\n\nconst moduleIdentifierPattern = /^[a-z][a-z0-9-]{1,63}$/;\n\n/**\n * Creates a localized Direct Bridge error without including caller-owned data.\n *\n * @param code - Stable Bridge error code.\n * @param messageKey - Registered internationalization message key.\n * @returns Localized SDK error.\n */\nfunction createBridgeError(\n code:\n | \"BRIDGE_CAPABILITY_UNAVAILABLE\"\n | \"BRIDGE_DISPOSED\"\n | \"BRIDGE_MESSAGE_INVALID\"\n | \"BRIDGE_NAVIGATION_STATE_INVALID\",\n messageKey:\n | \"sdk.error.bridge.capabilityUnavailable\"\n | \"sdk.error.bridge.disposed\"\n | \"sdk.error.bridge.messageInvalid\"\n | \"sdk.error.bridge.navigationStateInvalid\",\n): MiaixzSdkError {\n return new MiaixzSdkError(translateMiaixzDefaultMessage(messageKey), { code });\n}\n\n/**\n * Determines whether a value is a plain record without a custom prototype.\n *\n * @param value - Runtime value to inspect.\n * @returns Whether the value is a plain record.\n */\nfunction isPlainRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Determines whether a record contains only the supplied keys.\n *\n * @param value - Record whose keys should be inspected.\n * @param allowedKeys - Complete set of allowed keys.\n * @returns Whether every enumerable own key is allowed.\n */\nfunction hasOnlyKeys(\n value: Readonly<Record<string, unknown>>,\n allowedKeys: ReadonlySet<string>,\n): boolean {\n return Object.keys(value).every((key) => allowedKeys.has(key));\n}\n\n/**\n * Validates one module identifier before creating a bridge.\n *\n * @param moduleId - Module identifier to validate.\n * @returns The unchanged valid identifier.\n * @throws MiaixzSdkError When the identifier violates the module grammar.\n */\nfunction parseModuleId(moduleId: string): string {\n if (!moduleIdentifierPattern.test(moduleId)) {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n return moduleId;\n}\n\n/**\n * Validates and defensively copies one same-site navigation request.\n *\n * @param request - Navigation request to validate.\n * @returns Frozen request containing a cloned state value.\n * @throws MiaixzSdkError When the request or state is invalid.\n */\nfunction parseNavigationRequest(\n request: Readonly<MiaixzNavigationRequest>,\n): MiaixzNavigationRequest {\n if (\n !isPlainRecord(request) ||\n !hasOnlyKeys(request, new Set([\"path\", \"replace\", \"state\"])) ||\n typeof request.path !== \"string\" ||\n !request.path.startsWith(\"/\") ||\n request.path.startsWith(\"//\") ||\n request.path.includes(\"\\\\\") ||\n (request.replace !== undefined && typeof request.replace !== \"boolean\")\n ) {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n\n let state: unknown;\n if (request.state !== undefined) {\n try {\n state = structuredClone(request.state);\n } catch {\n throw createBridgeError(\n \"BRIDGE_NAVIGATION_STATE_INVALID\",\n \"sdk.error.bridge.navigationStateInvalid\",\n );\n }\n }\n\n return Object.freeze({\n path: request.path,\n ...(request.replace === undefined ? {} : { replace: request.replace }),\n ...(request.state === undefined ? {} : { state }),\n });\n}\n\n/**\n * Validates and freezes one non-wildcard module permission list.\n *\n * @param permissions - Permission list to validate.\n * @returns Frozen defensive permission copy.\n * @throws MiaixzSdkError When any permission is malformed.\n */\nfunction parsePermissions(permissions: readonly string[]): readonly string[] {\n if (!Array.isArray(permissions) || !permissions.every(isMiaixzModulePermission)) {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n return Object.freeze([...permissions]);\n}\n\n/**\n * Validates one event name against the module bound to the bridge.\n *\n * @param moduleId - Module identifier owning the bridge.\n * @param type - Event type to validate.\n * @returns The unchanged valid event type.\n * @throws MiaixzSdkError When the event is outside the module namespace.\n */\nfunction parseEventType(moduleId: string, type: string): string {\n if (typeof type !== \"string\") {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n const separator = type.indexOf(\":\");\n const owner = type.slice(0, separator);\n const eventName = type.slice(separator + 1);\n if (\n separator < 0 ||\n type.indexOf(\":\", separator + 1) >= 0 ||\n owner !== moduleId ||\n !moduleIdentifierPattern.test(owner) ||\n !moduleIdentifierPattern.test(eventName)\n ) {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n return type;\n}\n\n/**\n * Implements the same-runtime Host Bridge with explicit capability injection.\n */\nclass MiaixzDirectHostBridge implements MiaixzHostBridge {\n /**\n * Micro-frontend protocol version implemented by the bridge.\n */\n readonly protocolVersion = MIAIXZ_MODULE_PROTOCOL_VERSION;\n\n readonly #moduleId: string;\n readonly #adapter: MiaixzHostAdapter;\n readonly #subscriptions = new Set<() => Promise<void>>();\n #disposed = false;\n\n /**\n * Creates one module-scoped Direct Bridge.\n *\n * @param options - Validated module identity and injected host capabilities.\n */\n constructor(options: Readonly<MiaixzDirectHostBridgeOptions>) {\n this.#moduleId = parseModuleId(options.moduleId);\n this.#adapter = options.adapter;\n }\n\n /**\n * Reads the current non-sensitive host context.\n *\n * @returns Immutable runtime context from the host Adapter.\n */\n getContext(): Promise<Readonly<MiaixzRuntimeContext>> {\n return Promise.resolve().then(() => {\n this.#assertActive();\n return this.#requireCapability(\"getContext\")();\n });\n }\n\n /**\n * Sends a validated same-site navigation request to the host.\n *\n * @param request - Navigation request to validate and clone.\n * @returns Promise settled after the host handles navigation.\n */\n navigate(request: Readonly<MiaixzNavigationRequest>): Promise<void> {\n return Promise.resolve().then(() => {\n this.#assertActive();\n const parsed = parseNavigationRequest(request);\n return this.#requireCapability(\"navigate\")(parsed);\n });\n }\n\n /**\n * Checks whether all validated permissions are available.\n *\n * @param permissions - Non-wildcard permissions to evaluate.\n * @returns Whether every requested permission is available.\n */\n hasPermissions(permissions: readonly string[]): Promise<boolean> {\n return Promise.resolve().then(() => {\n this.#assertActive();\n const parsed = parsePermissions(permissions);\n return this.#requireCapability(\"hasPermissions\")(parsed);\n });\n }\n\n /**\n * Registers messages owned by the module bound to the bridge.\n *\n * @param namespace - Namespace that must equal the module identifier.\n * @param catalog - Project message catalog to register.\n * @returns Promise settled after the host registers the catalog.\n */\n registerMessages(namespace: string, catalog: MiaixzMessageCatalog): Promise<void> {\n return Promise.resolve().then(() => {\n this.#assertActive();\n if (namespace !== this.#moduleId) {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n return this.#requireCapability(\"registerMessages\")(namespace, catalog);\n });\n }\n\n /**\n * Emits one event owned by the module bound to the bridge.\n *\n * @typeParam T - Event payload type.\n * @param type - Module-scoped event name.\n * @param payload - Event payload delivered to the host.\n * @returns Promise settled after event delivery.\n */\n emit<T = unknown>(type: string, payload: T): Promise<void> {\n return Promise.resolve().then(() => {\n this.#assertActive();\n const parsedType = parseEventType(this.#moduleId, type);\n return this.#requireCapability(\"emit\")<T>(parsedType, payload);\n });\n }\n\n /**\n * Subscribes to one event owned by the module bound to the bridge.\n *\n * @typeParam T - Event payload type.\n * @param type - Module-scoped event name.\n * @param listener - Event listener invoked by the host.\n * @returns Idempotent asynchronous unsubscribe function.\n */\n subscribe<T = unknown>(\n type: string,\n listener: (payload: T) => void,\n ): Promise<() => Promise<void>> {\n return Promise.resolve().then(async () => {\n this.#assertActive();\n const parsedType = parseEventType(this.#moduleId, type);\n if (typeof listener !== \"function\") {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n const unsubscribe = await this.#requireCapability(\"subscribe\")<T>(parsedType, listener);\n if (typeof unsubscribe !== \"function\") {\n throw createBridgeError(\"BRIDGE_MESSAGE_INVALID\", \"sdk.error.bridge.messageInvalid\");\n }\n\n let cancelled = false;\n const cancel = async (): Promise<void> => {\n if (cancelled) return;\n cancelled = true;\n this.#subscriptions.delete(cancel);\n await Promise.resolve().then(unsubscribe);\n };\n\n if (this.#disposed) {\n try {\n await cancel();\n } catch {\n // Cleanup failures cannot replace the deterministic disposed result.\n }\n throw createBridgeError(\"BRIDGE_DISPOSED\", \"sdk.error.bridge.disposed\");\n }\n this.#subscriptions.add(cancel);\n return cancel;\n });\n }\n\n /**\n * Releases tracked subscriptions and prevents further Adapter calls.\n */\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n const subscriptions = [...this.#subscriptions];\n this.#subscriptions.clear();\n for (const unsubscribe of subscriptions) {\n void unsubscribe().catch(() => undefined);\n }\n }\n\n /**\n * Rejects calls made after the bridge has been released.\n *\n * @throws MiaixzSdkError When the bridge has already been disposed.\n */\n #assertActive(): void {\n if (this.#disposed) {\n throw createBridgeError(\"BRIDGE_DISPOSED\", \"sdk.error.bridge.disposed\");\n }\n }\n\n /**\n * Returns one injected Adapter capability.\n *\n * @typeParam Name - Adapter capability name.\n * @param name - Capability to resolve.\n * @returns Injected Adapter capability.\n * @throws MiaixzSdkError When the host omitted the requested capability.\n */\n #requireCapability<Name extends keyof MiaixzHostAdapter>(\n name: Name,\n ): NonNullable<MiaixzHostAdapter[Name]> {\n const capability = this.#adapter[name];\n if (capability === undefined) {\n throw createBridgeError(\n \"BRIDGE_CAPABILITY_UNAVAILABLE\",\n \"sdk.error.bridge.capabilityUnavailable\",\n );\n }\n return capability as NonNullable<MiaixzHostAdapter[Name]>;\n }\n}\n\n/**\n * Creates a module-scoped same-runtime Host Bridge.\n *\n * @param options - Module identity and explicitly injected host capabilities.\n * @returns Host Bridge that delegates validated calls to the Adapter.\n * @throws MiaixzSdkError When the module identifier is invalid.\n * @public\n */\nexport function createMiaixzDirectHostBridge(\n options: Readonly<MiaixzDirectHostBridgeOptions>,\n): MiaixzHostBridge {\n return new MiaixzDirectHostBridge(options);\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export type { MiaixzDirectHostBridgeOptions, MiaixzHostAdapter, MiaixzHostBridge, MiaixzNavigationRequest, } from "../contracts/index.js";
2
+ export { createMiaixzDirectHostBridge } from "./direct-host-bridge.js";
3
+ export { createMiaixzPostMessageChildBridge, createMiaixzPostMessageHost, } from "./post-message-bridge.js";
4
+ export type { MiaixzBridgeEnvelope, MiaixzPostMessageChildOptions, MiaixzPostMessageHost, MiaixzPostMessageHostOptions, } from "../contracts/index.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,6BAA6B,EAC7B,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EACL,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createMiaixzDirectHostBridge } from "./direct-host-bridge.js";
2
+ export { createMiaixzPostMessageChildBridge, createMiaixzPostMessageHost, } from "./post-message-bridge.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EACL,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC","sourcesContent":["export type {\n MiaixzDirectHostBridgeOptions,\n MiaixzHostAdapter,\n MiaixzHostBridge,\n MiaixzNavigationRequest,\n} from \"../contracts/index.js\";\nexport { createMiaixzDirectHostBridge } from \"./direct-host-bridge.js\";\nexport {\n createMiaixzPostMessageChildBridge,\n createMiaixzPostMessageHost,\n} from \"./post-message-bridge.js\";\nexport type {\n MiaixzBridgeEnvelope,\n MiaixzPostMessageChildOptions,\n MiaixzPostMessageHost,\n MiaixzPostMessageHostOptions,\n} from \"../contracts/index.js\";\n"]}
@@ -0,0 +1,20 @@
1
+ import { type MiaixzHostBridge, type MiaixzPostMessageChildOptions, type MiaixzPostMessageHost, type MiaixzPostMessageHostOptions } from "../contracts/index.js";
2
+ /**
3
+ * Creates the Host side of a validated iframe postMessage Bridge.
4
+ *
5
+ * @param options - Manifest, target, origin, Adapter, and timeout configuration.
6
+ * @returns Host lifecycle whose ready Promise tracks the handshake.
7
+ * @throws MiaixzSdkError When construction parameters or browser capabilities are invalid.
8
+ * @public
9
+ */
10
+ export declare function createMiaixzPostMessageHost(options: MiaixzPostMessageHostOptions): MiaixzPostMessageHost;
11
+ /**
12
+ * Creates and handshakes the Child side of an iframe postMessage Bridge.
13
+ *
14
+ * @param options - Module identity, target, origin, and timeout configuration.
15
+ * @returns Promise resolving to the connected Host Bridge.
16
+ * @throws MiaixzSdkError When construction, handshake, or browser capabilities are invalid.
17
+ * @public
18
+ */
19
+ export declare function createMiaixzPostMessageChildBridge(options: MiaixzPostMessageChildOptions): Promise<MiaixzHostBridge>;
20
+ //# sourceMappingURL=post-message-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-message-bridge.d.ts","sourceRoot":"","sources":["../../src/runtime/post-message-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,gBAAgB,EAGrB,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EAClC,MAAM,uBAAuB,CAAC;AA2vC/B;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,qBAAqB,CAEvB;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAM3B"}