UNPKG

@hprose/rpc-wx

Version:
185 lines 9.63 kB
"use strict"; /*--------------------------------------------------------*\ | | | hprose | | | | Official WebSite: https://hprose.com | | | | WebSocketTransport.ts | | | | WebSocketTransport for TypeScript. | | | | LastModified: Dec 17, 2019 | | Author: Ma Bingyao <andot@hprose.com> | | | \*________________________________________________________*/ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var rpc_core_1 = require("@hprose/rpc-core"); var io_1 = require("@hprose/io"); var WebSocketTransport = /** @class */ (function () { function WebSocketTransport() { this.counter = 0; this.results = Object.create(null); this.websockets = Object.create(null); } WebSocketTransport.prototype.connect = function (uri) { return __awaiter(this, void 0, void 0, function () { var websocket, ws, onerror; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.websockets[uri]]; case 1: websocket = _a.sent(); if (websocket !== undefined) { return [2 /*return*/, websocket]; } ws = rpc_core_1.defer(); websocket = wx.connectSocket({ url: uri, protocols: ['hprose'] }); websocket.onOpen(function () { return ws.resolve(websocket); }); websocket.onMessage(function (res) { var instream = new io_1.ByteStream(res.data); var index = instream.readInt32BE(); var result = _this.results[uri][index]; delete _this.results[uri][index]; if (result) { result.resolve(instream.remains); } }); onerror = function (error) { var results = _this.results[uri]; if (results) { for (var index in results) { var result = results[index]; delete results[index]; result.reject(error); } } delete _this.websockets[uri]; }; websocket.onError(function (res) { return onerror(new Error(res.errMsg)); }); websocket.onClose(function () { return onerror(new Error('websocket closed')); }); this.websockets[uri] = ws.promise; return [2 /*return*/, ws.promise]; } }); }); }; WebSocketTransport.prototype.transport = function (request, context) { return __awaiter(this, void 0, void 0, function () { var uri, index, result, websocket, timeoutId_1, outstream, message; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: uri = context.uri; index = (this.counter < 0x7FFFFFFF) ? ++this.counter : this.counter = 0; result = rpc_core_1.defer(); return [4 /*yield*/, this.connect(uri)]; case 1: websocket = _a.sent(); if (this.results[uri] === undefined) { this.results[uri] = Object.create(null); } this.results[uri][index] = result; if (context.timeout > 0) { timeoutId_1 = setTimeout(function () { delete _this.results[uri][index]; result.reject(new rpc_core_1.TimeoutError()); }, context.timeout); result.promise.then(function () { clearTimeout(timeoutId_1); }, function () { clearTimeout(timeoutId_1); }); } outstream = new io_1.ByteStream(4 + request.length); outstream.writeInt32BE(index); outstream.write(request); message = outstream.takeBytes(); websocket.send({ data: message.buffer, fail: function (res) { delete _this.results[uri][index]; result.reject(new Error(res.errMsg)); } }); return [2 /*return*/, result.promise]; } }); }); }; WebSocketTransport.prototype.abort = function () { return __awaiter(this, void 0, void 0, function () { var _a, _b, _i, uri, websocket; return __generator(this, function (_c) { switch (_c.label) { case 0: _a = []; for (_b in this.websockets) _a.push(_b); _i = 0; _c.label = 1; case 1: if (!(_i < _a.length)) return [3 /*break*/, 4]; uri = _a[_i]; websocket = this.websockets[uri]; delete this.websockets[uri]; if (!websocket) return [3 /*break*/, 3]; return [4 /*yield*/, websocket]; case 2: (_c.sent()).close({ code: 1000, reason: 'abort' }); _c.label = 3; case 3: _i++; return [3 /*break*/, 1]; case 4: return [2 /*return*/]; } }); }); }; WebSocketTransport.schemes = ['wss']; return WebSocketTransport; }()); exports.WebSocketTransport = WebSocketTransport; rpc_core_1.Client.register('websocket', WebSocketTransport); //# sourceMappingURL=WebSocketTransport.js.map