@tb-app/registry-trigger
Version:
实现webview与淘宝小程序之间的通信
161 lines (153 loc) • 5.93 kB
JavaScript
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 };