UNPKG

@tb-app/registry-trigger

Version:
161 lines (153 loc) 5.93 kB
import { subscribe, publish } from '@tb-app/pub-sub'; import cloud from '@tbmp/mp-cloud-sdk'; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var stringify = function (object) { return object === undefined ? '' : Object.keys(object) .filter(function (key) { return object[key] !== undefined && object[key] !== null; }) .map(function (key) { return key + "=" + encodeURIComponent(object[key]); }) .join('&'); }; var appendAsQueryString = function (url, query) { var symbol = url.indexOf('?') > -1 ? '&' : '?'; var queryString = stringify(query); return queryString.length ? url + symbol + queryString : url; }; var prefix = 'registry-trigger-'; var postMessage = function (result, webViewContext) { webViewContext.postMessage(result); }; /** * 注册消息,只能在小程序端使用 * @param type 消息名称 * @param callback 回调 * @returns */ var registry = function (type, callback) { subscribe(type, function (data) { var token = data.token, webViewContext = data.webViewContext; Promise.resolve() .then(function () { return callback(data.data); }) .then(function (res) { return postMessage({ data: res, success: true, token: token, type: type }, webViewContext); }) .catch(function (e) { var error = e; if (typeof e !== 'object') { error = { message: e, }; } else { var keys = Object.getOwnPropertyNames(e || {}); error = keys.reduce(function (prev, key) { var _a; return __assign(__assign({}, prev), (_a = {}, _a[key] = e[key], _a)); }, {}); } postMessage({ error: error, success: false, token: token, type: type, }, webViewContext); }); }); }; /** * 注册 my */ registry(prefix + "my", function (_a) { var api = _a.api, options = _a.options; if (typeof api !== 'string') { throw new Error('api必须是字符串'); } if (!my.canIUse(api)) { throw new Error("\u5F53\u524D\u5343\u725B\u7248\u672C\u8FC7\u4F4E\uFF0C\u4E0D\u652F\u6301my." + api + "\uFF0C\u8BF7\u7ACB\u5373\u5347\u7EA7\u5343\u725B\u5230\u6700\u65B0\u7248\u672C"); } var _b = api.split('.'), key1 = _b[0], key2 = _b[1]; var method = key2 ? my[key1][key2] : my[key1]; if (typeof method === 'function') { var isSyncApi = api.indexOf('Sync') + 4 === api.length || api === 'canIUse'; if (isSyncApi) { return method(options); } return new Promise(function (resolve, reject) { method(__assign(__assign({}, (options || {})), { success: function (res) { return resolve(res); }, fail: function (err) { return reject(err); } })); }); } return method; }); /** * 注册 httpRequest */ registry(prefix + "httpRequest", function httpRequest(options) { if (my.isIDE) { var path = options.path, params = options.params, headers = options.headers, method = options.method, body = options.body, exts = options.exts; return my .httpRequest({ url: appendAsQueryString(path, params), headers: headers, method: method, data: body, timeout: exts ? exts.timeout : undefined, }) .then(function (_a) { var data = _a.data.data; return data; }); } return cloud.application.httpRequest(options); }); /** * 注册 cloud */ registry(prefix + "cloud", function (_a) { var api = _a.api, options = _a.options; if (typeof api !== 'string') { throw new Error('api必须是字符串'); } var _b = api.split('.'), key1 = _b[0], key2 = _b[1]; // @ts-ignore if (typeof cloud[key1] === 'undefined' || (key2 && typeof cloud[key1][key2] === 'undefined')) { throw new Error("api:'" + api + "'\u4E0D\u5B58\u5728"); } // @ts-ignore return key2 ? cloud[key1][key2](options) : cloud[key1](options); }); /** * 触发注册的消息, 只能在小程序端的web-view组件的 onMessage 处理函数上使用 * @param param 传给消息回调的数据 * @param webViewContext web-view的id */ var trigger = function (param, webViewContext) { var type = param.type, data = param.data, token = param.token; publish(type, { data: data, webViewContext: webViewContext, token: token, }); }; export { registry, trigger };