|
@@ -0,0 +1,62 @@
|
|
|
+class Bridge extends EventTarget {
|
|
|
+ #pool = new Map();
|
|
|
+
|
|
|
+ static getInstance() {
|
|
|
+ return Bridge._instance ?? (Bridge._instance = new Bridge());
|
|
|
+ }
|
|
|
+
|
|
|
+ static get Platform() {
|
|
|
+ return window['AndroidBridge'];
|
|
|
+ }
|
|
|
+
|
|
|
+ static get UUID() {
|
|
|
+ return crypto.randomUUID();
|
|
|
+ }
|
|
|
+
|
|
|
+ static pulse(userId) {
|
|
|
+ const { promise, ...resolvers } = Promise.withResolvers();
|
|
|
+ this.getInstance().#postMessage('pulse', { userId }, resolvers);
|
|
|
+ return promise;
|
|
|
+ }
|
|
|
+
|
|
|
+ static print(payload) {
|
|
|
+ const { promise, ...resolvers } = Promise.withResolvers();
|
|
|
+ this.getInstance().#postMessage('print', payload, resolvers);
|
|
|
+ return promise;
|
|
|
+ }
|
|
|
+
|
|
|
+ dispatch(message) {
|
|
|
+ try {
|
|
|
+ const { type, callbackId, payload } = JSON.parse(message);
|
|
|
+ if (callbackId) {
|
|
|
+ const { resolve, reject } = this.#pool.get(callbackId) ?? {};
|
|
|
+ this.#pool.delete(callbackId);
|
|
|
+ if (payload.code === 0) resolve(payload.data)
|
|
|
+ else reject(payload.message)
|
|
|
+ } else {
|
|
|
+ event = new CustomEvent(type, { detail: payload });
|
|
|
+ super.dispatchEvent(event);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log('log:bridge:js', `[analysis] 解析消息错误: ${e.message}`);
|
|
|
+ throw e;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ addEventListener(type, callback, options) {
|
|
|
+ super.addEventListener(type, callback, options);
|
|
|
+ return () => super.removeEventListener(type, callback);
|
|
|
+ }
|
|
|
+
|
|
|
+ #postMessage(type, payload, resolvers) {
|
|
|
+ const callbackId = `${type}:${Bridge.UUID}`;
|
|
|
+ this.#pool.set(callbackId, resolvers);
|
|
|
+ const message = JSON.stringify({ type, payload, callbackId })
|
|
|
+ Bridge.Platform.postMessage(message);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+window['Bridge'] = Bridge;
|
|
|
+window['bridge'] = Bridge.getInstance();
|
|
|
+
|
|
|
+window.print = Bridge.print.bind(Bridge);
|