4952 lines
215 KiB
JavaScript
4952 lines
215 KiB
JavaScript
|
(function () {
|
||
|
'use strict';
|
||
|
|
||
|
/*! *****************************************************************************
|
||
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
||
|
this file except in compliance with the License. You may obtain a copy of the
|
||
|
License at http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
|
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
|
||
|
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
|
||
|
MERCHANTABLITY OR NON-INFRINGEMENT.
|
||
|
|
||
|
See the Apache Version 2.0 License for specific language governing permissions
|
||
|
and limitations under the License.
|
||
|
***************************************************************************** */
|
||
|
/* global Reflect, Promise */
|
||
|
|
||
|
var extendStatics = function(d, b) {
|
||
|
extendStatics = Object.setPrototypeOf ||
|
||
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
||
|
return extendStatics(d, b);
|
||
|
};
|
||
|
|
||
|
function __extends(d, b) {
|
||
|
extendStatics(d, b);
|
||
|
function __() { this.constructor = d; }
|
||
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
|
}
|
||
|
|
||
|
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);
|
||
|
};
|
||
|
|
||
|
function __rest(s, e) {
|
||
|
var t = {};
|
||
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
||
|
t[p] = s[p];
|
||
|
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
||
|
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
|
||
|
t[p[i]] = s[p[i]];
|
||
|
return t;
|
||
|
}
|
||
|
|
||
|
function __decorate(decorators, target, key, desc) {
|
||
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
|
}
|
||
|
|
||
|
function __param(paramIndex, decorator) {
|
||
|
return function (target, key) { decorator(target, key, paramIndex); }
|
||
|
}
|
||
|
|
||
|
function __metadata(metadataKey, metadataValue) {
|
||
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
||
|
}
|
||
|
|
||
|
function __awaiter(thisArg, _arguments, P, generator) {
|
||
|
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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function __generator(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 };
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function __exportStar(m, exports) {
|
||
|
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||
|
}
|
||
|
|
||
|
function __values(o) {
|
||
|
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
|
||
|
if (m) return m.call(o);
|
||
|
return {
|
||
|
next: function () {
|
||
|
if (o && i >= o.length) o = void 0;
|
||
|
return { value: o && o[i++], done: !o };
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function __read(o, n) {
|
||
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
||
|
if (!m) return o;
|
||
|
var i = m.call(o), r, ar = [], e;
|
||
|
try {
|
||
|
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
||
|
}
|
||
|
catch (error) { e = { error: error }; }
|
||
|
finally {
|
||
|
try {
|
||
|
if (r && !r.done && (m = i["return"])) m.call(i);
|
||
|
}
|
||
|
finally { if (e) throw e.error; }
|
||
|
}
|
||
|
return ar;
|
||
|
}
|
||
|
|
||
|
function __spread() {
|
||
|
for (var ar = [], i = 0; i < arguments.length; i++)
|
||
|
ar = ar.concat(__read(arguments[i]));
|
||
|
return ar;
|
||
|
}
|
||
|
|
||
|
function __await(v) {
|
||
|
return this instanceof __await ? (this.v = v, this) : new __await(v);
|
||
|
}
|
||
|
|
||
|
function __asyncGenerator(thisArg, _arguments, generator) {
|
||
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
||
|
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
||
|
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
|
||
|
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
|
||
|
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
||
|
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
||
|
function fulfill(value) { resume("next", value); }
|
||
|
function reject(value) { resume("throw", value); }
|
||
|
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
||
|
}
|
||
|
|
||
|
function __asyncDelegator(o) {
|
||
|
var i, p;
|
||
|
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
||
|
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
|
||
|
}
|
||
|
|
||
|
function __asyncValues(o) {
|
||
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
||
|
var m = o[Symbol.asyncIterator], i;
|
||
|
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
||
|
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
||
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
||
|
}
|
||
|
|
||
|
function __makeTemplateObject(cooked, raw) {
|
||
|
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
||
|
return cooked;
|
||
|
};
|
||
|
|
||
|
function __importStar(mod) {
|
||
|
if (mod && mod.__esModule) return mod;
|
||
|
var result = {};
|
||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||
|
result.default = mod;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
function __importDefault(mod) {
|
||
|
return (mod && mod.__esModule) ? mod : { default: mod };
|
||
|
}
|
||
|
|
||
|
var Scene = Laya.Scene;
|
||
|
var REG = Laya.ClassUtils.regClass;
|
||
|
var ui;
|
||
|
(function (ui) {
|
||
|
var test;
|
||
|
(function (test) {
|
||
|
class TestSceneUI extends Scene {
|
||
|
constructor() { super(); }
|
||
|
createChildren() {
|
||
|
super.createChildren();
|
||
|
this.loadScene("test/TestScene");
|
||
|
}
|
||
|
}
|
||
|
test.TestSceneUI = TestSceneUI;
|
||
|
REG("ui.test.TestSceneUI", TestSceneUI);
|
||
|
})(test = ui.test || (ui.test = {}));
|
||
|
})(ui || (ui = {}));
|
||
|
|
||
|
class GameControl extends Laya.Script {
|
||
|
constructor() {
|
||
|
super();
|
||
|
this.createBoxInterval = 1000;
|
||
|
this._time = 0;
|
||
|
this._started = false;
|
||
|
}
|
||
|
onEnable() {
|
||
|
this._time = Date.now();
|
||
|
this._gameBox = this.owner.getChildByName("gameBox");
|
||
|
}
|
||
|
onUpdate() {
|
||
|
let now = Date.now();
|
||
|
if (now - this._time > this.createBoxInterval && this._started) {
|
||
|
this._time = now;
|
||
|
this.createBox();
|
||
|
}
|
||
|
}
|
||
|
createBox() {
|
||
|
let box = Laya.Pool.getItemByCreateFun("dropBox", this.dropBox.create, this.dropBox);
|
||
|
box.pos(Math.random() * (Laya.stage.width - 100), -100);
|
||
|
this._gameBox.addChild(box);
|
||
|
}
|
||
|
onStageClick(e) {
|
||
|
e.stopPropagation();
|
||
|
let flyer = Laya.Pool.getItemByCreateFun("bullet", this.bullet.create, this.bullet);
|
||
|
flyer.pos(Laya.stage.mouseX, Laya.stage.mouseY);
|
||
|
this._gameBox.addChild(flyer);
|
||
|
}
|
||
|
startGame() {
|
||
|
if (!this._started) {
|
||
|
this._started = true;
|
||
|
this.enabled = true;
|
||
|
}
|
||
|
}
|
||
|
stopGame() {
|
||
|
this._started = false;
|
||
|
this.enabled = false;
|
||
|
this.createBoxInterval = 1000;
|
||
|
this._gameBox.removeChildren();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class GameUI extends ui.test.TestSceneUI {
|
||
|
constructor() {
|
||
|
super();
|
||
|
GameUI.instance = this;
|
||
|
Laya.MouseManager.multiTouchEnabled = false;
|
||
|
}
|
||
|
onEnable() {
|
||
|
this._control = this.getComponent(GameControl);
|
||
|
this.tipLbll.on(Laya.Event.CLICK, this, this.onTipClick);
|
||
|
}
|
||
|
onTipClick(e) {
|
||
|
this.tipLbll.visible = false;
|
||
|
this._score = 0;
|
||
|
this.scoreLbl.text = "";
|
||
|
this._control.startGame();
|
||
|
}
|
||
|
addScore(value = 1) {
|
||
|
this._score += value;
|
||
|
this.scoreLbl.changeText("分数:" + this._score);
|
||
|
if (this._control.createBoxInterval > 600 && this._score % 20 == 0)
|
||
|
this._control.createBoxInterval -= 20;
|
||
|
}
|
||
|
stopGame() {
|
||
|
this.tipLbll.visible = true;
|
||
|
this.tipLbll.text = "游戏结束了,点击屏幕重新开始";
|
||
|
this._control.stopGame();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Bullet extends Laya.Script {
|
||
|
constructor() { super(); }
|
||
|
onEnable() {
|
||
|
var rig = this.owner.getComponent(Laya.RigidBody);
|
||
|
rig.setVelocity({ x: 0, y: -10 });
|
||
|
}
|
||
|
onTriggerEnter(other, self, contact) {
|
||
|
this.owner.removeSelf();
|
||
|
}
|
||
|
onUpdate() {
|
||
|
if (this.owner.y < -10) {
|
||
|
this.owner.removeSelf();
|
||
|
}
|
||
|
}
|
||
|
onDisable() {
|
||
|
Laya.Pool.recover("bullet", this.owner);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class DropBox extends Laya.Script {
|
||
|
constructor() {
|
||
|
super();
|
||
|
this.level = 1;
|
||
|
}
|
||
|
onEnable() {
|
||
|
this._rig = this.owner.getComponent(Laya.RigidBody);
|
||
|
this.level = Math.round(Math.random() * 5) + 1;
|
||
|
this._text = this.owner.getChildByName("levelTxt");
|
||
|
this._text.text = this.level + "";
|
||
|
}
|
||
|
onUpdate() {
|
||
|
this.owner.rotation++;
|
||
|
}
|
||
|
onTriggerEnter(other, self, contact) {
|
||
|
var owner = this.owner;
|
||
|
if (other.label === "buttle") {
|
||
|
if (this.level > 1) {
|
||
|
this.level--;
|
||
|
this._text.changeText(this.level + "");
|
||
|
owner.getComponent(Laya.RigidBody).setVelocity({ x: 0, y: -10 });
|
||
|
Laya.SoundManager.playSound("sound/hit.wav");
|
||
|
}
|
||
|
else {
|
||
|
if (owner.parent) {
|
||
|
let effect = Laya.Pool.getItemByCreateFun("effect", this.createEffect, this);
|
||
|
effect.pos(owner.x, owner.y);
|
||
|
owner.parent.addChild(effect);
|
||
|
effect.play(0, true);
|
||
|
owner.removeSelf();
|
||
|
Laya.SoundManager.playSound("sound/destroy.wav");
|
||
|
}
|
||
|
}
|
||
|
GameUI.instance.addScore(1);
|
||
|
}
|
||
|
else if (other.label === "ground") {
|
||
|
owner.removeSelf();
|
||
|
GameUI.instance.stopGame();
|
||
|
}
|
||
|
}
|
||
|
createEffect() {
|
||
|
let ani = new Laya.Animation();
|
||
|
ani.loadAnimation("test/TestAni.ani");
|
||
|
ani.on(Laya.Event.COMPLETE, null, recover);
|
||
|
function recover() {
|
||
|
ani.removeSelf();
|
||
|
Laya.Pool.recover("effect", ani);
|
||
|
}
|
||
|
return ani;
|
||
|
}
|
||
|
onDisable() {
|
||
|
Laya.Pool.recover("dropBox", this.owner);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class GameConfig {
|
||
|
constructor() {
|
||
|
}
|
||
|
static init() {
|
||
|
var reg = Laya.ClassUtils.regClass;
|
||
|
reg("script/GameUI.ts", GameUI);
|
||
|
reg("script/GameControl.ts", GameControl);
|
||
|
reg("script/Bullet.ts", Bullet);
|
||
|
reg("script/DropBox.ts", DropBox);
|
||
|
}
|
||
|
}
|
||
|
GameConfig.width = 640;
|
||
|
GameConfig.height = 1136;
|
||
|
GameConfig.scaleMode = "fixedwidth";
|
||
|
GameConfig.screenMode = "none";
|
||
|
GameConfig.alignV = "top";
|
||
|
GameConfig.alignH = "left";
|
||
|
GameConfig.startScene = "test/TestScene.scene";
|
||
|
GameConfig.sceneRoot = "";
|
||
|
GameConfig.debug = false;
|
||
|
GameConfig.stat = false;
|
||
|
GameConfig.physicsDebug = false;
|
||
|
GameConfig.exportSceneToJson = true;
|
||
|
GameConfig.init();
|
||
|
|
||
|
const serviceProto = {
|
||
|
"version": 1,
|
||
|
"services": [
|
||
|
{
|
||
|
"id": 0,
|
||
|
"name": "AddData",
|
||
|
"type": "api"
|
||
|
},
|
||
|
{
|
||
|
"id": 1,
|
||
|
"name": "GetData",
|
||
|
"type": "api"
|
||
|
}
|
||
|
],
|
||
|
"types": {
|
||
|
"PtlAddData/ReqAddData": {
|
||
|
"type": "Interface",
|
||
|
"properties": [
|
||
|
{
|
||
|
"id": 0,
|
||
|
"name": "content",
|
||
|
"type": {
|
||
|
"type": "String"
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
"PtlAddData/ResAddData": {
|
||
|
"type": "Interface",
|
||
|
"properties": [
|
||
|
{
|
||
|
"id": 0,
|
||
|
"name": "time",
|
||
|
"type": {
|
||
|
"type": "Date"
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
"PtlGetData/ReqGetData": {
|
||
|
"type": "Interface"
|
||
|
},
|
||
|
"PtlGetData/ResGetData": {
|
||
|
"type": "Interface",
|
||
|
"properties": [
|
||
|
{
|
||
|
"id": 0,
|
||
|
"name": "data",
|
||
|
"type": {
|
||
|
"type": "Array",
|
||
|
"elementType": {
|
||
|
"type": "Interface",
|
||
|
"properties": [
|
||
|
{
|
||
|
"id": 0,
|
||
|
"name": "content",
|
||
|
"type": {
|
||
|
"type": "String"
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
"id": 1,
|
||
|
"name": "time",
|
||
|
"type": {
|
||
|
"type": "Date"
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
!Array.prototype.__k8w_extended && Object.defineProperties(Array.prototype, {
|
||
|
remove: {
|
||
|
value: function value(filter) {
|
||
|
if (typeof filter == 'function') {
|
||
|
for (var i = this.length - 1; i > -1; --i) {
|
||
|
filter(this[i], i, this) && this.splice(i, 1);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
for (var i = this.length - 1; i > -1; --i) {
|
||
|
this[i] === filter && this.splice(i, 1);
|
||
|
}
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
},
|
||
|
removeOne: {
|
||
|
value: function value(filter) {
|
||
|
if (typeof filter == 'function') {
|
||
|
for (var i = 0; i < this.length; ++i) {
|
||
|
if (filter(this[i], i, this)) {
|
||
|
this.splice(i, 1);
|
||
|
return this;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
for (var i = 0; i < this.length; ++i) {
|
||
|
if (this[i] === filter) {
|
||
|
this.splice(i, 1);
|
||
|
return this;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
},
|
||
|
first: {
|
||
|
value: function value() {
|
||
|
return this.length ? this[0] : null;
|
||
|
}
|
||
|
},
|
||
|
last: {
|
||
|
value: function value() {
|
||
|
return this.length ? this[this.length - 1] : null;
|
||
|
}
|
||
|
},
|
||
|
max: {
|
||
|
value: function value(mapper) {
|
||
|
if (!this.length) {
|
||
|
return null;
|
||
|
}
|
||
|
function _max(a, b) {
|
||
|
return a > b ? a : b;
|
||
|
}
|
||
|
if (typeof mapper == 'function') {
|
||
|
var max = mapper(this[0], 0, this);
|
||
|
for (var i = 1; i < this.length; ++i) {
|
||
|
var temp = mapper(this[i], i, this);
|
||
|
max = temp > max ? temp : max;
|
||
|
}
|
||
|
return max;
|
||
|
}
|
||
|
else {
|
||
|
return this.reduce(function (prev, cur) {
|
||
|
return _max(prev, cur);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
min: {
|
||
|
value: function value(mapper) {
|
||
|
if (!this.length) {
|
||
|
return null;
|
||
|
}
|
||
|
function _min(a, b) {
|
||
|
return a < b ? a : b;
|
||
|
}
|
||
|
if (typeof mapper == 'function') {
|
||
|
var min = mapper(this[0], 0, this);
|
||
|
for (var i = 1; i < this.length; ++i) {
|
||
|
var temp = mapper(this[i], i, this);
|
||
|
min = temp < min ? temp : min;
|
||
|
}
|
||
|
return min;
|
||
|
}
|
||
|
else {
|
||
|
return this.reduce(function (prev, cur) {
|
||
|
return _min(prev, cur);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
distinct: {
|
||
|
value: function value() {
|
||
|
return this.filter(function (v, i, arr) {
|
||
|
return arr.indexOf(v) === i;
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
filterIndex: {
|
||
|
value: function value(filter) {
|
||
|
var output = [];
|
||
|
for (var i = 0; i < this.length; ++i) {
|
||
|
if (filter(this[i], i, this)) {
|
||
|
output.push(i);
|
||
|
}
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
},
|
||
|
count: {
|
||
|
value: function value(filter) {
|
||
|
var result = 0;
|
||
|
for (var i = 0; i < this.length; ++i) {
|
||
|
if (filter(this[i], i, this)) {
|
||
|
++result;
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
},
|
||
|
sum: {
|
||
|
value: function value(mapper) {
|
||
|
var result = 0;
|
||
|
for (var i = 0; i < this.length; ++i) {
|
||
|
result += mapper ? mapper(this[i], i, this) : this[i];
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
},
|
||
|
average: {
|
||
|
value: function value(mapper) {
|
||
|
return this.sum(mapper) / this.length;
|
||
|
}
|
||
|
},
|
||
|
orderBy: {
|
||
|
value: function value() {
|
||
|
var mappers = [];
|
||
|
for (var _i = 0; _i < arguments.length; _i++) {
|
||
|
mappers[_i] = arguments[_i];
|
||
|
}
|
||
|
return this.slice().sort(function (a, b) {
|
||
|
for (var i = 0; i < mappers.length; ++i) {
|
||
|
var va = mappers[i](a);
|
||
|
var vb = mappers[i](b);
|
||
|
if (va > vb) {
|
||
|
return 1;
|
||
|
}
|
||
|
else if (va < vb) {
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
orderByDesc: {
|
||
|
value: function value() {
|
||
|
var mappers = [];
|
||
|
for (var _i = 0; _i < arguments.length; _i++) {
|
||
|
mappers[_i] = arguments[_i];
|
||
|
}
|
||
|
return this.slice().sort(function (a, b) {
|
||
|
for (var i = 0; i < mappers.length; ++i) {
|
||
|
var va = mappers[i](a);
|
||
|
var vb = mappers[i](b);
|
||
|
if (va > vb) {
|
||
|
return -1;
|
||
|
}
|
||
|
else if (va < vb) {
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
binarySearch: {
|
||
|
value: function value(_value, keyMapper) {
|
||
|
var low = 0, high = this.length - 1;
|
||
|
while (low <= high) {
|
||
|
var mid = (high + low) / 2 | 0;
|
||
|
var midValue = keyMapper ? keyMapper(this[mid]) : this[mid];
|
||
|
if (_value === midValue) {
|
||
|
return mid;
|
||
|
}
|
||
|
else if (_value > midValue) {
|
||
|
low = mid + 1;
|
||
|
}
|
||
|
else if (_value < midValue) {
|
||
|
high = mid - 1;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
},
|
||
|
binaryInsert: {
|
||
|
value: function value(item, keyMapper, unique) {
|
||
|
if (typeof keyMapper == 'boolean') {
|
||
|
unique = keyMapper;
|
||
|
keyMapper = undefined;
|
||
|
}
|
||
|
var low = 0, high = this.length - 1;
|
||
|
var mid = NaN;
|
||
|
var itemValue = keyMapper ? keyMapper(item) : item;
|
||
|
while (low <= high) {
|
||
|
mid = (high + low) / 2 | 0;
|
||
|
var midValue = keyMapper ? keyMapper(this[mid]) : this[mid];
|
||
|
if (itemValue === midValue) {
|
||
|
if (unique) {
|
||
|
return mid;
|
||
|
}
|
||
|
else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else if (itemValue > midValue) {
|
||
|
low = mid + 1;
|
||
|
}
|
||
|
else if (itemValue < midValue) {
|
||
|
high = mid - 1;
|
||
|
}
|
||
|
}
|
||
|
var index = low > mid ? mid + 1 : mid;
|
||
|
this.splice(index, 0, item);
|
||
|
return index;
|
||
|
}
|
||
|
},
|
||
|
binaryDistinct: {
|
||
|
value: function value(keyMapper) {
|
||
|
return this.filter(function (v, i, arr) {
|
||
|
return arr.binarySearch(v, keyMapper) === i;
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
findLast: {
|
||
|
value: function value(predicate) {
|
||
|
for (var i = this.length - 1; i > -1; --i) {
|
||
|
if (predicate(this[i], i, this)) {
|
||
|
return this[i];
|
||
|
}
|
||
|
}
|
||
|
return undefined;
|
||
|
}
|
||
|
},
|
||
|
findLastIndex: {
|
||
|
value: function value(predicate) {
|
||
|
for (var i = this.length - 1; i > -1; --i) {
|
||
|
if (predicate(this[i], i, this)) {
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
},
|
||
|
groupBy: {
|
||
|
value: function value(grouper) {
|
||
|
var group = this.reduce(function (prev, next) {
|
||
|
var groupKey = grouper(next);
|
||
|
if (!prev[groupKey]) {
|
||
|
prev[groupKey] = [];
|
||
|
}
|
||
|
prev[groupKey].push(next);
|
||
|
return prev;
|
||
|
}, {});
|
||
|
return Object.keys(group).map(function (key) {
|
||
|
var arr = group[key];
|
||
|
arr.key = key;
|
||
|
return arr;
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
__k8w_extended: {
|
||
|
value: true
|
||
|
}
|
||
|
});
|
||
|
function repeat(str, times) {
|
||
|
var output = '';
|
||
|
for (var i = 0; i < times; ++i) {
|
||
|
output += str;
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
Date.prototype.format = function (formatString) {
|
||
|
if (formatString === void 0) {
|
||
|
formatString = 'yyyy-MM-dd hh:mm:ss';
|
||
|
}
|
||
|
var o = {
|
||
|
"M+": this.getMonth() + 1,
|
||
|
"d+": this.getDate(),
|
||
|
"h+": this.getHours(),
|
||
|
"m+": this.getMinutes(),
|
||
|
"s+": this.getSeconds(),
|
||
|
"q+": Math.floor((this.getMonth() + 3) / 3),
|
||
|
"S+": this.getMilliseconds()
|
||
|
};
|
||
|
if (/(y+)/.test(formatString))
|
||
|
formatString = formatString.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
||
|
for (var k in o) {
|
||
|
if (new RegExp("(" + k + ")").test(formatString))
|
||
|
formatString = formatString.replace(RegExp.$1, repeat('0', Math.max(RegExp.$1.length - ('' + o[k]).length, 0)) + o[k]);
|
||
|
}
|
||
|
return formatString;
|
||
|
};
|
||
|
Date.today = function () {
|
||
|
var now = new Date();
|
||
|
return new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
|
||
|
};
|
||
|
function _typeof(obj) {
|
||
|
"@babel/helpers - typeof";
|
||
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
||
|
_typeof = function (obj) {
|
||
|
return typeof obj;
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
_typeof = function (obj) {
|
||
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
||
|
};
|
||
|
}
|
||
|
return _typeof(obj);
|
||
|
}
|
||
|
Object.merge = function (target) {
|
||
|
var sources = [];
|
||
|
for (var _i = 1; _i < arguments.length; _i++) {
|
||
|
sources[_i - 1] = arguments[_i];
|
||
|
}
|
||
|
for (var i = 0; i < sources.length; ++i) {
|
||
|
var source = sources[i];
|
||
|
if (_typeof(source) != 'object' || source == null) {
|
||
|
continue;
|
||
|
}
|
||
|
for (var skey in source) {
|
||
|
if (!source.hasOwnProperty(skey)) {
|
||
|
continue;
|
||
|
}
|
||
|
if (source[skey] instanceof Date) {
|
||
|
target[skey] = new Date(source[skey]);
|
||
|
continue;
|
||
|
}
|
||
|
else if (_typeof(target[skey]) == 'object' && target[skey] != null && _typeof(source[skey]) == 'object' && source[skey] != null) {
|
||
|
Object.merge(target[skey], source[skey]);
|
||
|
}
|
||
|
else {
|
||
|
if (Array.isArray(source[skey])) {
|
||
|
target[skey] = Object.merge([], source[skey]);
|
||
|
}
|
||
|
else if (_typeof(source[skey]) == 'object' && source[skey] !== null) {
|
||
|
target[skey] = Object.merge({}, source[skey]);
|
||
|
}
|
||
|
else {
|
||
|
target[skey] = source[skey];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return target;
|
||
|
};
|
||
|
if (!Object.values) {
|
||
|
Object.values = function (obj) {
|
||
|
var output = [];
|
||
|
for (var k in obj) {
|
||
|
obj.hasOwnProperty(k) && output.push(obj[k]);
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
}
|
||
|
if (!Object.entries) {
|
||
|
Object.entries = function (obj) {
|
||
|
var output = [];
|
||
|
for (var key in obj) {
|
||
|
if (!obj.hasOwnProperty(key)) {
|
||
|
continue;
|
||
|
}
|
||
|
output.push([key, obj[key]]);
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
}
|
||
|
Object.forEach = function (obj, handler) {
|
||
|
for (var key in obj) {
|
||
|
if (!obj.hasOwnProperty(key)) {
|
||
|
return;
|
||
|
}
|
||
|
handler(obj[key], key, obj);
|
||
|
}
|
||
|
};
|
||
|
if (typeof window != 'undefined' && !window.console) {
|
||
|
window.console = {};
|
||
|
console.log = console.debug = console.info = console.warn = console.error = console.time = console.timeEnd = function () { };
|
||
|
}
|
||
|
if (!console.debug) {
|
||
|
console.debug = console.log;
|
||
|
}
|
||
|
var extendStatics$1 = function (d, b) {
|
||
|
extendStatics$1 = Object.setPrototypeOf ||
|
||
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
|
function (d, b) { for (var p in b)
|
||
|
if (Object.prototype.hasOwnProperty.call(b, p))
|
||
|
d[p] = b[p]; };
|
||
|
return extendStatics$1(d, b);
|
||
|
};
|
||
|
function __extends$1(d, b) {
|
||
|
if (typeof b !== "function" && b !== null)
|
||
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
|
extendStatics$1(d, b);
|
||
|
function __() { this.constructor = d; }
|
||
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
|
}
|
||
|
var __assign$1 = function () {
|
||
|
__assign$1 = 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$1.apply(this, arguments);
|
||
|
};
|
||
|
function __awaiter$1(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());
|
||
|
});
|
||
|
}
|
||
|
function __generator$1(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 };
|
||
|
}
|
||
|
}
|
||
|
var TsrpcErrorType;
|
||
|
(function (TsrpcErrorType) {
|
||
|
TsrpcErrorType["NetworkError"] = "NetworkError";
|
||
|
TsrpcErrorType["ServerError"] = "ServerError";
|
||
|
TsrpcErrorType["ClientError"] = "ClientError";
|
||
|
TsrpcErrorType["ApiError"] = "ApiError";
|
||
|
})(TsrpcErrorType || (TsrpcErrorType = {}));
|
||
|
var TransportDataProto = {
|
||
|
"ServerInputData": {
|
||
|
"type": "Interface",
|
||
|
"properties": [{
|
||
|
"id": 0,
|
||
|
"name": "serviceId",
|
||
|
"type": {
|
||
|
"type": "Number",
|
||
|
"scalarType": "uint"
|
||
|
}
|
||
|
}, {
|
||
|
"id": 1,
|
||
|
"name": "buffer",
|
||
|
"type": {
|
||
|
"type": "Buffer",
|
||
|
"arrayType": "Uint8Array"
|
||
|
}
|
||
|
}, {
|
||
|
"id": 2,
|
||
|
"name": "sn",
|
||
|
"type": {
|
||
|
"type": "Number",
|
||
|
"scalarType": "uint"
|
||
|
},
|
||
|
"optional": true
|
||
|
}]
|
||
|
},
|
||
|
"ServerOutputData": {
|
||
|
"type": "Interface",
|
||
|
"properties": [{
|
||
|
"id": 0,
|
||
|
"name": "buffer",
|
||
|
"type": {
|
||
|
"type": "Buffer",
|
||
|
"arrayType": "Uint8Array"
|
||
|
},
|
||
|
"optional": true
|
||
|
}, {
|
||
|
"id": 1,
|
||
|
"name": "error",
|
||
|
"type": {
|
||
|
"type": "Reference",
|
||
|
"target": "TsrpcErrorData"
|
||
|
},
|
||
|
"optional": true
|
||
|
}, {
|
||
|
"id": 2,
|
||
|
"name": "serviceId",
|
||
|
"type": {
|
||
|
"type": "Number",
|
||
|
"scalarType": "uint"
|
||
|
},
|
||
|
"optional": true
|
||
|
}, {
|
||
|
"id": 3,
|
||
|
"name": "sn",
|
||
|
"type": {
|
||
|
"type": "Number",
|
||
|
"scalarType": "uint"
|
||
|
},
|
||
|
"optional": true
|
||
|
}]
|
||
|
},
|
||
|
"TsrpcErrorData": {
|
||
|
"type": "Interface",
|
||
|
"properties": [{
|
||
|
"id": 0,
|
||
|
"name": "message",
|
||
|
"type": {
|
||
|
"type": "String"
|
||
|
}
|
||
|
}, {
|
||
|
"id": 1,
|
||
|
"name": "type",
|
||
|
"type": {
|
||
|
"type": "Reference",
|
||
|
"target": "TsrpcErrorType"
|
||
|
}
|
||
|
}, {
|
||
|
"id": 2,
|
||
|
"name": "code",
|
||
|
"type": {
|
||
|
"type": "Union",
|
||
|
"members": [{
|
||
|
"id": 0,
|
||
|
"type": {
|
||
|
"type": "String"
|
||
|
}
|
||
|
}, {
|
||
|
"id": 1,
|
||
|
"type": {
|
||
|
"type": "Number",
|
||
|
"scalarType": "int"
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
"optional": true
|
||
|
}],
|
||
|
"indexSignature": {
|
||
|
"keyType": "String",
|
||
|
"type": {
|
||
|
"type": "Any"
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
"TsrpcErrorType": {
|
||
|
"type": "Enum",
|
||
|
"members": [{
|
||
|
"id": 0,
|
||
|
"value": "NetworkError"
|
||
|
}, {
|
||
|
"id": 1,
|
||
|
"value": "ServerError"
|
||
|
}, {
|
||
|
"id": 2,
|
||
|
"value": "ClientError"
|
||
|
}, {
|
||
|
"id": 3,
|
||
|
"value": "ApiError"
|
||
|
}]
|
||
|
}
|
||
|
};
|
||
|
var TsrpcError = function () {
|
||
|
function TsrpcError(dataOrMessage, data) {
|
||
|
var _a;
|
||
|
if (typeof dataOrMessage === 'string') {
|
||
|
this.message = dataOrMessage;
|
||
|
this.type = (_a = data === null || data === void 0 ? void 0 : data.type) !== null && _a !== void 0 ? _a : TsrpcErrorType.ApiError;
|
||
|
__assign$1(this, data);
|
||
|
}
|
||
|
else {
|
||
|
__assign$1(this, dataOrMessage);
|
||
|
}
|
||
|
}
|
||
|
TsrpcError.prototype.toString = function () {
|
||
|
return "[TSRPC " + this.type + "]: " + this.message;
|
||
|
};
|
||
|
TsrpcError.Type = TsrpcErrorType;
|
||
|
return TsrpcError;
|
||
|
}();
|
||
|
var SchemaType;
|
||
|
(function (SchemaType) {
|
||
|
SchemaType["Boolean"] = "Boolean";
|
||
|
SchemaType["Number"] = "Number";
|
||
|
SchemaType["String"] = "String";
|
||
|
SchemaType["Array"] = "Array";
|
||
|
SchemaType["Tuple"] = "Tuple";
|
||
|
SchemaType["Enum"] = "Enum";
|
||
|
SchemaType["Any"] = "Any";
|
||
|
SchemaType["Literal"] = "Literal";
|
||
|
SchemaType["Object"] = "Object";
|
||
|
SchemaType["Interface"] = "Interface";
|
||
|
SchemaType["Buffer"] = "Buffer";
|
||
|
SchemaType["IndexedAccess"] = "IndexedAccess";
|
||
|
SchemaType["Reference"] = "Reference";
|
||
|
SchemaType["Union"] = "Union";
|
||
|
SchemaType["Intersection"] = "Intersection";
|
||
|
SchemaType["NonNullable"] = "NonNullable";
|
||
|
SchemaType["Date"] = "Date";
|
||
|
SchemaType["Pick"] = "Pick";
|
||
|
SchemaType["Partial"] = "Partial";
|
||
|
SchemaType["Omit"] = "Omit";
|
||
|
SchemaType["Overwrite"] = "Overwrite";
|
||
|
})(SchemaType || (SchemaType = {}));
|
||
|
var ProtoHelper = function () {
|
||
|
function ProtoHelper(proto) {
|
||
|
this._schemaWithUuids = [];
|
||
|
this._unionPropertiesCache = {};
|
||
|
this._flatInterfaceSchemaCache = {};
|
||
|
this.proto = proto;
|
||
|
}
|
||
|
ProtoHelper.prototype.parseReference = function (schema) {
|
||
|
if (schema.type === SchemaType.Reference) {
|
||
|
var parsedSchema = this.proto[schema.target];
|
||
|
if (!parsedSchema) {
|
||
|
throw new Error("Cannot find reference target: " + schema.target);
|
||
|
}
|
||
|
if (this.isTypeReference(parsedSchema)) {
|
||
|
return this.parseReference(parsedSchema);
|
||
|
}
|
||
|
else {
|
||
|
return parsedSchema;
|
||
|
}
|
||
|
}
|
||
|
else if (schema.type === SchemaType.IndexedAccess) {
|
||
|
if (!this.isInterface(schema.objectType)) {
|
||
|
throw new Error("Error objectType: " + schema.objectType.type);
|
||
|
}
|
||
|
var flat = this.getFlatInterfaceSchema(schema.objectType);
|
||
|
var propItem = flat.properties.find(function (v) {
|
||
|
return v.name === schema.index;
|
||
|
});
|
||
|
var propType = void 0;
|
||
|
if (propItem) {
|
||
|
propType = propItem.type;
|
||
|
}
|
||
|
else {
|
||
|
if (flat.indexSignature) {
|
||
|
propType = flat.indexSignature.type;
|
||
|
}
|
||
|
else {
|
||
|
throw new Error("Error index: " + schema.index);
|
||
|
}
|
||
|
}
|
||
|
if (propItem && propItem.optional && (propItem.type.type !== SchemaType.Union
|
||
|
|| propItem.type.members.findIndex(function (v) {
|
||
|
return v.type.type === SchemaType.Literal && v.type.literal === undefined;
|
||
|
}) === -1)) {
|
||
|
propType = {
|
||
|
type: SchemaType.Union,
|
||
|
members: [{
|
||
|
id: 0,
|
||
|
type: propType
|
||
|
}, {
|
||
|
id: 1,
|
||
|
type: {
|
||
|
type: SchemaType.Literal,
|
||
|
literal: undefined
|
||
|
}
|
||
|
}]
|
||
|
};
|
||
|
}
|
||
|
return this.isTypeReference(propType) ? this.parseReference(propType) : propType;
|
||
|
}
|
||
|
else {
|
||
|
return schema;
|
||
|
}
|
||
|
};
|
||
|
ProtoHelper.prototype.isInterface = function (schema, excludeReference) {
|
||
|
if (excludeReference === void 0) {
|
||
|
excludeReference = false;
|
||
|
}
|
||
|
if (!excludeReference && this.isTypeReference(schema)) {
|
||
|
var parsed = this.parseReference(schema);
|
||
|
return this.isInterface(parsed, excludeReference);
|
||
|
}
|
||
|
else {
|
||
|
return schema.type === SchemaType.Interface || schema.type === SchemaType.Pick || schema.type === SchemaType.Partial || schema.type === SchemaType.Omit || schema.type === SchemaType.Overwrite;
|
||
|
}
|
||
|
};
|
||
|
ProtoHelper.prototype.isTypeReference = function (schema) {
|
||
|
return schema.type === SchemaType.Reference || schema.type === SchemaType.IndexedAccess;
|
||
|
};
|
||
|
ProtoHelper.prototype._getSchemaUuid = function (schema) {
|
||
|
var schemaWithUuid = schema;
|
||
|
if (!schemaWithUuid.uuid) {
|
||
|
schemaWithUuid.uuid = this._schemaWithUuids.push(schemaWithUuid);
|
||
|
}
|
||
|
return schemaWithUuid.uuid;
|
||
|
};
|
||
|
ProtoHelper.prototype.getUnionProperties = function (schema) {
|
||
|
var uuid = this._getSchemaUuid(schema);
|
||
|
if (!this._unionPropertiesCache[uuid]) {
|
||
|
this._unionPropertiesCache[uuid] = this._addUnionProperties([], schema.members.map(function (v) {
|
||
|
return v.type;
|
||
|
}));
|
||
|
}
|
||
|
return this._unionPropertiesCache[uuid];
|
||
|
};
|
||
|
ProtoHelper.prototype._addUnionProperties = function (unionProperties, schemas) {
|
||
|
for (var i = 0, len = schemas.length; i < len; ++i) {
|
||
|
var schema = this.parseReference(schemas[i]);
|
||
|
if (this.isInterface(schema)) {
|
||
|
var flat = this.getFlatInterfaceSchema(schema);
|
||
|
flat.properties.forEach(function (v) {
|
||
|
unionProperties.binaryInsert(v.name, true);
|
||
|
});
|
||
|
if (flat.indexSignature) {
|
||
|
var key = "[[" + flat.indexSignature.keyType + "]]";
|
||
|
unionProperties.binaryInsert(key, true);
|
||
|
}
|
||
|
}
|
||
|
else if (schema.type === SchemaType.Intersection || schema.type === SchemaType.Union) {
|
||
|
this._addUnionProperties(unionProperties, schema.members.map(function (v) {
|
||
|
return v.type;
|
||
|
}));
|
||
|
}
|
||
|
}
|
||
|
return unionProperties;
|
||
|
};
|
||
|
ProtoHelper.prototype.applyUnionProperties = function (schema, unionProperties) {
|
||
|
var newSchema = __assign$1(__assign$1({}, schema), {
|
||
|
properties: schema.properties.slice()
|
||
|
});
|
||
|
var _loop_1 = function _loop_1(prop) {
|
||
|
if (prop === '[[String]]') {
|
||
|
newSchema.indexSignature = newSchema.indexSignature || {
|
||
|
keyType: SchemaType.String,
|
||
|
type: {
|
||
|
type: SchemaType.Any
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
else if (prop === '[[Number]]') {
|
||
|
newSchema.indexSignature = newSchema.indexSignature || {
|
||
|
keyType: SchemaType.Number,
|
||
|
type: {
|
||
|
type: SchemaType.Any
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
else if (!schema.properties.find(function (v) {
|
||
|
return v.name === prop;
|
||
|
})) {
|
||
|
newSchema.properties.push({
|
||
|
id: -1,
|
||
|
name: prop,
|
||
|
optional: true,
|
||
|
type: {
|
||
|
type: SchemaType.Any
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
for (var _i = 0, unionProperties_1 = unionProperties; _i < unionProperties_1.length; _i++) {
|
||
|
var prop = unionProperties_1[_i];
|
||
|
_loop_1(prop);
|
||
|
}
|
||
|
return newSchema;
|
||
|
};
|
||
|
ProtoHelper.prototype.getFlatInterfaceSchema = function (schema) {
|
||
|
var uuid = this._getSchemaUuid(schema);
|
||
|
if (this._flatInterfaceSchemaCache[uuid]) {
|
||
|
return this._flatInterfaceSchemaCache[uuid];
|
||
|
}
|
||
|
if (this.isTypeReference(schema)) {
|
||
|
var parsed = this.parseReference(schema);
|
||
|
if (parsed.type !== SchemaType.Interface) {
|
||
|
throw new Error("Cannot flatten non interface type: " + parsed.type);
|
||
|
}
|
||
|
this._flatInterfaceSchemaCache[uuid] = this.getFlatInterfaceSchema(parsed);
|
||
|
}
|
||
|
else if (schema.type === SchemaType.Interface) {
|
||
|
this._flatInterfaceSchemaCache[uuid] = this._flattenInterface(schema);
|
||
|
}
|
||
|
else {
|
||
|
this._flatInterfaceSchemaCache[uuid] = this._flattenMappedType(schema);
|
||
|
}
|
||
|
return this._flatInterfaceSchemaCache[uuid];
|
||
|
};
|
||
|
ProtoHelper.prototype._flattenInterface = function (schema) {
|
||
|
var properties = {};
|
||
|
var indexSignature;
|
||
|
if (schema.properties) {
|
||
|
for (var _i = 0, _a = schema.properties; _i < _a.length; _i++) {
|
||
|
var prop = _a[_i];
|
||
|
properties[prop.name] = {
|
||
|
optional: prop.optional,
|
||
|
type: prop.type
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
if (schema.indexSignature) {
|
||
|
indexSignature = schema.indexSignature;
|
||
|
}
|
||
|
if (schema.extends) {
|
||
|
for (var _b = 0, _c = schema.extends; _b < _c.length; _b++) {
|
||
|
var extend = _c[_b];
|
||
|
var parsedExtRef = this.parseReference(extend.type);
|
||
|
if (parsedExtRef.type !== SchemaType.Interface) {
|
||
|
throw new Error('SchemaError: extends must from interface but from ' + parsedExtRef.type);
|
||
|
}
|
||
|
var flatenExtendsSchema = this.getFlatInterfaceSchema(parsedExtRef);
|
||
|
if (flatenExtendsSchema.properties) {
|
||
|
for (var _d = 0, _e = flatenExtendsSchema.properties; _d < _e.length; _d++) {
|
||
|
var prop = _e[_d];
|
||
|
if (!properties[prop.name]) {
|
||
|
properties[prop.name] = {
|
||
|
optional: prop.optional,
|
||
|
type: prop.type
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (flatenExtendsSchema.indexSignature && !indexSignature) {
|
||
|
indexSignature = flatenExtendsSchema.indexSignature;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return {
|
||
|
type: SchemaType.Interface,
|
||
|
properties: Object.entries(properties).map(function (v, i) {
|
||
|
return {
|
||
|
id: i,
|
||
|
name: v[0],
|
||
|
optional: v[1].optional,
|
||
|
type: v[1].type
|
||
|
};
|
||
|
}),
|
||
|
indexSignature: indexSignature
|
||
|
};
|
||
|
};
|
||
|
ProtoHelper.prototype._flattenMappedType = function (schema) {
|
||
|
var target;
|
||
|
if (this.isTypeReference(schema.target)) {
|
||
|
var parsed = this.parseReference(schema.target);
|
||
|
target = parsed;
|
||
|
}
|
||
|
else {
|
||
|
target = schema.target;
|
||
|
}
|
||
|
var flatTarget;
|
||
|
if (target.type === SchemaType.Pick || target.type === SchemaType.Partial || target.type === SchemaType.Omit || target.type === SchemaType.Overwrite) {
|
||
|
flatTarget = this._flattenMappedType(target);
|
||
|
}
|
||
|
else if (target.type === SchemaType.Interface) {
|
||
|
flatTarget = this._flattenInterface(target);
|
||
|
}
|
||
|
else {
|
||
|
throw new Error("Invalid target.type: " + target.type);
|
||
|
}
|
||
|
if (schema.type === SchemaType.Pick) {
|
||
|
var properties = [];
|
||
|
var _loop_2 = function _loop_2(key) {
|
||
|
var propItem = flatTarget.properties.find(function (v) {
|
||
|
return v.name === key;
|
||
|
});
|
||
|
if (propItem) {
|
||
|
properties.push({
|
||
|
id: properties.length,
|
||
|
name: key,
|
||
|
optional: propItem.optional,
|
||
|
type: propItem.type
|
||
|
});
|
||
|
}
|
||
|
else if (flatTarget.indexSignature) {
|
||
|
properties.push({
|
||
|
id: properties.length,
|
||
|
name: key,
|
||
|
type: flatTarget.indexSignature.type
|
||
|
});
|
||
|
}
|
||
|
else {
|
||
|
throw new Error("Cannot find pick key [" + key + "]");
|
||
|
}
|
||
|
};
|
||
|
for (var _i = 0, _a = schema.keys; _i < _a.length; _i++) {
|
||
|
var key = _a[_i];
|
||
|
_loop_2(key);
|
||
|
}
|
||
|
return {
|
||
|
type: SchemaType.Interface,
|
||
|
properties: properties
|
||
|
};
|
||
|
}
|
||
|
else if (schema.type === SchemaType.Partial) {
|
||
|
for (var _b = 0, _c = flatTarget.properties; _b < _c.length; _b++) {
|
||
|
var v = _c[_b];
|
||
|
v.optional = true;
|
||
|
}
|
||
|
return flatTarget;
|
||
|
}
|
||
|
else if (schema.type === SchemaType.Omit) {
|
||
|
var _loop_3 = function _loop_3(key) {
|
||
|
flatTarget.properties.removeOne(function (v) {
|
||
|
return v.name === key;
|
||
|
});
|
||
|
};
|
||
|
for (var _d = 0, _e = schema.keys; _d < _e.length; _d++) {
|
||
|
var key = _e[_d];
|
||
|
_loop_3(key);
|
||
|
}
|
||
|
return flatTarget;
|
||
|
}
|
||
|
else if (schema.type === SchemaType.Overwrite) {
|
||
|
var overwrite = this.getFlatInterfaceSchema(schema.overwrite);
|
||
|
if (overwrite.indexSignature) {
|
||
|
flatTarget.indexSignature = overwrite.indexSignature;
|
||
|
}
|
||
|
var _loop_4 = function _loop_4(prop) {
|
||
|
flatTarget.properties.removeOne(function (v) {
|
||
|
return v.name === prop.name;
|
||
|
});
|
||
|
flatTarget.properties.push(prop);
|
||
|
};
|
||
|
for (var _f = 0, _g = overwrite.properties; _f < _g.length; _f++) {
|
||
|
var prop = _g[_f];
|
||
|
_loop_4(prop);
|
||
|
}
|
||
|
return flatTarget;
|
||
|
}
|
||
|
else {
|
||
|
throw new Error("Unknown type: " + schema.type);
|
||
|
}
|
||
|
};
|
||
|
ProtoHelper.prototype.parseMappedType = function (schema) {
|
||
|
var parents = [];
|
||
|
var child = schema;
|
||
|
do {
|
||
|
parents.push(child);
|
||
|
child = this.parseReference(child.target);
|
||
|
} while (child.type === SchemaType.Pick || child.type === SchemaType.Omit || child.type === SchemaType.Partial || child.type === SchemaType.Overwrite);
|
||
|
if (child.type === SchemaType.Interface) {
|
||
|
return child;
|
||
|
}
|
||
|
else if (child.type === SchemaType.Union) {
|
||
|
var newSchema = {
|
||
|
type: SchemaType.Union,
|
||
|
members: child.members.map(function (v) {
|
||
|
var type = v.type;
|
||
|
for (var i = parents.length - 1; i > -1; --i) {
|
||
|
var parent_1 = parents[i];
|
||
|
type = __assign$1(__assign$1({}, parent_1), {
|
||
|
target: type
|
||
|
});
|
||
|
}
|
||
|
return {
|
||
|
id: v.id,
|
||
|
type: type
|
||
|
};
|
||
|
})
|
||
|
};
|
||
|
return newSchema;
|
||
|
}
|
||
|
else {
|
||
|
throw new Error("Unsupported pattern " + schema.type + "<" + child.type + ">");
|
||
|
}
|
||
|
};
|
||
|
return ProtoHelper;
|
||
|
}();
|
||
|
var _a;
|
||
|
var ErrorType;
|
||
|
(function (ErrorType) {
|
||
|
ErrorType["TypeError"] = "TypeError";
|
||
|
ErrorType["InvalidScalarType"] = "InvalidScalarType";
|
||
|
ErrorType["TupleOverLength"] = "TupleOverLength";
|
||
|
ErrorType["InvalidEnumValue"] = "InvalidEnumValue";
|
||
|
ErrorType["InvalidLiteralValue"] = "InvalidLiteralValue";
|
||
|
ErrorType["MissingRequiredProperty"] = "MissingRequiredProperty";
|
||
|
ErrorType["ExcessProperty"] = "ExcessProperty";
|
||
|
ErrorType["InvalidNumberKey"] = "InvalidNumberKey";
|
||
|
ErrorType["UnionTypesNotMatch"] = "UnionTypesNotMatch";
|
||
|
ErrorType["UnionMembersNotMatch"] = "UnionMembersNotMatch";
|
||
|
})(ErrorType || (ErrorType = {}));
|
||
|
var ErrorMsg = (_a = {}, _a[ErrorType.TypeError] = function (expect, actual) {
|
||
|
return "Expected type to be `" + expect + "`, actually `" + actual + "`.";
|
||
|
}, _a[ErrorType.InvalidScalarType] = function (value, scalarType) {
|
||
|
return "`" + value + "` is not a valid `" + scalarType + "`.";
|
||
|
}, _a[ErrorType.TupleOverLength] = function (valueLength, schemaLength) {
|
||
|
return "Value has " + valueLength + " elements but schema allows only " + schemaLength + ".";
|
||
|
}, _a[ErrorType.InvalidEnumValue] = function (value) {
|
||
|
return "`" + value + "` is not a valid enum member.";
|
||
|
}, _a[ErrorType.InvalidLiteralValue] = function (expected, actual) {
|
||
|
return "Expected to equals `" + stringify(expected) + "`, actually `" + stringify(actual) + "`";
|
||
|
}, _a[ErrorType.MissingRequiredProperty] = function (propName) {
|
||
|
return "Missing required property `" + propName + "`.";
|
||
|
}, _a[ErrorType.ExcessProperty] = function (propName) {
|
||
|
return "Excess property `" + propName + "` should not exists.";
|
||
|
}, _a[ErrorType.InvalidNumberKey] = function (key) {
|
||
|
return "`" + key + "` is not a valid key, the key here should be a `number`.";
|
||
|
},
|
||
|
_a[ErrorType.UnionTypesNotMatch] = function (value, types) {
|
||
|
return "`" + stringify(value) + "` is not matched to `" + types.join(' | ') + "`";
|
||
|
}, _a[ErrorType.UnionMembersNotMatch] = function (memberErrors) {
|
||
|
return "No union member matched, detail:\n" + memberErrors.map(function (v, i) {
|
||
|
return " <" + i + "> " + v.errMsg;
|
||
|
}).join('\n');
|
||
|
}, _a);
|
||
|
function stringify(value) {
|
||
|
if (typeof value === 'string') {
|
||
|
var output = JSON.stringify(value);
|
||
|
return "'" + output.substr(1, output.length - 2) + "'";
|
||
|
}
|
||
|
return JSON.stringify(value);
|
||
|
}
|
||
|
var ValidateResultError = function () {
|
||
|
function ValidateResultError(error) {
|
||
|
this.isSucc = false;
|
||
|
this.error = error;
|
||
|
}
|
||
|
Object.defineProperty(ValidateResultError.prototype, "errMsg", {
|
||
|
get: function get() {
|
||
|
return ValidateResultError.getErrMsg(this.error);
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
ValidateResultError.getErrMsg = function (error) {
|
||
|
var _a;
|
||
|
var errMsg = ErrorMsg[error.type].apply(ErrorMsg, error.params);
|
||
|
if ((_a = error.inner) === null || _a === void 0 ? void 0 : _a.property.length) {
|
||
|
return "Property `" + error.inner.property.join('.') + "`: " + errMsg;
|
||
|
}
|
||
|
else {
|
||
|
return errMsg;
|
||
|
}
|
||
|
};
|
||
|
return ValidateResultError;
|
||
|
}();
|
||
|
var ValidateResultUtil = function () {
|
||
|
function ValidateResultUtil() { }
|
||
|
ValidateResultUtil.error = function (type) {
|
||
|
var params = [];
|
||
|
for (var _i = 1; _i < arguments.length; _i++) {
|
||
|
params[_i - 1] = arguments[_i];
|
||
|
}
|
||
|
return new ValidateResultError({
|
||
|
type: type,
|
||
|
params: params
|
||
|
});
|
||
|
};
|
||
|
ValidateResultUtil.innerError = function (property, value, schema, error) {
|
||
|
var _a;
|
||
|
if (error.error.inner) {
|
||
|
if (typeof property === 'string') {
|
||
|
error.error.inner.property.unshift(property);
|
||
|
}
|
||
|
else {
|
||
|
(_a = error.error.inner.property).unshift.apply(_a, property);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
error.error.inner = {
|
||
|
property: typeof property === 'string' ? [property] : property,
|
||
|
value: value,
|
||
|
schema: schema
|
||
|
};
|
||
|
}
|
||
|
return error;
|
||
|
};
|
||
|
ValidateResultUtil.succ = {
|
||
|
isSucc: true
|
||
|
};
|
||
|
return ValidateResultUtil;
|
||
|
}();
|
||
|
var typedArrays = {
|
||
|
Int8Array: Int8Array,
|
||
|
Int16Array: Int16Array,
|
||
|
Int32Array: Int32Array,
|
||
|
BigInt64Array: typeof BigInt64Array !== 'undefined' ? BigInt64Array : undefined,
|
||
|
Uint8Array: Uint8Array,
|
||
|
Uint16Array: Uint16Array,
|
||
|
Uint32Array: Uint32Array,
|
||
|
BigUint64Array: typeof BigUint64Array !== 'undefined' ? BigUint64Array : undefined,
|
||
|
Float32Array: Float32Array,
|
||
|
Float64Array: Float64Array
|
||
|
};
|
||
|
var TSBufferValidator = function () {
|
||
|
function TSBufferValidator(proto, options) {
|
||
|
this.options = {
|
||
|
excessPropertyChecks: true,
|
||
|
strictNullChecks: true,
|
||
|
cloneProto: true
|
||
|
};
|
||
|
if (options) {
|
||
|
this.options = __assign$1(__assign$1({}, this.options), options);
|
||
|
}
|
||
|
this.proto = this.options.cloneProto ? Object.merge({}, proto) : proto;
|
||
|
this.protoHelper = new ProtoHelper(this.proto);
|
||
|
}
|
||
|
TSBufferValidator.prototype.validate = function (value, schemaOrId, options) {
|
||
|
var _a, _b;
|
||
|
var schema;
|
||
|
var schemaId;
|
||
|
if (typeof schemaOrId === 'string') {
|
||
|
schemaId = schemaOrId;
|
||
|
schema = this.proto[schemaId];
|
||
|
if (!schema) {
|
||
|
throw new Error("Cannot find schema: " + schemaId);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
schema = schemaOrId;
|
||
|
}
|
||
|
return this._validate(value, schema, __assign$1(__assign$1({}, options), {
|
||
|
excessPropertyChecks: (_a = options === null || options === void 0 ? void 0 : options.excessPropertyChecks) !== null && _a !== void 0 ? _a : this.options.excessPropertyChecks,
|
||
|
strictNullChecks: (_b = options === null || options === void 0 ? void 0 : options.strictNullChecks) !== null && _b !== void 0 ? _b : this.options.strictNullChecks
|
||
|
}));
|
||
|
};
|
||
|
TSBufferValidator.prototype._validate = function (value, schema, options) {
|
||
|
var _a;
|
||
|
var vRes;
|
||
|
switch (schema.type) {
|
||
|
case SchemaType.Boolean:
|
||
|
vRes = this._validateBooleanType(value, schema);
|
||
|
break;
|
||
|
case SchemaType.Number:
|
||
|
vRes = this._validateNumberType(value, schema);
|
||
|
break;
|
||
|
case SchemaType.String:
|
||
|
vRes = this._validateStringType(value, schema);
|
||
|
break;
|
||
|
case SchemaType.Array:
|
||
|
vRes = this._validateArrayType(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Tuple:
|
||
|
vRes = this._validateTupleType(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Enum:
|
||
|
vRes = this._validateEnumType(value, schema);
|
||
|
break;
|
||
|
case SchemaType.Any:
|
||
|
vRes = this._validateAnyType(value);
|
||
|
break;
|
||
|
case SchemaType.Literal:
|
||
|
vRes = this._validateLiteralType(value, schema, (_a = options === null || options === void 0 ? void 0 : options.strictNullChecks) !== null && _a !== void 0 ? _a : this.options.strictNullChecks);
|
||
|
break;
|
||
|
case SchemaType.Object:
|
||
|
vRes = this._validateObjectType(value, schema);
|
||
|
break;
|
||
|
case SchemaType.Interface:
|
||
|
vRes = this._validateInterfaceType(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Buffer:
|
||
|
vRes = this._validateBufferType(value, schema);
|
||
|
break;
|
||
|
case SchemaType.IndexedAccess:
|
||
|
case SchemaType.Reference:
|
||
|
vRes = this._validateReferenceType(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Union:
|
||
|
vRes = this._validateUnionType(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Intersection:
|
||
|
vRes = this._validateIntersectionType(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Pick:
|
||
|
case SchemaType.Omit:
|
||
|
case SchemaType.Partial:
|
||
|
case SchemaType.Overwrite:
|
||
|
vRes = this._validateMappedType(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Date:
|
||
|
vRes = this._validateDateType(value);
|
||
|
break;
|
||
|
case SchemaType.NonNullable:
|
||
|
vRes = this._validateNonNullableType(value, schema, options);
|
||
|
break;
|
||
|
default:
|
||
|
throw new Error("Unsupported schema type: " + schema.type);
|
||
|
}
|
||
|
if (options === null || options === void 0 ? void 0 : options.prune) {
|
||
|
if (options.prune.output === undefined) {
|
||
|
options.prune.output = value;
|
||
|
}
|
||
|
if (options.prune.parent) {
|
||
|
options.prune.parent.value[options.prune.parent.key] = options.prune.output;
|
||
|
}
|
||
|
}
|
||
|
return vRes;
|
||
|
};
|
||
|
TSBufferValidator.prototype.prune = function (value, schemaOrId, options) {
|
||
|
var _a;
|
||
|
var schema = typeof schemaOrId === 'string' ? this.proto[schemaOrId] : schemaOrId;
|
||
|
if (!schema) {
|
||
|
throw new Error('Cannot find schema: ' + schemaOrId);
|
||
|
}
|
||
|
var prune = {};
|
||
|
var vRes = this._validate(value, schema, __assign$1(__assign$1({}, options), {
|
||
|
prune: prune,
|
||
|
excessPropertyChecks: false,
|
||
|
strictNullChecks: (_a = options === null || options === void 0 ? void 0 : options.strictNullChecks) !== null && _a !== void 0 ? _a : this.options.strictNullChecks
|
||
|
}));
|
||
|
if (vRes.isSucc) {
|
||
|
vRes.pruneOutput = prune.output;
|
||
|
}
|
||
|
return vRes;
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateBooleanType = function (value, schema) {
|
||
|
var type = this._getTypeof(value);
|
||
|
if (type === 'boolean') {
|
||
|
return ValidateResultUtil.succ;
|
||
|
}
|
||
|
else {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, 'boolean', type);
|
||
|
}
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateNumberType = function (value, schema) {
|
||
|
var scalarType = schema.scalarType || 'double';
|
||
|
var type = this._getTypeof(value);
|
||
|
var rightType = scalarType.indexOf('big') > -1 ? 'bigint' : 'number';
|
||
|
if (type !== rightType) {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, rightType, type);
|
||
|
}
|
||
|
if (scalarType !== 'double' && type === 'number' && !Number.isInteger(value)) {
|
||
|
return ValidateResultUtil.error(ErrorType.InvalidScalarType, value, scalarType);
|
||
|
}
|
||
|
if (scalarType.indexOf('uint') > -1 && value < 0) {
|
||
|
return ValidateResultUtil.error(ErrorType.InvalidScalarType, value, scalarType);
|
||
|
}
|
||
|
return ValidateResultUtil.succ;
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateStringType = function (value, schema) {
|
||
|
var type = this._getTypeof(value);
|
||
|
return type === 'string' ? ValidateResultUtil.succ : ValidateResultUtil.error(ErrorType.TypeError, 'string', type);
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateArrayType = function (value, schema, options) {
|
||
|
var type = this._getTypeof(value);
|
||
|
if (type !== SchemaType.Array) {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, SchemaType.Array, type);
|
||
|
}
|
||
|
var prune = options.prune;
|
||
|
if (prune) {
|
||
|
prune.output = Array.from({
|
||
|
length: value.length
|
||
|
});
|
||
|
}
|
||
|
for (var i = 0; i < value.length; ++i) {
|
||
|
var elemValidateResult = this._validate(value[i], schema.elementType, __assign$1(__assign$1({}, options), {
|
||
|
prune: (prune === null || prune === void 0 ? void 0 : prune.output) ? {
|
||
|
parent: {
|
||
|
value: prune.output,
|
||
|
key: i
|
||
|
}
|
||
|
} : undefined
|
||
|
}));
|
||
|
if (!elemValidateResult.isSucc) {
|
||
|
return ValidateResultUtil.innerError('' + i, value[i], schema.elementType, elemValidateResult);
|
||
|
}
|
||
|
}
|
||
|
return ValidateResultUtil.succ;
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateTupleType = function (value, schema, options) {
|
||
|
var type = this._getTypeof(value);
|
||
|
if (type !== SchemaType.Array) {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, SchemaType.Array, type);
|
||
|
}
|
||
|
var prune = options.prune;
|
||
|
if (!prune && options.excessPropertyChecks && value.length > schema.elementTypes.length) {
|
||
|
return ValidateResultUtil.error(ErrorType.TupleOverLength, value.length, schema.elementTypes.length);
|
||
|
}
|
||
|
if (prune) {
|
||
|
prune.output = Array.from({
|
||
|
length: Math.min(value.length, schema.elementTypes.length)
|
||
|
});
|
||
|
}
|
||
|
for (var i = 0; i < schema.elementTypes.length; ++i) {
|
||
|
if (value[i] === undefined || value[i] === null && !options.strictNullChecks) {
|
||
|
var isOptional = schema.optionalStartIndex !== undefined && i >= schema.optionalStartIndex || this._canBeUndefined(schema.elementTypes[i]);
|
||
|
if (isOptional) {
|
||
|
continue;
|
||
|
}
|
||
|
else {
|
||
|
return ValidateResultUtil.error(ErrorType.MissingRequiredProperty, i);
|
||
|
}
|
||
|
}
|
||
|
var elemValidateResult = this._validate(value[i], schema.elementTypes[i], {
|
||
|
prune: (prune === null || prune === void 0 ? void 0 : prune.output) ? {
|
||
|
parent: {
|
||
|
value: prune.output,
|
||
|
key: i
|
||
|
}
|
||
|
} : undefined,
|
||
|
strictNullChecks: options.strictNullChecks,
|
||
|
excessPropertyChecks: options.excessPropertyChecks
|
||
|
});
|
||
|
if (!elemValidateResult.isSucc) {
|
||
|
return ValidateResultUtil.innerError('' + i, value[i], schema.elementTypes[i], elemValidateResult);
|
||
|
}
|
||
|
}
|
||
|
return ValidateResultUtil.succ;
|
||
|
};
|
||
|
TSBufferValidator.prototype._canBeUndefined = function (schema) {
|
||
|
var _this = this;
|
||
|
if (schema.type === SchemaType.Union) {
|
||
|
return schema.members.some(function (v) {
|
||
|
return _this._canBeUndefined(v.type);
|
||
|
});
|
||
|
}
|
||
|
if (schema.type === SchemaType.Literal && schema.literal === undefined) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateEnumType = function (value, schema) {
|
||
|
var type = this._getTypeof(value);
|
||
|
if (type !== 'string' && type !== 'number') {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, 'string | number', type);
|
||
|
}
|
||
|
if (schema.members.some(function (v) {
|
||
|
return v.value === value;
|
||
|
})) {
|
||
|
return ValidateResultUtil.succ;
|
||
|
}
|
||
|
else {
|
||
|
return ValidateResultUtil.error(ErrorType.InvalidEnumValue, value);
|
||
|
}
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateAnyType = function (value) {
|
||
|
return ValidateResultUtil.succ;
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateLiteralType = function (value, schema, strictNullChecks) {
|
||
|
if (!strictNullChecks && (schema.literal === null || schema.literal === undefined)) {
|
||
|
return value === null || value === undefined ? ValidateResultUtil.succ : ValidateResultUtil.error(ErrorType.InvalidLiteralValue, schema.literal, value);
|
||
|
}
|
||
|
return value === schema.literal ? ValidateResultUtil.succ : ValidateResultUtil.error(ErrorType.InvalidLiteralValue, schema.literal, value);
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateObjectType = function (value, schema) {
|
||
|
var type = this._getTypeof(value);
|
||
|
return type === 'Object' || type === 'Array' ? ValidateResultUtil.succ : ValidateResultUtil.error(ErrorType.TypeError, 'Object', type);
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateInterfaceType = function (value, schema, options) {
|
||
|
var type = this._getTypeof(value);
|
||
|
if (type !== 'Object') {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, 'Object', type);
|
||
|
}
|
||
|
var flatSchema = this.protoHelper.getFlatInterfaceSchema(schema);
|
||
|
if (options.unionProperties) {
|
||
|
flatSchema = this.protoHelper.applyUnionProperties(flatSchema, options.unionProperties);
|
||
|
}
|
||
|
return this._validateFlatInterface(value, flatSchema, options);
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateMappedType = function (value, schema, options) {
|
||
|
var parsed = this.protoHelper.parseMappedType(schema);
|
||
|
if (parsed.type === SchemaType.Interface) {
|
||
|
return this._validateInterfaceType(value, schema, options);
|
||
|
}
|
||
|
else if (parsed.type === SchemaType.Union) {
|
||
|
return this._validateUnionType(value, parsed, options);
|
||
|
}
|
||
|
throw new Error();
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateFlatInterface = function (value, schema, options) {
|
||
|
if (schema.indexSignature && schema.indexSignature.keyType === SchemaType.Number) {
|
||
|
for (var key in value) {
|
||
|
if (!this._isNumberKey(key)) {
|
||
|
return ValidateResultUtil.error(ErrorType.InvalidNumberKey, key);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var prune = options.prune;
|
||
|
if (prune) {
|
||
|
prune.output = {};
|
||
|
}
|
||
|
if (!prune && options.excessPropertyChecks && !schema.indexSignature) {
|
||
|
var validProperties_1 = schema.properties.map(function (v) {
|
||
|
return v.name;
|
||
|
});
|
||
|
var firstExcessProperty = Object.keys(value).find(function (v) {
|
||
|
return validProperties_1.indexOf(v) === -1;
|
||
|
});
|
||
|
if (firstExcessProperty) {
|
||
|
return ValidateResultUtil.error(ErrorType.ExcessProperty, firstExcessProperty);
|
||
|
}
|
||
|
}
|
||
|
if (schema.properties) {
|
||
|
for (var _i = 0, _a = schema.properties; _i < _a.length; _i++) {
|
||
|
var property = _a[_i];
|
||
|
if (value[property.name] === undefined || value[property.name] === null && !options.strictNullChecks) {
|
||
|
var isOptional = property.optional || this._canBeUndefined(property.type);
|
||
|
if (isOptional) {
|
||
|
continue;
|
||
|
}
|
||
|
else {
|
||
|
return ValidateResultUtil.error(ErrorType.MissingRequiredProperty, property.name);
|
||
|
}
|
||
|
}
|
||
|
var vRes = this._validate(value[property.name], property.type, {
|
||
|
prune: (prune === null || prune === void 0 ? void 0 : prune.output) && property.id > -1 ? {
|
||
|
parent: {
|
||
|
value: prune.output,
|
||
|
key: property.name
|
||
|
}
|
||
|
} : undefined,
|
||
|
strictNullChecks: options.strictNullChecks,
|
||
|
excessPropertyChecks: options.excessPropertyChecks
|
||
|
});
|
||
|
if (!vRes.isSucc) {
|
||
|
return ValidateResultUtil.innerError(property.name, value[property.name], property.type, vRes);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (schema.indexSignature) {
|
||
|
for (var key in value) {
|
||
|
var vRes = this._validate(value[key], schema.indexSignature.type, {
|
||
|
prune: (prune === null || prune === void 0 ? void 0 : prune.output) ? {
|
||
|
parent: {
|
||
|
value: prune.output,
|
||
|
key: key
|
||
|
}
|
||
|
} : undefined,
|
||
|
strictNullChecks: options.strictNullChecks,
|
||
|
excessPropertyChecks: options.excessPropertyChecks
|
||
|
});
|
||
|
if (!vRes.isSucc) {
|
||
|
return ValidateResultUtil.innerError(key, value[key], schema.indexSignature.type, vRes);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ValidateResultUtil.succ;
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateBufferType = function (value, schema) {
|
||
|
var _a, _b;
|
||
|
var type = this._getTypeof(value);
|
||
|
if (type !== 'Object') {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, schema.arrayType || 'ArrayBuffer', type);
|
||
|
}
|
||
|
else if (schema.arrayType) {
|
||
|
var typeArrayClass = typedArrays[schema.arrayType];
|
||
|
if (!typeArrayClass) {
|
||
|
throw new Error("Error TypedArray type: " + schema.arrayType);
|
||
|
}
|
||
|
return value instanceof typeArrayClass ? ValidateResultUtil.succ : ValidateResultUtil.error(ErrorType.TypeError, schema.arrayType, (_a = value === null || value === void 0 ? void 0 : value.constructor) === null || _a === void 0 ? void 0 : _a.name);
|
||
|
}
|
||
|
else {
|
||
|
return value instanceof ArrayBuffer ? ValidateResultUtil.succ : ValidateResultUtil.error(ErrorType.TypeError, 'ArrayBuffer', (_b = value === null || value === void 0 ? void 0 : value.constructor) === null || _b === void 0 ? void 0 : _b.name);
|
||
|
}
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateReferenceType = function (value, schema, options) {
|
||
|
return this._validate(value, this.protoHelper.parseReference(schema), options);
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateUnionType = function (value, schema, options) {
|
||
|
var _this = this;
|
||
|
options.unionProperties = options.unionProperties || this.protoHelper.getUnionProperties(schema);
|
||
|
var isObjectPrune = false;
|
||
|
var prune = options.prune;
|
||
|
if (prune && value && Object.getPrototypeOf(value) === Object.prototype) {
|
||
|
isObjectPrune = true;
|
||
|
prune.output = {};
|
||
|
}
|
||
|
var isSomeSucc = false;
|
||
|
var memberErrors = [];
|
||
|
for (var i = 0; i < schema.members.length; ++i) {
|
||
|
var member = schema.members[i];
|
||
|
var memberType = this.protoHelper.isTypeReference(member.type) ? this.protoHelper.parseReference(member.type) : member.type;
|
||
|
var memberPrune = prune ? {} : undefined;
|
||
|
var vRes = this._validate(value, memberType, __assign$1(__assign$1({}, options), {
|
||
|
prune: memberPrune
|
||
|
}));
|
||
|
if (vRes.isSucc) {
|
||
|
isSomeSucc = true;
|
||
|
if (isObjectPrune) {
|
||
|
prune.output = __assign$1(__assign$1({}, prune.output), memberPrune.output);
|
||
|
}
|
||
|
else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
memberErrors.push(vRes);
|
||
|
}
|
||
|
}
|
||
|
if (isSomeSucc) {
|
||
|
return ValidateResultUtil.succ;
|
||
|
}
|
||
|
else {
|
||
|
var msg0_1 = memberErrors[0].errMsg;
|
||
|
if (memberErrors.every(function (v) {
|
||
|
return v.errMsg === msg0_1;
|
||
|
})) {
|
||
|
return memberErrors[0];
|
||
|
}
|
||
|
var nonLiteralErrors = memberErrors.filter(function (v) {
|
||
|
return v.error.type !== ErrorType.InvalidLiteralValue;
|
||
|
});
|
||
|
if (nonLiteralErrors.length === 1) {
|
||
|
return nonLiteralErrors[0];
|
||
|
}
|
||
|
if (memberErrors.every(function (v) {
|
||
|
return !v.error.inner && (v.error.type === ErrorType.TypeError || v.error.type === ErrorType.InvalidLiteralValue);
|
||
|
})) {
|
||
|
var valueType = this._getTypeof(value);
|
||
|
var expectedTypes = memberErrors.map(function (v) {
|
||
|
return v.error.type === ErrorType.TypeError ? v.error.params[0] : _this._getTypeof(v.error.params[0]);
|
||
|
}).distinct();
|
||
|
if (expectedTypes.indexOf(valueType) === -1) {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, expectedTypes.join(' | '), this._getTypeof(value));
|
||
|
}
|
||
|
if (valueType !== 'Object' && valueType !== SchemaType.Array) {
|
||
|
var types = memberErrors.map(function (v) {
|
||
|
return v.error.type === ErrorType.TypeError ? v.error.params[0] : stringify(v.error.params[0]);
|
||
|
}).distinct();
|
||
|
return ValidateResultUtil.error(ErrorType.UnionTypesNotMatch, value, types);
|
||
|
}
|
||
|
}
|
||
|
return ValidateResultUtil.error(ErrorType.UnionMembersNotMatch, memberErrors);
|
||
|
}
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateIntersectionType = function (value, schema, options) {
|
||
|
options.unionProperties = options.unionProperties || this.protoHelper.getUnionProperties(schema);
|
||
|
var isObjectPrune = false;
|
||
|
var prune = options.prune;
|
||
|
if (prune && value && Object.getPrototypeOf(value) === Object.prototype) {
|
||
|
prune.output = {};
|
||
|
isObjectPrune = true;
|
||
|
}
|
||
|
for (var i = 0, len = schema.members.length; i < len; ++i) {
|
||
|
var memberType = schema.members[i].type;
|
||
|
memberType = this.protoHelper.isTypeReference(memberType) ? this.protoHelper.parseReference(memberType) : memberType;
|
||
|
var memberPrune = prune ? {} : undefined;
|
||
|
var vRes = this._validate(value, memberType, __assign$1(__assign$1({}, options), {
|
||
|
prune: memberPrune
|
||
|
}));
|
||
|
if (!vRes.isSucc) {
|
||
|
return vRes;
|
||
|
}
|
||
|
if (isObjectPrune) {
|
||
|
prune.output = __assign$1(__assign$1({}, prune.output), memberPrune.output);
|
||
|
}
|
||
|
}
|
||
|
return ValidateResultUtil.succ;
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateDateType = function (value) {
|
||
|
if (value instanceof Date) {
|
||
|
return ValidateResultUtil.succ;
|
||
|
}
|
||
|
else {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, 'Date', this._getTypeof(value));
|
||
|
}
|
||
|
};
|
||
|
TSBufferValidator.prototype._validateNonNullableType = function (value, schema, options) {
|
||
|
var type = this._getTypeof(value);
|
||
|
if ((type === 'null' || type === 'undefined') && schema.target.type !== 'Any') {
|
||
|
return ValidateResultUtil.error(ErrorType.TypeError, 'NonNullable', type);
|
||
|
}
|
||
|
return this._validate(value, schema.target, options);
|
||
|
};
|
||
|
TSBufferValidator.prototype._isNumberKey = function (key) {
|
||
|
var int = parseInt(key);
|
||
|
return !(isNaN(int) || '' + int !== key);
|
||
|
};
|
||
|
TSBufferValidator.prototype._getTypeof = function (value) {
|
||
|
var type = _typeof(value);
|
||
|
if (type === 'object') {
|
||
|
if (value === null) {
|
||
|
return 'null';
|
||
|
}
|
||
|
else if (Array.isArray(value)) {
|
||
|
return SchemaType.Array;
|
||
|
}
|
||
|
else {
|
||
|
return 'Object';
|
||
|
}
|
||
|
}
|
||
|
return type;
|
||
|
};
|
||
|
return TSBufferValidator;
|
||
|
}();
|
||
|
var IdBlockUtil = function () {
|
||
|
function IdBlockUtil() { }
|
||
|
IdBlockUtil.getPayloadLengthInfo = function (parsedSchema) {
|
||
|
switch (parsedSchema.type) {
|
||
|
case SchemaType.Boolean:
|
||
|
case SchemaType.Enum:
|
||
|
return {
|
||
|
lengthType: LengthType.Varint
|
||
|
};
|
||
|
case SchemaType.Number:
|
||
|
if (!parsedSchema.scalarType || parsedSchema.scalarType.includes('64') || parsedSchema.scalarType === 'double') {
|
||
|
return {
|
||
|
lengthType: LengthType.Bit64
|
||
|
};
|
||
|
}
|
||
|
else if (parsedSchema.scalarType && parsedSchema.scalarType.startsWith('big')) {
|
||
|
return {
|
||
|
lengthType: LengthType.LengthDelimited
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
return {
|
||
|
lengthType: LengthType.Varint
|
||
|
};
|
||
|
}
|
||
|
case SchemaType.Buffer:
|
||
|
case SchemaType.String:
|
||
|
case SchemaType.Any:
|
||
|
case SchemaType.Object:
|
||
|
return {
|
||
|
lengthType: LengthType.LengthDelimited
|
||
|
};
|
||
|
case SchemaType.Interface:
|
||
|
case SchemaType.Pick:
|
||
|
case SchemaType.Partial:
|
||
|
case SchemaType.Omit:
|
||
|
case SchemaType.Union:
|
||
|
case SchemaType.Intersection:
|
||
|
return {
|
||
|
lengthType: LengthType.IdBlock
|
||
|
};
|
||
|
case SchemaType.Array:
|
||
|
case SchemaType.Overwrite:
|
||
|
case SchemaType.Tuple:
|
||
|
return {
|
||
|
lengthType: LengthType.LengthDelimited,
|
||
|
needLengthPrefix: true
|
||
|
};
|
||
|
case SchemaType.Literal:
|
||
|
return {
|
||
|
lengthType: LengthType.LengthDelimited,
|
||
|
needLengthPrefix: false
|
||
|
};
|
||
|
case SchemaType.Date:
|
||
|
return {
|
||
|
lengthType: LengthType.Varint
|
||
|
};
|
||
|
default:
|
||
|
throw new Error("Unrecognized schema type: " + parsedSchema.type);
|
||
|
}
|
||
|
};
|
||
|
return IdBlockUtil;
|
||
|
}();
|
||
|
var LengthType;
|
||
|
(function (LengthType) {
|
||
|
LengthType[LengthType["LengthDelimited"] = 0] = "LengthDelimited";
|
||
|
LengthType[LengthType["Varint"] = 1] = "Varint";
|
||
|
LengthType[LengthType["Bit64"] = 2] = "Bit64";
|
||
|
LengthType[LengthType["IdBlock"] = 3] = "IdBlock";
|
||
|
})(LengthType || (LengthType = {}));
|
||
|
var SchemaUtil = function () {
|
||
|
function SchemaUtil() { }
|
||
|
SchemaUtil.canBeLiteral = function (schema, literal) {
|
||
|
var _this = this;
|
||
|
if (schema.type === SchemaType.Union) {
|
||
|
return schema.members.some(function (v) {
|
||
|
return _this.canBeLiteral(v.type, literal);
|
||
|
});
|
||
|
}
|
||
|
if (schema.type === SchemaType.Any) {
|
||
|
return true;
|
||
|
}
|
||
|
if (schema.type === SchemaType.Literal && schema.literal === literal) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
return SchemaUtil;
|
||
|
}();
|
||
|
var TypedArrays = {
|
||
|
Int8Array: Int8Array,
|
||
|
Int16Array: Int16Array,
|
||
|
Int32Array: Int32Array,
|
||
|
Uint8Array: Uint8Array,
|
||
|
Uint16Array: Uint16Array,
|
||
|
Uint32Array: Uint32Array,
|
||
|
Float32Array: Float32Array,
|
||
|
Float64Array: Float64Array
|
||
|
};
|
||
|
var Utf8CoderJS = {
|
||
|
measureLength: function measureLength(str) {
|
||
|
var len = 0, c = 0;
|
||
|
for (var i = 0; i < str.length; ++i) {
|
||
|
c = str.charCodeAt(i);
|
||
|
if (c < 128)
|
||
|
len += 1;
|
||
|
else if (c < 2048)
|
||
|
len += 2;
|
||
|
else if ((c & 0xFC00) === 0xD800 && (str.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {
|
||
|
++i;
|
||
|
len += 4;
|
||
|
}
|
||
|
else
|
||
|
len += 3;
|
||
|
}
|
||
|
return len;
|
||
|
},
|
||
|
write: function write(str, buf, pos) {
|
||
|
var start = pos, c1, c2;
|
||
|
for (var i = 0; i < str.length; ++i) {
|
||
|
c1 = str.charCodeAt(i);
|
||
|
if (c1 < 128) {
|
||
|
buf[pos++] = c1;
|
||
|
}
|
||
|
else if (c1 < 2048) {
|
||
|
buf[pos++] = c1 >> 6 | 192;
|
||
|
buf[pos++] = c1 & 63 | 128;
|
||
|
}
|
||
|
else if ((c1 & 0xFC00) === 0xD800 && ((c2 = str.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {
|
||
|
c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);
|
||
|
++i;
|
||
|
buf[pos++] = c1 >> 18 | 240;
|
||
|
buf[pos++] = c1 >> 12 & 63 | 128;
|
||
|
buf[pos++] = c1 >> 6 & 63 | 128;
|
||
|
buf[pos++] = c1 & 63 | 128;
|
||
|
}
|
||
|
else {
|
||
|
buf[pos++] = c1 >> 12 | 224;
|
||
|
buf[pos++] = c1 >> 6 & 63 | 128;
|
||
|
buf[pos++] = c1 & 63 | 128;
|
||
|
}
|
||
|
}
|
||
|
return pos - start;
|
||
|
},
|
||
|
read: function read(buf, pos, length) {
|
||
|
if (length < 1)
|
||
|
return "";
|
||
|
var parts = undefined, chunk = [], i = 0, t;
|
||
|
var end = pos + length;
|
||
|
while (pos < end) {
|
||
|
t = buf[pos++];
|
||
|
if (t < 128)
|
||
|
chunk[i++] = t;
|
||
|
else if (t > 191 && t < 224)
|
||
|
chunk[i++] = (t & 31) << 6 | buf[pos++] & 63;
|
||
|
else if (t > 239 && t < 365) {
|
||
|
t = ((t & 7) << 18 | (buf[pos++] & 63) << 12 | (buf[pos++] & 63) << 6 | buf[pos++] & 63) - 0x10000;
|
||
|
chunk[i++] = 0xD800 + (t >> 10);
|
||
|
chunk[i++] = 0xDC00 + (t & 1023);
|
||
|
}
|
||
|
else
|
||
|
chunk[i++] = (t & 15) << 12 | (buf[pos++] & 63) << 6 | buf[pos++] & 63;
|
||
|
if (i > 8191) {
|
||
|
(parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));
|
||
|
i = 0;
|
||
|
}
|
||
|
}
|
||
|
if (parts) {
|
||
|
if (i)
|
||
|
parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));
|
||
|
return parts.join("");
|
||
|
}
|
||
|
return String.fromCharCode.apply(String, chunk.slice(0, i));
|
||
|
}
|
||
|
};
|
||
|
var Utf8CoderNode = {
|
||
|
measureLength: function measureLength(str) {
|
||
|
return Buffer.byteLength(str, 'utf-8');
|
||
|
},
|
||
|
write: function write(str, buf, pos) {
|
||
|
return Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength).write(str, pos, 'utf-8');
|
||
|
},
|
||
|
read: function read(buf, pos, length) {
|
||
|
return Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength).toString('utf-8', pos, pos + length);
|
||
|
}
|
||
|
};
|
||
|
var Utf8Coder = typeof Buffer !== 'undefined' && Buffer.from && Buffer.prototype.write ? Utf8CoderNode : Utf8CoderJS;
|
||
|
var Varint64 = function () {
|
||
|
function Varint64(high, low, byteLength) {
|
||
|
this.uint32s = new Uint32Array([high, low]);
|
||
|
if (byteLength !== undefined) {
|
||
|
this._byteLength = byteLength;
|
||
|
}
|
||
|
}
|
||
|
Varint64.from = function (value) {
|
||
|
if (value === 0) {
|
||
|
return this.Zero;
|
||
|
}
|
||
|
var sign = value < 0;
|
||
|
if (sign) {
|
||
|
value = -value;
|
||
|
}
|
||
|
var lo = value >>> 0, hi = (value - lo) / 4294967296 >>> 0;
|
||
|
if (sign) {
|
||
|
hi = ~hi >>> 0;
|
||
|
lo = ~lo >>> 0;
|
||
|
if (++lo > 4294967295) {
|
||
|
lo = 0;
|
||
|
if (++hi > 4294967295)
|
||
|
hi = 0;
|
||
|
}
|
||
|
}
|
||
|
return new Varint64(hi, lo);
|
||
|
};
|
||
|
Varint64.prototype.toNumber = function (unsigned) {
|
||
|
if (!unsigned && this.uint32s[0] >>> 31) {
|
||
|
var low = ~this.uint32s[1] + 1 >>> 0, high = ~this.uint32s[0] >>> 0;
|
||
|
if (!low)
|
||
|
high = high + 1 >>> 0;
|
||
|
return -(low + high * 4294967296);
|
||
|
}
|
||
|
return this.uint32s[1] + this.uint32s[0] * 4294967296;
|
||
|
};
|
||
|
Varint64.prototype.zzEncode = function () {
|
||
|
var mask = this.uint32s[0] >> 31;
|
||
|
this.uint32s[0] = ((this.uint32s[0] << 1 | this.uint32s[1] >>> 31) ^ mask) >>> 0;
|
||
|
this.uint32s[1] = (this.uint32s[1] << 1 ^ mask) >>> 0;
|
||
|
return this;
|
||
|
};
|
||
|
Varint64.prototype.zzDecode = function () {
|
||
|
var mask = -(this.uint32s[1] & 1);
|
||
|
this.uint32s[1] = ((this.uint32s[1] >>> 1 | this.uint32s[0] << 31) ^ mask) >>> 0;
|
||
|
this.uint32s[0] = (this.uint32s[0] >>> 1 ^ mask) >>> 0;
|
||
|
return this;
|
||
|
};
|
||
|
Object.defineProperty(Varint64.prototype, "byteLength", {
|
||
|
get: function get() {
|
||
|
if (this._byteLength === undefined) {
|
||
|
var part0 = this.uint32s[1], part1 = (this.uint32s[1] >>> 28 | this.uint32s[0] << 4) >>> 0, part2 = this.uint32s[0] >>> 24;
|
||
|
this._byteLength = part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10;
|
||
|
}
|
||
|
return this._byteLength;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
Varint64.prototype.writeToBuffer = function (buf, pos) {
|
||
|
while (this.uint32s[0]) {
|
||
|
buf[pos++] = this.uint32s[1] & 127 | 128;
|
||
|
this.uint32s[1] = (this.uint32s[1] >>> 7 | this.uint32s[0] << 25) >>> 0;
|
||
|
this.uint32s[0] >>>= 7;
|
||
|
}
|
||
|
while (this.uint32s[1] > 127) {
|
||
|
buf[pos++] = this.uint32s[1] & 127 | 128;
|
||
|
this.uint32s[1] = this.uint32s[1] >>> 7;
|
||
|
}
|
||
|
buf[pos++] = this.uint32s[1];
|
||
|
return pos;
|
||
|
};
|
||
|
Varint64.readFromBuffer = function (buf, pos) {
|
||
|
var startPos = pos;
|
||
|
var hi = 0, lo = 0;
|
||
|
var i = 0;
|
||
|
if (buf.byteLength - pos > 4) {
|
||
|
for (; i < 4; ++i) {
|
||
|
lo = (lo | (buf[pos] & 127) << i * 7) >>> 0;
|
||
|
if (buf[pos++] < 128)
|
||
|
return new Varint64(hi, lo, pos - startPos);
|
||
|
}
|
||
|
lo = (lo | (buf[pos] & 127) << 28) >>> 0;
|
||
|
hi = (hi | (buf[pos] & 127) >> 4) >>> 0;
|
||
|
if (buf[pos++] < 128)
|
||
|
return new Varint64(hi, lo, pos - startPos);
|
||
|
i = 0;
|
||
|
}
|
||
|
else {
|
||
|
for (; i < 3; ++i) {
|
||
|
if (pos >= buf.byteLength)
|
||
|
throw new Error('Read varint error: index out of range');
|
||
|
lo = (lo | (buf[pos] & 127) << i * 7) >>> 0;
|
||
|
if (buf[pos++] < 128)
|
||
|
return new Varint64(hi, lo, pos - startPos);
|
||
|
}
|
||
|
lo = (lo | (buf[pos++] & 127) << i * 7) >>> 0;
|
||
|
return new Varint64(hi, lo, pos - startPos);
|
||
|
}
|
||
|
if (buf.byteLength - pos > 4) {
|
||
|
for (; i < 5; ++i) {
|
||
|
hi = (hi | (buf[pos] & 127) << i * 7 + 3) >>> 0;
|
||
|
if (buf[pos++] < 128)
|
||
|
return new Varint64(hi, lo, pos - startPos);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
for (; i < 5; ++i) {
|
||
|
if (pos >= buf.byteLength)
|
||
|
throw new Error('Read varint error: index out of range');
|
||
|
hi = (hi | (buf[pos] & 127) << i * 7 + 3) >>> 0;
|
||
|
if (buf[pos++] < 128)
|
||
|
return new Varint64(hi, lo, pos - startPos);
|
||
|
}
|
||
|
}
|
||
|
throw Error("invalid varint encoding");
|
||
|
};
|
||
|
Varint64.Zero = new Varint64(0, 0);
|
||
|
return Varint64;
|
||
|
}();
|
||
|
var BufferReader = function () {
|
||
|
function BufferReader() {
|
||
|
this._pos = 0;
|
||
|
}
|
||
|
BufferReader.prototype.load = function (buf, pos) {
|
||
|
if (pos === void 0) {
|
||
|
pos = 0;
|
||
|
}
|
||
|
this._buf = buf;
|
||
|
this._pos = pos;
|
||
|
this._view = new DataView(buf.buffer);
|
||
|
};
|
||
|
BufferReader.prototype.readVarint = function () {
|
||
|
var varint = Varint64.readFromBuffer(this._buf, this._pos);
|
||
|
this._pos += varint.byteLength;
|
||
|
return varint;
|
||
|
};
|
||
|
BufferReader.prototype.readUint = function () {
|
||
|
return this.readVarint().toNumber(true);
|
||
|
};
|
||
|
BufferReader.prototype.readInt = function () {
|
||
|
return this.readVarint().zzDecode().toNumber();
|
||
|
};
|
||
|
BufferReader.prototype.readDouble = function () {
|
||
|
var pos = this._pos;
|
||
|
this._pos += 8;
|
||
|
return this._view.getFloat64(this._buf.byteOffset + pos);
|
||
|
};
|
||
|
BufferReader.prototype.readString = function () {
|
||
|
var strByteLength = this.readUint();
|
||
|
var str = Utf8Coder.read(this._buf, this._pos, strByteLength);
|
||
|
this._pos += strByteLength;
|
||
|
return str;
|
||
|
};
|
||
|
BufferReader.prototype.readBuffer = function () {
|
||
|
var bufByteLength = this.readUint();
|
||
|
var buf = this._buf.subarray(this._pos, this._pos + bufByteLength);
|
||
|
this._pos += bufByteLength;
|
||
|
return buf;
|
||
|
};
|
||
|
BufferReader.prototype.skip = function (byteLength) {
|
||
|
this._pos += byteLength;
|
||
|
};
|
||
|
BufferReader.prototype.skipByLengthType = function (lengthType) {
|
||
|
if (lengthType === LengthType.Bit64) {
|
||
|
this._pos += 8;
|
||
|
}
|
||
|
else if (lengthType === LengthType.Varint) {
|
||
|
this.readVarint();
|
||
|
}
|
||
|
else if (lengthType === LengthType.LengthDelimited) {
|
||
|
var bufByteLength = this.readUint();
|
||
|
this._pos += bufByteLength;
|
||
|
}
|
||
|
else if (lengthType === LengthType.IdBlock) {
|
||
|
this.skipIdBlock();
|
||
|
}
|
||
|
else {
|
||
|
throw new Error('Unknown lengthType: ' + lengthType);
|
||
|
}
|
||
|
};
|
||
|
BufferReader.prototype.skipIdBlock = function () {
|
||
|
var idNum = this.readUint();
|
||
|
for (var i = 0; i < idNum; ++i) {
|
||
|
var id = this.readUint();
|
||
|
var lengthType = id & 3;
|
||
|
this.skipByLengthType(lengthType);
|
||
|
}
|
||
|
};
|
||
|
BufferReader.prototype.readBoolean = function () {
|
||
|
var value = this._view.getUint8(this._buf.byteOffset + this._pos++);
|
||
|
if (value === 255) {
|
||
|
return true;
|
||
|
}
|
||
|
else if (value === 0) {
|
||
|
return false;
|
||
|
}
|
||
|
else {
|
||
|
throw new Error("Invalid boolean encoding [" + value + "] at pos " + (this._pos - 1));
|
||
|
}
|
||
|
};
|
||
|
Object.defineProperty(BufferReader.prototype, "unreadByteLength", {
|
||
|
get: function get() {
|
||
|
return this._buf.byteLength - this._pos;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
BufferReader.prototype.dispose = function () {
|
||
|
this._buf = this._view = undefined;
|
||
|
};
|
||
|
return BufferReader;
|
||
|
}();
|
||
|
var Decoder = function () {
|
||
|
function Decoder(options) {
|
||
|
this._options = options;
|
||
|
this._reader = new BufferReader();
|
||
|
this._validator = options.validator;
|
||
|
}
|
||
|
Decoder.prototype.decode = function (buffer, schema) {
|
||
|
this._reader.load(buffer);
|
||
|
return this._read(schema);
|
||
|
};
|
||
|
Decoder.prototype._read = function (schema) {
|
||
|
switch (schema.type) {
|
||
|
case SchemaType.Boolean:
|
||
|
return this._reader.readBoolean();
|
||
|
case SchemaType.Number:
|
||
|
return this._readNumber(schema);
|
||
|
case SchemaType.String:
|
||
|
return this._reader.readString();
|
||
|
case SchemaType.Array:
|
||
|
{
|
||
|
var output = [];
|
||
|
var length_1 = this._reader.readUint();
|
||
|
for (var i = 0; i < length_1; ++i) {
|
||
|
var item = this._read(schema.elementType);
|
||
|
output.push(item);
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
case SchemaType.Tuple:
|
||
|
{
|
||
|
if (schema.elementTypes.length > 64) {
|
||
|
throw new Error('Elements oversized, maximum supported tuple elements is 64, now get ' + schema.elementTypes.length);
|
||
|
}
|
||
|
var output = [];
|
||
|
var payloadMask = this._reader.readVarint();
|
||
|
var maskIndices = [];
|
||
|
for (var i = 0; i < 32; ++i) {
|
||
|
if (payloadMask.uint32s[1] & 1 << i) {
|
||
|
maskIndices.push(i);
|
||
|
}
|
||
|
}
|
||
|
for (var i = 0; i < 32; ++i) {
|
||
|
if (payloadMask.uint32s[0] & 1 << i) {
|
||
|
maskIndices.push(i + 32);
|
||
|
}
|
||
|
}
|
||
|
if (!maskIndices.length) {
|
||
|
return [];
|
||
|
}
|
||
|
var maxIndex = maskIndices.last();
|
||
|
for (var i = 0, nextMaskIndex = 0, next = maskIndices[0]; i <= maxIndex; ++i) {
|
||
|
if (i === next) {
|
||
|
output[i] = this._read(schema.elementTypes[i]);
|
||
|
++nextMaskIndex;
|
||
|
next = maskIndices[nextMaskIndex];
|
||
|
}
|
||
|
else {
|
||
|
output[i] = undefined;
|
||
|
}
|
||
|
}
|
||
|
for (var i = 0; i < schema.elementTypes.length; ++i) {
|
||
|
if (this._undefinedAsNull(output[i], schema.elementTypes[i], schema.optionalStartIndex !== undefined && i >= schema.optionalStartIndex)) {
|
||
|
output[i] = null;
|
||
|
}
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
case SchemaType.Enum:
|
||
|
var enumId_1 = this._reader.readVarint().toNumber();
|
||
|
var enumItem = schema.members.find(function (v) {
|
||
|
return v.id === enumId_1;
|
||
|
});
|
||
|
if (!enumItem) {
|
||
|
throw new Error("Invalid enum encoding: unexpected id " + enumId_1);
|
||
|
}
|
||
|
return enumItem.value;
|
||
|
case SchemaType.Any:
|
||
|
case SchemaType.Object:
|
||
|
var jsonStr = this._reader.readString();
|
||
|
if (jsonStr === 'undefined') {
|
||
|
return undefined;
|
||
|
}
|
||
|
return JSON.parse(jsonStr);
|
||
|
case SchemaType.Literal:
|
||
|
return schema.literal;
|
||
|
case SchemaType.Interface:
|
||
|
return this._readInterface(schema);
|
||
|
case SchemaType.Buffer:
|
||
|
var uint8Arr = this._reader.readBuffer();
|
||
|
if (schema.arrayType) {
|
||
|
if (schema.arrayType === 'BigInt64Array' || schema.arrayType === 'BigUint64Array') {
|
||
|
throw new Error('Unsupported arrayType: ' + schema.arrayType);
|
||
|
}
|
||
|
else if (schema.arrayType === 'Uint8Array') {
|
||
|
return uint8Arr;
|
||
|
}
|
||
|
else {
|
||
|
var typedArr = TypedArrays[schema.arrayType];
|
||
|
if (uint8Arr.byteOffset % typedArr.BYTES_PER_ELEMENT === 0) {
|
||
|
return new typedArr(uint8Arr.buffer, uint8Arr.byteOffset, uint8Arr.byteLength / typedArr.BYTES_PER_ELEMENT);
|
||
|
}
|
||
|
else {
|
||
|
var arrBuf = uint8Arr.buffer.slice(uint8Arr.byteOffset, uint8Arr.byteOffset + uint8Arr.byteLength);
|
||
|
return new typedArr(arrBuf);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
return uint8Arr.buffer.slice(uint8Arr.byteOffset, uint8Arr.byteOffset + uint8Arr.byteLength);
|
||
|
}
|
||
|
case SchemaType.IndexedAccess:
|
||
|
case SchemaType.Reference:
|
||
|
return this._read(this._validator.protoHelper.parseReference(schema));
|
||
|
case SchemaType.Partial:
|
||
|
case SchemaType.Pick:
|
||
|
case SchemaType.Omit:
|
||
|
case SchemaType.Overwrite:
|
||
|
var parsed = this._validator.protoHelper.parseMappedType(schema);
|
||
|
if (parsed.type === 'Interface') {
|
||
|
return this._readPureMappedType(schema);
|
||
|
}
|
||
|
else if (parsed.type === 'Union') {
|
||
|
return this._readUnionOrIntersection(parsed);
|
||
|
}
|
||
|
break;
|
||
|
case SchemaType.Union:
|
||
|
case SchemaType.Intersection:
|
||
|
return this._readUnionOrIntersection(schema);
|
||
|
case SchemaType.Date:
|
||
|
return new Date(this._reader.readUint());
|
||
|
case SchemaType.NonNullable:
|
||
|
return this._read(schema.target);
|
||
|
default:
|
||
|
throw new Error("Unrecognized schema type: " + schema.type);
|
||
|
}
|
||
|
};
|
||
|
Decoder.prototype._readPureMappedType = function (schema) {
|
||
|
var output;
|
||
|
var overwrite;
|
||
|
if (schema.type === 'Overwrite') {
|
||
|
overwrite = this._read(schema.overwrite);
|
||
|
}
|
||
|
var parsedTarget = this._validator.protoHelper.parseReference(schema.target);
|
||
|
if (parsedTarget.type === 'Interface') {
|
||
|
output = this._readInterface(parsedTarget);
|
||
|
}
|
||
|
else if (parsedTarget.type === 'Pick' || parsedTarget.type === 'Omit' || parsedTarget.type === 'Partial' || parsedTarget.type === 'Overwrite') {
|
||
|
output = this._readPureMappedType(parsedTarget);
|
||
|
}
|
||
|
else {
|
||
|
throw new Error('Invalid PureMappedType child: ' + schema.type);
|
||
|
}
|
||
|
if (schema.type === 'Pick') {
|
||
|
for (var key in output) {
|
||
|
if (schema.keys.indexOf(key) === -1) {
|
||
|
delete output[key];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (schema.type === 'Omit') {
|
||
|
for (var key in output) {
|
||
|
if (schema.keys.indexOf(key) > -1) {
|
||
|
delete output[key];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (schema.type === 'Overwrite') {
|
||
|
Object.assign(output, overwrite);
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
Decoder.prototype._readNumber = function (schema) {
|
||
|
var scalarType = schema.scalarType || 'double';
|
||
|
switch (scalarType) {
|
||
|
case 'double':
|
||
|
return this._reader.readDouble();
|
||
|
case 'int':
|
||
|
return this._reader.readInt();
|
||
|
case 'uint':
|
||
|
return this._reader.readUint();
|
||
|
default:
|
||
|
throw new Error('Scalar type not support : ' + scalarType);
|
||
|
}
|
||
|
};
|
||
|
Decoder.prototype._readInterface = function (schema) {
|
||
|
var output = {};
|
||
|
var flatSchema = this._validator.protoHelper.getFlatInterfaceSchema(schema);
|
||
|
var blockIdNum = this._reader.readUint();
|
||
|
var _loop_1 = function _loop_1(i) {
|
||
|
var readBlockId = this_1._reader.readUint();
|
||
|
var lengthType = readBlockId & 3;
|
||
|
var blockId = readBlockId >> 2;
|
||
|
if (blockId === 0) {
|
||
|
if (flatSchema.indexSignature) {
|
||
|
var type = flatSchema.indexSignature.type;
|
||
|
var fieldName = this_1._reader.readString();
|
||
|
this_1._skipIdLengthPrefix(this_1._validator.protoHelper.parseReference(type));
|
||
|
output[fieldName] = this_1._read(type);
|
||
|
}
|
||
|
else {
|
||
|
this_1._reader.skipByLengthType(LengthType.LengthDelimited);
|
||
|
this_1._reader.skipByLengthType(lengthType);
|
||
|
}
|
||
|
}
|
||
|
else if (blockId <= 9) {
|
||
|
var extendId_1 = blockId - 1;
|
||
|
var extend = schema.extends && schema.extends.find(function (v) {
|
||
|
return v.id === extendId_1;
|
||
|
});
|
||
|
if (extend) {
|
||
|
this_1._skipIdLengthPrefix(this_1._validator.protoHelper.parseReference(extend.type));
|
||
|
var extendValue = this_1._read(extend.type);
|
||
|
Object.assign(output, extendValue);
|
||
|
}
|
||
|
else {
|
||
|
this_1._reader.skipByLengthType(lengthType);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
var propertyId_1 = blockId - 10;
|
||
|
var property = schema.properties && schema.properties.find(function (v) {
|
||
|
return v.id === propertyId_1;
|
||
|
});
|
||
|
if (property) {
|
||
|
this_1._skipIdLengthPrefix(this_1._validator.protoHelper.parseReference(property.type));
|
||
|
output[property.name] = this_1._read(property.type);
|
||
|
}
|
||
|
else {
|
||
|
this_1._reader.skipByLengthType(lengthType);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
var this_1 = this;
|
||
|
for (var i = 0; i < blockIdNum; ++i) {
|
||
|
_loop_1();
|
||
|
}
|
||
|
for (var _i = 0, _a = flatSchema.properties; _i < _a.length; _i++) {
|
||
|
var property = _a[_i];
|
||
|
if (output.hasOwnProperty(property.name)) {
|
||
|
continue;
|
||
|
}
|
||
|
var parsedType = this._validator.protoHelper.parseReference(property.type);
|
||
|
if (parsedType.type === 'Literal') {
|
||
|
output[property.name] = parsedType.literal;
|
||
|
continue;
|
||
|
}
|
||
|
if (this._undefinedAsNull(output[property.name], parsedType, property.optional)) {
|
||
|
output[property.name] = null;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
Decoder.prototype._undefinedAsNull = function (value, type, isOptional) {
|
||
|
return value === undefined && this._options.undefinedAsNull && !SchemaUtil.canBeLiteral(type, undefined) && !isOptional && SchemaUtil.canBeLiteral(type, null);
|
||
|
};
|
||
|
Decoder.prototype._skipIdLengthPrefix = function (parsedSchema) {
|
||
|
var lengthInfo = IdBlockUtil.getPayloadLengthInfo(parsedSchema);
|
||
|
if (lengthInfo.needLengthPrefix) {
|
||
|
this._reader.skipByLengthType(LengthType.Varint);
|
||
|
}
|
||
|
};
|
||
|
Decoder.prototype._readUnionOrIntersection = function (schema) {
|
||
|
var output;
|
||
|
var idNum = this._reader.readUint();
|
||
|
var _loop_2 = function _loop_2(i) {
|
||
|
var readId = this_2._reader.readUint();
|
||
|
var lengthType = readId & 3;
|
||
|
var id = readId >> 2;
|
||
|
var member = schema.members.find(function (v) {
|
||
|
return v.id === id;
|
||
|
});
|
||
|
if (!member) {
|
||
|
this_2._reader.skipByLengthType(lengthType);
|
||
|
return "continue";
|
||
|
}
|
||
|
this_2._skipIdLengthPrefix(this_2._validator.protoHelper.parseReference(member.type));
|
||
|
var value = this_2._read(member.type);
|
||
|
if (this_2._isObject(output) && this_2._isObject(value)) {
|
||
|
Object.assign(output, value);
|
||
|
}
|
||
|
else {
|
||
|
output = value;
|
||
|
}
|
||
|
};
|
||
|
var this_2 = this;
|
||
|
for (var i = 0; i < idNum; ++i) {
|
||
|
_loop_2();
|
||
|
}
|
||
|
if (this._undefinedAsNull(output, schema)) {
|
||
|
output = null;
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
Decoder.prototype._isObject = function (value) {
|
||
|
return _typeof(value) === 'object' && value !== null;
|
||
|
};
|
||
|
return Decoder;
|
||
|
}();
|
||
|
var Config = {
|
||
|
interface: {
|
||
|
maxExtendsNum: 9
|
||
|
}
|
||
|
};
|
||
|
var BufferWriter = function () {
|
||
|
function BufferWriter() {
|
||
|
this._ops = [];
|
||
|
}
|
||
|
Object.defineProperty(BufferWriter.prototype, "ops", {
|
||
|
get: function get() {
|
||
|
return this._ops;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
BufferWriter.prototype.clear = function () {
|
||
|
this._ops = [];
|
||
|
};
|
||
|
BufferWriter.prototype.push = function (req) {
|
||
|
this._ops.push(this.req2op(req));
|
||
|
return this;
|
||
|
};
|
||
|
BufferWriter.prototype.req2op = function (req) {
|
||
|
if (req.type === 'string' || req.type === 'buffer') {
|
||
|
var valueLength = this.measureLength(req);
|
||
|
this.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(valueLength)
|
||
|
});
|
||
|
return __assign$1(__assign$1({}, req), {
|
||
|
length: valueLength
|
||
|
});
|
||
|
}
|
||
|
else {
|
||
|
var length_1 = this.measureLength(req);
|
||
|
return __assign$1(__assign$1({}, req), {
|
||
|
length: length_1
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
BufferWriter.prototype.measureLength = function (req) {
|
||
|
switch (req.type) {
|
||
|
case 'varint':
|
||
|
return req.value.byteLength;
|
||
|
case 'string':
|
||
|
return Utf8Coder.measureLength(req.value);
|
||
|
case 'buffer':
|
||
|
return req.value.byteLength;
|
||
|
case 'double':
|
||
|
return 8;
|
||
|
case 'boolean':
|
||
|
return 1;
|
||
|
default:
|
||
|
return NaN;
|
||
|
}
|
||
|
};
|
||
|
BufferWriter.prototype.finish = function () {
|
||
|
var byteLength = this._ops.sum(function (v) {
|
||
|
return v.length;
|
||
|
});
|
||
|
var pos = 0;
|
||
|
var buf = new Uint8Array(byteLength);
|
||
|
var view = new DataView(buf.buffer);
|
||
|
for (var _i = 0, _a = this._ops; _i < _a.length; _i++) {
|
||
|
var op = _a[_i];
|
||
|
switch (op.type) {
|
||
|
case 'varint':
|
||
|
var newPos = op.value.writeToBuffer(buf, pos);
|
||
|
if (newPos !== pos + op.length) {
|
||
|
throw new Error("Error varint measuredLength " + op.length + ", actual is " + (newPos - pos) + ", value is " + op.value.toNumber());
|
||
|
}
|
||
|
break;
|
||
|
case 'double':
|
||
|
view.setFloat64(buf.byteOffset + pos, op.value);
|
||
|
break;
|
||
|
case 'string':
|
||
|
var encLen = Utf8Coder.write(op.value, buf, pos);
|
||
|
if (encLen !== op.length) {
|
||
|
throw new Error("Expect " + op.length + " bytes but encoded " + encLen + " bytes");
|
||
|
}
|
||
|
break;
|
||
|
case 'buffer':
|
||
|
buf.subarray(pos, pos + op.length).set(op.value);
|
||
|
break;
|
||
|
case 'boolean':
|
||
|
view.setUint8(buf.byteOffset + pos, op.value ? 255 : 0);
|
||
|
break;
|
||
|
}
|
||
|
pos += op.length;
|
||
|
}
|
||
|
return buf;
|
||
|
};
|
||
|
return BufferWriter;
|
||
|
}();
|
||
|
var Encoder = function () {
|
||
|
function Encoder(options) {
|
||
|
this._options = options;
|
||
|
this._writer = new BufferWriter();
|
||
|
this._validator = options.validator;
|
||
|
}
|
||
|
Encoder.prototype.encode = function (value, schema) {
|
||
|
this._writer.clear();
|
||
|
this._write(value, schema);
|
||
|
return this._writer.finish();
|
||
|
};
|
||
|
Encoder.prototype._write = function (value, schema, options) {
|
||
|
switch (schema.type) {
|
||
|
case SchemaType.Boolean:
|
||
|
this._writer.push({
|
||
|
type: 'boolean',
|
||
|
value: value
|
||
|
});
|
||
|
break;
|
||
|
case SchemaType.Number:
|
||
|
this._writeNumber(value, schema);
|
||
|
break;
|
||
|
case SchemaType.String:
|
||
|
this._writer.push({
|
||
|
type: 'string',
|
||
|
value: value
|
||
|
});
|
||
|
break;
|
||
|
case SchemaType.Array:
|
||
|
{
|
||
|
var _v = value;
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(_v.length)
|
||
|
});
|
||
|
for (var i = 0; i < _v.length; ++i) {
|
||
|
this._write(_v[i], schema.elementType);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case SchemaType.Tuple:
|
||
|
{
|
||
|
if (schema.elementTypes.length > 64) {
|
||
|
throw new Error('Elements oversized, maximum supported tuple elements is 64, now get ' + schema.elementTypes.length);
|
||
|
}
|
||
|
var _v = value;
|
||
|
var maskIndices = [];
|
||
|
for (var i = 0; i < _v.length; ++i) {
|
||
|
if (_v[i] === undefined || this._nullAsUndefined(_v[i], schema.elementTypes[i])) {
|
||
|
continue;
|
||
|
}
|
||
|
maskIndices.push(i);
|
||
|
}
|
||
|
var lo = 0;
|
||
|
var hi = 0;
|
||
|
for (var _i = 0, maskIndices_1 = maskIndices; _i < maskIndices_1.length; _i++) {
|
||
|
var v = maskIndices_1[_i];
|
||
|
if (v < 32) {
|
||
|
lo |= 1 << v;
|
||
|
}
|
||
|
else {
|
||
|
hi |= 1 << v - 32;
|
||
|
}
|
||
|
}
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: new Varint64(hi, lo)
|
||
|
});
|
||
|
for (var _a = 0, maskIndices_2 = maskIndices; _a < maskIndices_2.length; _a++) {
|
||
|
var i = maskIndices_2[_a];
|
||
|
this._write(_v[i], schema.elementTypes[i]);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case SchemaType.Enum:
|
||
|
var enumItem = schema.members.find(function (v) {
|
||
|
return v.value === value;
|
||
|
});
|
||
|
if (!enumItem) {
|
||
|
throw new Error("Unexpect enum value: " + value);
|
||
|
}
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(enumItem.id)
|
||
|
});
|
||
|
break;
|
||
|
case SchemaType.Any:
|
||
|
if (value === undefined) {
|
||
|
this._writer.push({
|
||
|
type: 'string',
|
||
|
value: 'undefined'
|
||
|
});
|
||
|
}
|
||
|
else {
|
||
|
this._writer.push({
|
||
|
type: 'string',
|
||
|
value: JSON.stringify(value)
|
||
|
});
|
||
|
}
|
||
|
break;
|
||
|
case SchemaType.Object:
|
||
|
this._writer.push({
|
||
|
type: 'string',
|
||
|
value: JSON.stringify(value)
|
||
|
});
|
||
|
break;
|
||
|
case SchemaType.Literal:
|
||
|
break;
|
||
|
case SchemaType.Interface:
|
||
|
this._writeInterface(value, schema, options);
|
||
|
break;
|
||
|
case SchemaType.Buffer:
|
||
|
this._writeBuffer(value, schema);
|
||
|
break;
|
||
|
case SchemaType.IndexedAccess:
|
||
|
case SchemaType.Reference:
|
||
|
this._write(value, this._validator.protoHelper.parseReference(schema), options);
|
||
|
break;
|
||
|
case SchemaType.Partial:
|
||
|
case SchemaType.Pick:
|
||
|
case SchemaType.Omit:
|
||
|
case SchemaType.Overwrite:
|
||
|
var parsed = this._validator.protoHelper.parseMappedType(schema);
|
||
|
if (parsed.type === 'Interface') {
|
||
|
this._writePureMappedType(value, schema, options);
|
||
|
}
|
||
|
else {
|
||
|
this._writeUnion(value, parsed, options === null || options === void 0 ? void 0 : options.skipFields);
|
||
|
}
|
||
|
break;
|
||
|
case SchemaType.Union:
|
||
|
this._writeUnion(value, schema, options === null || options === void 0 ? void 0 : options.skipFields);
|
||
|
break;
|
||
|
case SchemaType.Intersection:
|
||
|
this._writeIntersection(value, schema, options === null || options === void 0 ? void 0 : options.skipFields);
|
||
|
break;
|
||
|
case SchemaType.Date:
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(value.getTime())
|
||
|
});
|
||
|
break;
|
||
|
case SchemaType.NonNullable:
|
||
|
this._write(value, schema.target, options);
|
||
|
break;
|
||
|
default:
|
||
|
throw new Error("Unrecognized schema type: " + schema.type);
|
||
|
}
|
||
|
};
|
||
|
Encoder.prototype._writePureMappedType = function (value, schema, options) {
|
||
|
if (!options) {
|
||
|
options = {};
|
||
|
}
|
||
|
if (schema.type === 'Pick') {
|
||
|
if (options.pickFields) {
|
||
|
var newPickFields = {};
|
||
|
for (var _i = 0, _a = schema.keys; _i < _a.length; _i++) {
|
||
|
var v = _a[_i];
|
||
|
if (options.pickFields[v]) {
|
||
|
newPickFields[v] = 1;
|
||
|
}
|
||
|
}
|
||
|
options.pickFields = newPickFields;
|
||
|
}
|
||
|
else {
|
||
|
options.pickFields = {};
|
||
|
for (var _b = 0, _c = schema.keys; _b < _c.length; _b++) {
|
||
|
var v = _c[_b];
|
||
|
options.pickFields[v] = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (schema.type === 'Omit') {
|
||
|
if (!(options === null || options === void 0 ? void 0 : options.skipFields)) {
|
||
|
if (!options) {
|
||
|
options = {};
|
||
|
}
|
||
|
options.skipFields = {};
|
||
|
}
|
||
|
for (var _d = 0, _e = schema.keys; _d < _e.length; _d++) {
|
||
|
var v = _e[_d];
|
||
|
options.skipFields[v] = 1;
|
||
|
}
|
||
|
}
|
||
|
else if (schema.type === 'Overwrite') {
|
||
|
var parsed = this._parseOverwrite(value, schema);
|
||
|
this._write(parsed.overwriteValue, parsed.overwrite, options);
|
||
|
}
|
||
|
else if (schema.type === 'Partial')
|
||
|
;
|
||
|
else {
|
||
|
throw new Error('Invalid PureMappedType child: ' + schema.type);
|
||
|
}
|
||
|
var parsedTarget = this._validator.protoHelper.parseReference(schema.target);
|
||
|
if (parsedTarget.type === 'Interface') {
|
||
|
this._writeInterface(value, parsedTarget, options);
|
||
|
}
|
||
|
else {
|
||
|
this._writePureMappedType(value, parsedTarget, options);
|
||
|
}
|
||
|
};
|
||
|
Encoder.prototype._writeNumber = function (value, schema) {
|
||
|
var scalarType = schema.scalarType || 'double';
|
||
|
switch (scalarType) {
|
||
|
case 'double':
|
||
|
this._writer.push({
|
||
|
type: scalarType,
|
||
|
value: value
|
||
|
});
|
||
|
break;
|
||
|
case 'int':
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(value).zzEncode()
|
||
|
});
|
||
|
break;
|
||
|
case 'uint':
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(value)
|
||
|
});
|
||
|
break;
|
||
|
default:
|
||
|
throw new Error('Scalar type not support : ' + scalarType);
|
||
|
}
|
||
|
};
|
||
|
Encoder.prototype._writeInterface = function (value, schema, options) {
|
||
|
if (!options) {
|
||
|
options = {};
|
||
|
}
|
||
|
if (!options.skipFields) {
|
||
|
options.skipFields = {};
|
||
|
}
|
||
|
var opStartOps = this._writer.ops.length;
|
||
|
var blockIdCount = 0;
|
||
|
if (schema.extends) {
|
||
|
if (schema.extends.length > Config.interface.maxExtendsNum) {
|
||
|
throw new Error("Max support " + Config.interface.maxExtendsNum + " extends, actual: " + schema.extends.length);
|
||
|
}
|
||
|
for (var _i = 0, _a = schema.extends; _i < _a.length; _i++) {
|
||
|
var extend = _a[_i];
|
||
|
var blockId = extend.id + 1;
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(blockId)
|
||
|
});
|
||
|
var blockIdPos = this._writer.ops.length - 1;
|
||
|
var opsLengthBeforeWrite = this._writer.ops.length;
|
||
|
var parsedExtend = this._validator.protoHelper.parseReference(extend.type);
|
||
|
this._writeInterface(value, parsedExtend, __assign$1(__assign$1({}, options), {
|
||
|
skipIndexSignature: !!schema.indexSignature || options.skipIndexSignature
|
||
|
}));
|
||
|
if (this._writer.ops.length === opsLengthBeforeWrite + 1) {
|
||
|
this._writer.ops.splice(this._writer.ops.length - 2, 2);
|
||
|
}
|
||
|
else {
|
||
|
++blockIdCount;
|
||
|
this._processIdWithLengthType(blockIdPos, extend.type);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (schema.properties) {
|
||
|
for (var _b = 0, _c = schema.properties; _b < _c.length; _b++) {
|
||
|
var property = _c[_b];
|
||
|
var parsedType = this._validator.protoHelper.parseReference(property.type);
|
||
|
var propValue = value[property.name];
|
||
|
if (options.pickFields && !options.pickFields[property.name]) {
|
||
|
continue;
|
||
|
}
|
||
|
if (parsedType.type === 'Literal') {
|
||
|
options.skipFields[property.name] = 1;
|
||
|
continue;
|
||
|
}
|
||
|
if (this._nullAsUndefined(propValue, property.type)) {
|
||
|
propValue = undefined;
|
||
|
}
|
||
|
if (propValue === undefined) {
|
||
|
continue;
|
||
|
}
|
||
|
if (options.skipFields[property.name]) {
|
||
|
continue;
|
||
|
}
|
||
|
options.skipFields[property.name] = 1;
|
||
|
var blockId = property.id + Config.interface.maxExtendsNum + 1;
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(blockId)
|
||
|
});
|
||
|
var blockIdPos = this._writer.ops.length - 1;
|
||
|
this._write(propValue, parsedType);
|
||
|
++blockIdCount;
|
||
|
this._processIdWithLengthType(blockIdPos, parsedType);
|
||
|
}
|
||
|
}
|
||
|
if (!options.skipIndexSignature) {
|
||
|
var flat = this._validator.protoHelper.getFlatInterfaceSchema(schema);
|
||
|
if (flat.indexSignature) {
|
||
|
for (var key in value) {
|
||
|
if (value[key] === undefined || this._nullAsUndefined(value[key], flat.indexSignature.type)) {
|
||
|
continue;
|
||
|
}
|
||
|
if (options.pickFields && !options.pickFields[key]) {
|
||
|
continue;
|
||
|
}
|
||
|
if (options.skipFields[key]) {
|
||
|
continue;
|
||
|
}
|
||
|
options.skipFields[key] = 1;
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(0)
|
||
|
});
|
||
|
var blockIdPos = this._writer.ops.length - 1;
|
||
|
this._writer.push({
|
||
|
type: 'string',
|
||
|
value: key
|
||
|
});
|
||
|
var lengthPrefixPos = this._writer.ops.length;
|
||
|
this._write(value[key], flat.indexSignature.type);
|
||
|
++blockIdCount;
|
||
|
this._processIdWithLengthType(blockIdPos, flat.indexSignature.type, lengthPrefixPos);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this._writer.ops.splice(opStartOps, 0, this._writer.req2op({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(blockIdCount)
|
||
|
}));
|
||
|
};
|
||
|
Encoder.prototype._nullAsUndefined = function (value, type) {
|
||
|
return value === null && this._options.nullAsUndefined && !SchemaUtil.canBeLiteral(type, null);
|
||
|
};
|
||
|
Encoder.prototype._parseOverwrite = function (value, schema) {
|
||
|
var skipFields = {};
|
||
|
var target = this._validator.protoHelper.parseReference(schema.target);
|
||
|
var overwrite = this._validator.protoHelper.parseReference(schema.overwrite);
|
||
|
var flatTarget = this._validator.protoHelper.getFlatInterfaceSchema(target);
|
||
|
var flatOverwrite = this._validator.protoHelper.getFlatInterfaceSchema(overwrite);
|
||
|
var overwriteValue = {};
|
||
|
var targetValue = {};
|
||
|
if (flatOverwrite.properties) {
|
||
|
for (var _i = 0, _a = flatOverwrite.properties; _i < _a.length; _i++) {
|
||
|
var property = _a[_i];
|
||
|
if (value[property.name] !== undefined && !skipFields[property.name]) {
|
||
|
overwriteValue[property.name] = value[property.name];
|
||
|
skipFields[property.name] = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (flatTarget.properties) {
|
||
|
for (var _b = 0, _c = flatTarget.properties; _b < _c.length; _b++) {
|
||
|
var property = _c[_b];
|
||
|
if (value[property.name] !== undefined && !skipFields[property.name]) {
|
||
|
targetValue[property.name] = value[property.name];
|
||
|
skipFields[property.name] = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var indexSignatureWriteValue;
|
||
|
var indexSignature;
|
||
|
if (flatOverwrite.indexSignature) {
|
||
|
indexSignature = flatOverwrite.indexSignature;
|
||
|
indexSignatureWriteValue = overwriteValue;
|
||
|
}
|
||
|
else if (flatTarget.indexSignature) {
|
||
|
indexSignature = flatTarget.indexSignature;
|
||
|
indexSignatureWriteValue = targetValue;
|
||
|
}
|
||
|
if (indexSignature) {
|
||
|
for (var key in value) {
|
||
|
if (skipFields[key]) {
|
||
|
continue;
|
||
|
}
|
||
|
indexSignatureWriteValue[key] = value[key];
|
||
|
skipFields[key] = 1;
|
||
|
}
|
||
|
}
|
||
|
return {
|
||
|
target: target,
|
||
|
targetValue: targetValue,
|
||
|
overwrite: overwrite,
|
||
|
overwriteValue: overwriteValue
|
||
|
};
|
||
|
};
|
||
|
Encoder.prototype._writeUnion = function (value, schema, skipFields, unionProperties) {
|
||
|
if (skipFields === void 0) {
|
||
|
skipFields = {};
|
||
|
}
|
||
|
var encodeStartPos = this._writer.ops.length;
|
||
|
var idNum = 0;
|
||
|
if (this._nullAsUndefined(value, schema)) {
|
||
|
value = undefined;
|
||
|
}
|
||
|
for (var _i = 0, _a = schema.members; _i < _a.length; _i++) {
|
||
|
var member = _a[_i];
|
||
|
var vRes = this._validator.validate(value, member.type, {
|
||
|
excessPropertyChecks: false,
|
||
|
strictNullChecks: true
|
||
|
});
|
||
|
if (vRes.isSucc) {
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(member.id)
|
||
|
});
|
||
|
var idPos = this._writer.ops.length - 1;
|
||
|
if (member.type.type === 'Union') {
|
||
|
this._writeUnion(value, member.type, skipFields);
|
||
|
}
|
||
|
else {
|
||
|
this._write(value, member.type, {
|
||
|
skipFields: skipFields
|
||
|
});
|
||
|
}
|
||
|
idNum++;
|
||
|
this._processIdWithLengthType(idPos, member.type);
|
||
|
if (_typeof(value) !== 'object') {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (idNum > 0) {
|
||
|
this._writer.ops.splice(encodeStartPos, 0, this._writer.req2op({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(idNum)
|
||
|
}));
|
||
|
return;
|
||
|
}
|
||
|
else {
|
||
|
throw new Error('Non member is satisfied for union type');
|
||
|
}
|
||
|
};
|
||
|
Encoder.prototype._writeIntersection = function (value, schema, skipFields) {
|
||
|
if (skipFields === void 0) {
|
||
|
skipFields = {};
|
||
|
}
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(schema.members.length)
|
||
|
});
|
||
|
for (var _i = 0, _a = schema.members; _i < _a.length; _i++) {
|
||
|
var member = _a[_i];
|
||
|
this._writer.push({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(member.id)
|
||
|
});
|
||
|
var idPos = this._writer.ops.length - 1;
|
||
|
this._write(value, member.type, {
|
||
|
skipFields: skipFields
|
||
|
});
|
||
|
this._processIdWithLengthType(idPos, member.type);
|
||
|
}
|
||
|
};
|
||
|
Encoder.prototype._writeBuffer = function (value, schema) {
|
||
|
if (value instanceof ArrayBuffer) {
|
||
|
this._writer.push({
|
||
|
type: 'buffer',
|
||
|
value: new Uint8Array(value)
|
||
|
});
|
||
|
}
|
||
|
else if (value instanceof Uint8Array) {
|
||
|
this._writer.push({
|
||
|
type: 'buffer',
|
||
|
value: value
|
||
|
});
|
||
|
}
|
||
|
else {
|
||
|
var key = value.constructor.name;
|
||
|
var arrType = TypedArrays[key];
|
||
|
var uint8Arr = new Uint8Array(value.buffer, value.byteOffset, value.length * arrType.BYTES_PER_ELEMENT);
|
||
|
this._writer.push({
|
||
|
type: 'buffer',
|
||
|
value: uint8Arr
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
Encoder.prototype._processIdWithLengthType = function (idPos, payloadType, lengthPrefixPos) {
|
||
|
var idOp = this._writer.ops[idPos];
|
||
|
if (idOp.type !== 'varint') {
|
||
|
throw new Error('Error idPos: ' + idPos);
|
||
|
}
|
||
|
var parsedSchema = this._validator.protoHelper.parseReference(payloadType);
|
||
|
var lengthInfo = IdBlockUtil.getPayloadLengthInfo(parsedSchema);
|
||
|
var newId = (idOp.value.toNumber() << 2) + lengthInfo.lengthType;
|
||
|
this._writer.ops[idPos] = this._writer.req2op({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(newId)
|
||
|
});
|
||
|
if (lengthInfo.needLengthPrefix) {
|
||
|
var payloadByteLength = this._writer.ops.filter(function (v, i) {
|
||
|
return i > idPos;
|
||
|
}).sum(function (v) {
|
||
|
return v.length;
|
||
|
});
|
||
|
this._writer.ops.splice(lengthPrefixPos == undefined ? idPos + 1 : lengthPrefixPos, 0, this._writer.req2op({
|
||
|
type: 'varint',
|
||
|
value: Varint64.from(payloadByteLength)
|
||
|
}));
|
||
|
}
|
||
|
};
|
||
|
return Encoder;
|
||
|
}();
|
||
|
var TSBuffer = function () {
|
||
|
function TSBuffer(proto, options) {
|
||
|
this._options = {
|
||
|
excessPropertyChecks: true,
|
||
|
strictNullChecks: true,
|
||
|
skipEncodeValidate: false,
|
||
|
skipDecodeValidate: false,
|
||
|
cloneProto: true
|
||
|
};
|
||
|
this._options = __assign$1(__assign$1({}, this._options), options);
|
||
|
this._proto = this._options.cloneProto ? Object.merge({}, proto) : proto;
|
||
|
this._validator = new TSBufferValidator(this._proto, {
|
||
|
excessPropertyChecks: this._options.excessPropertyChecks,
|
||
|
strictNullChecks: this._options.strictNullChecks
|
||
|
});
|
||
|
this.validate = this._validator.validate.bind(this._validator);
|
||
|
this.prune = this._validator.prune.bind(this._validator);
|
||
|
this._encoder = new Encoder({
|
||
|
validator: this._validator,
|
||
|
nullAsUndefined: !this._options.strictNullChecks
|
||
|
});
|
||
|
this._decoder = new Decoder({
|
||
|
validator: this._validator,
|
||
|
undefinedAsNull: !this._options.strictNullChecks
|
||
|
});
|
||
|
}
|
||
|
TSBuffer.prototype.encode = function (value, schemaOrId, options) {
|
||
|
var _a;
|
||
|
var schema;
|
||
|
if (typeof schemaOrId === 'string') {
|
||
|
schema = this._proto[schemaOrId];
|
||
|
if (!schema) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: "Cannot find schema\uFF1A " + schemaOrId
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
schema = schemaOrId;
|
||
|
}
|
||
|
if (!((_a = options === null || options === void 0 ? void 0 : options.skipValidate) !== null && _a !== void 0 ? _a : this._options.skipEncodeValidate)) {
|
||
|
var vRes = this._validator.validate(value, schema, {
|
||
|
excessPropertyChecks: false
|
||
|
});
|
||
|
if (!vRes.isSucc) {
|
||
|
return vRes;
|
||
|
}
|
||
|
}
|
||
|
var buf;
|
||
|
try {
|
||
|
buf = this._encoder.encode(value, schema);
|
||
|
}
|
||
|
catch (e) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: e.message
|
||
|
};
|
||
|
}
|
||
|
return {
|
||
|
isSucc: true,
|
||
|
buf: buf
|
||
|
};
|
||
|
};
|
||
|
TSBuffer.prototype.decode = function (buf, schemaOrId, options) {
|
||
|
var _a;
|
||
|
var schema;
|
||
|
if (typeof schemaOrId === 'string') {
|
||
|
schema = this._proto[schemaOrId];
|
||
|
if (!schema) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: "Cannot find schema\uFF1A " + schemaOrId
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
schema = schemaOrId;
|
||
|
}
|
||
|
var value;
|
||
|
try {
|
||
|
value = this._decoder.decode(buf, schema);
|
||
|
}
|
||
|
catch (e) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: e.message
|
||
|
};
|
||
|
}
|
||
|
if (!((_a = options === null || options === void 0 ? void 0 : options.skipValidate) !== null && _a !== void 0 ? _a : this._options.skipDecodeValidate)) {
|
||
|
var vRes = this._validator.validate(value, schema);
|
||
|
if (!vRes.isSucc) {
|
||
|
return vRes;
|
||
|
}
|
||
|
}
|
||
|
return {
|
||
|
isSucc: true,
|
||
|
value: value
|
||
|
};
|
||
|
};
|
||
|
return TSBuffer;
|
||
|
}();
|
||
|
var Counter = function () {
|
||
|
function Counter(min, max) {
|
||
|
if (min === void 0) {
|
||
|
min = 1;
|
||
|
}
|
||
|
if (max === void 0) {
|
||
|
max = Number.MAX_SAFE_INTEGER;
|
||
|
}
|
||
|
this._min = min;
|
||
|
this._max = max;
|
||
|
this._last = max;
|
||
|
}
|
||
|
Counter.prototype.reset = function () {
|
||
|
this._last = this._max;
|
||
|
};
|
||
|
Counter.prototype.getNext = function (notInc) {
|
||
|
return this._last >= this._max ? this._last = this._min : notInc ? this._last : ++this._last;
|
||
|
};
|
||
|
Object.defineProperty(Counter.prototype, "last", {
|
||
|
get: function get() {
|
||
|
return this._last;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
return Counter;
|
||
|
}();
|
||
|
var Flow = function () {
|
||
|
function Flow() {
|
||
|
this.nodes = [];
|
||
|
this.onError = function (e, last, input, logger) {
|
||
|
logger === null || logger === void 0 ? void 0 : logger.error('Uncaught FlowError:', e);
|
||
|
};
|
||
|
}
|
||
|
Flow.prototype.exec = function (input, logger) {
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var res, i, e_1;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
switch (_a.label) {
|
||
|
case 0:
|
||
|
res = input;
|
||
|
i = 0;
|
||
|
_a.label = 1;
|
||
|
case 1:
|
||
|
if (!(i < this.nodes.length))
|
||
|
return [3,
|
||
|
7];
|
||
|
_a.label = 2;
|
||
|
case 2:
|
||
|
_a.trys.push([2, 4, , 5]);
|
||
|
return [4,
|
||
|
this.nodes[i](res)];
|
||
|
case 3:
|
||
|
res = _a.sent();
|
||
|
return [3,
|
||
|
5];
|
||
|
case 4:
|
||
|
e_1 = _a.sent();
|
||
|
this.onError(e_1, res, input, logger);
|
||
|
return [2,
|
||
|
undefined];
|
||
|
case 5:
|
||
|
if (res === null || res === undefined) {
|
||
|
return [2,
|
||
|
res];
|
||
|
}
|
||
|
_a.label = 6;
|
||
|
case 6:
|
||
|
++i;
|
||
|
return [3,
|
||
|
1];
|
||
|
case 7:
|
||
|
return [2,
|
||
|
res];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
Flow.prototype.push = function (node) {
|
||
|
this.nodes.push(node);
|
||
|
return node;
|
||
|
};
|
||
|
Flow.prototype.remove = function (node) {
|
||
|
return this.nodes.remove(function (v) {
|
||
|
return v === node;
|
||
|
});
|
||
|
};
|
||
|
return Flow;
|
||
|
}();
|
||
|
var MsgHandlerManager = function () {
|
||
|
function MsgHandlerManager() {
|
||
|
this._handlers = {};
|
||
|
}
|
||
|
MsgHandlerManager.prototype.forEachHandler = function (msgName, logger) {
|
||
|
var args = [];
|
||
|
for (var _i = 2; _i < arguments.length; _i++) {
|
||
|
args[_i - 2] = arguments[_i];
|
||
|
}
|
||
|
var handlers = this._handlers[msgName];
|
||
|
if (!handlers) {
|
||
|
return [];
|
||
|
}
|
||
|
var output = [];
|
||
|
for (var _a = 0, handlers_1 = handlers; _a < handlers_1.length; _a++) {
|
||
|
var handler = handlers_1[_a];
|
||
|
try {
|
||
|
output.push(handler.apply(void 0, args));
|
||
|
}
|
||
|
catch (e) {
|
||
|
logger === null || logger === void 0 ? void 0 : logger.error('[MsgHandlerError]', e);
|
||
|
}
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
MsgHandlerManager.prototype.addHandler = function (msgName, handler) {
|
||
|
var handlers = this._handlers[msgName];
|
||
|
if (!handlers) {
|
||
|
handlers = this._handlers[msgName] = [];
|
||
|
}
|
||
|
else if (handlers.some(function (v) {
|
||
|
return v === handler;
|
||
|
})) {
|
||
|
return;
|
||
|
}
|
||
|
handlers.push(handler);
|
||
|
};
|
||
|
MsgHandlerManager.prototype.removeHandler = function (msgName, handler) {
|
||
|
var handlers = this._handlers[msgName];
|
||
|
if (!handlers) {
|
||
|
return;
|
||
|
}
|
||
|
handlers.removeOne(function (v) {
|
||
|
return v === handler;
|
||
|
});
|
||
|
};
|
||
|
MsgHandlerManager.prototype.removeAllHandlers = function (msgName) {
|
||
|
this._handlers[msgName] = undefined;
|
||
|
};
|
||
|
return MsgHandlerManager;
|
||
|
}();
|
||
|
var ServiceMapUtil = function () {
|
||
|
function ServiceMapUtil() { }
|
||
|
ServiceMapUtil.getServiceMap = function (proto) {
|
||
|
var map = {
|
||
|
id2Service: {},
|
||
|
apiName2Service: {},
|
||
|
msgName2Service: {}
|
||
|
};
|
||
|
for (var _i = 0, _a = proto.services; _i < _a.length; _i++) {
|
||
|
var v = _a[_i];
|
||
|
var match = v.name.match(/(.+\/)?([^\/]+)$/);
|
||
|
var path = match[1] || '';
|
||
|
var name_1 = match[2];
|
||
|
if (v.type === 'api') {
|
||
|
var svc = __assign$1(__assign$1({}, v), {
|
||
|
reqSchemaId: path + "Ptl" + name_1 + "/Req" + name_1,
|
||
|
resSchemaId: path + "Ptl" + name_1 + "/Res" + name_1
|
||
|
});
|
||
|
map.apiName2Service[v.name] = svc;
|
||
|
map.id2Service[v.id] = svc;
|
||
|
}
|
||
|
else {
|
||
|
var svc = __assign$1(__assign$1({}, v), {
|
||
|
msgSchemaId: path + "Msg" + name_1 + "/Msg" + name_1
|
||
|
});
|
||
|
map.msgName2Service[v.name] = svc;
|
||
|
map.id2Service[v.id] = svc;
|
||
|
}
|
||
|
}
|
||
|
return map;
|
||
|
};
|
||
|
return ServiceMapUtil;
|
||
|
}();
|
||
|
var TransportDataUtil = function () {
|
||
|
function TransportDataUtil() { }
|
||
|
Object.defineProperty(TransportDataUtil, "tsbuffer", {
|
||
|
get: function get() {
|
||
|
if (!this._tsbuffer) {
|
||
|
this._tsbuffer = new TSBuffer(TransportDataProto);
|
||
|
}
|
||
|
return this._tsbuffer;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
TransportDataUtil.encodeApiReturn = function (tsbuffer, service, apiReturn, sn) {
|
||
|
var serverOutputData = {
|
||
|
sn: sn,
|
||
|
serviceId: sn !== undefined ? service.id : undefined
|
||
|
};
|
||
|
if (apiReturn.isSucc) {
|
||
|
var op = tsbuffer.encode(apiReturn.res, service.resSchemaId);
|
||
|
if (!op.isSucc) {
|
||
|
return op;
|
||
|
}
|
||
|
serverOutputData.buffer = op.buf;
|
||
|
}
|
||
|
else {
|
||
|
serverOutputData.error = apiReturn.err;
|
||
|
}
|
||
|
return this.tsbuffer.encode(serverOutputData, 'ServerOutputData');
|
||
|
};
|
||
|
TransportDataUtil.encodeClientMsg = function (tsbuffer, service, msg) {
|
||
|
var op = tsbuffer.encode(msg, service.msgSchemaId);
|
||
|
if (!op.isSucc) {
|
||
|
return op;
|
||
|
}
|
||
|
var serverInputData = {
|
||
|
serviceId: service.id,
|
||
|
buffer: op.buf
|
||
|
};
|
||
|
return this.tsbuffer.encode(serverInputData, 'ServerInputData');
|
||
|
};
|
||
|
TransportDataUtil.encodeApiReq = function (tsbuffer, service, req, sn) {
|
||
|
var op = tsbuffer.encode(req, service.reqSchemaId);
|
||
|
if (!op.isSucc) {
|
||
|
return op;
|
||
|
}
|
||
|
var serverInputData = {
|
||
|
serviceId: service.id,
|
||
|
buffer: op.buf,
|
||
|
sn: sn
|
||
|
};
|
||
|
return this.tsbuffer.encode(serverInputData, 'ServerInputData');
|
||
|
};
|
||
|
TransportDataUtil.encodeServerMsg = function (tsbuffer, service, msg) {
|
||
|
var op = tsbuffer.encode(msg, service.msgSchemaId);
|
||
|
if (!op.isSucc) {
|
||
|
return op;
|
||
|
}
|
||
|
var serverOutputData = {
|
||
|
serviceId: service.id,
|
||
|
buffer: op.buf
|
||
|
};
|
||
|
return this.tsbuffer.encode(serverOutputData, 'ServerOutputData');
|
||
|
};
|
||
|
TransportDataUtil.parseServerInput = function (tsbuffer, serviceMap, buf) {
|
||
|
var opServerInputData = this.tsbuffer.decode(buf, 'ServerInputData');
|
||
|
if (!opServerInputData.isSucc) {
|
||
|
return opServerInputData;
|
||
|
}
|
||
|
var serverInput = opServerInputData.value;
|
||
|
var service = serviceMap.id2Service[serverInput.serviceId];
|
||
|
if (!service) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: "Cannot find service ID: " + serverInput.serviceId
|
||
|
};
|
||
|
}
|
||
|
if (service.type === 'api') {
|
||
|
var opReq = tsbuffer.decode(serverInput.buffer, service.reqSchemaId);
|
||
|
return opReq.isSucc ? {
|
||
|
isSucc: true,
|
||
|
result: {
|
||
|
type: 'api',
|
||
|
service: service,
|
||
|
req: opReq.value,
|
||
|
sn: serverInput.sn
|
||
|
}
|
||
|
} : opReq;
|
||
|
}
|
||
|
else {
|
||
|
var opMsg = tsbuffer.decode(serverInput.buffer, service.msgSchemaId);
|
||
|
return opMsg.isSucc ? {
|
||
|
isSucc: true,
|
||
|
result: {
|
||
|
type: 'msg',
|
||
|
service: service,
|
||
|
msg: opMsg.value
|
||
|
}
|
||
|
} : opMsg;
|
||
|
}
|
||
|
};
|
||
|
TransportDataUtil.parseServerOutout = function (tsbuffer, serviceMap, buf, serviceId) {
|
||
|
var opServerOutputData = this.tsbuffer.decode(buf, 'ServerOutputData');
|
||
|
if (!opServerOutputData.isSucc) {
|
||
|
return opServerOutputData;
|
||
|
}
|
||
|
var serverOutputData = opServerOutputData.value;
|
||
|
serviceId = serviceId !== null && serviceId !== void 0 ? serviceId : serverOutputData.serviceId;
|
||
|
if (serviceId === undefined) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: "Missing 'serviceId' in ServerOutput"
|
||
|
};
|
||
|
}
|
||
|
var service = serviceMap.id2Service[serviceId];
|
||
|
if (!service) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: "Invalid service ID: " + serviceId + " (from ServerOutput)"
|
||
|
};
|
||
|
}
|
||
|
if (service.type === 'msg') {
|
||
|
if (!serverOutputData.buffer) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: 'Empty msg buffer (from ServerOutput)'
|
||
|
};
|
||
|
}
|
||
|
var opMsg = tsbuffer.decode(serverOutputData.buffer, service.msgSchemaId);
|
||
|
if (!opMsg.isSucc) {
|
||
|
return opMsg;
|
||
|
}
|
||
|
return {
|
||
|
isSucc: true,
|
||
|
result: {
|
||
|
type: 'msg',
|
||
|
service: service,
|
||
|
msg: opMsg.value
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
if (serverOutputData.error) {
|
||
|
return {
|
||
|
isSucc: true,
|
||
|
result: {
|
||
|
type: 'api',
|
||
|
service: service,
|
||
|
sn: serverOutputData.sn,
|
||
|
ret: {
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError(serverOutputData.error)
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
if (!serverOutputData.buffer) {
|
||
|
return {
|
||
|
isSucc: false,
|
||
|
errMsg: 'Empty API res buffer (from ServerOutput)'
|
||
|
};
|
||
|
}
|
||
|
var opRes = tsbuffer.decode(serverOutputData.buffer, service.resSchemaId);
|
||
|
if (!opRes.isSucc) {
|
||
|
return opRes;
|
||
|
}
|
||
|
return {
|
||
|
isSucc: true,
|
||
|
result: {
|
||
|
type: 'api',
|
||
|
service: service,
|
||
|
sn: serverOutputData.sn,
|
||
|
ret: {
|
||
|
isSucc: true,
|
||
|
res: opRes.value
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
return TransportDataUtil;
|
||
|
}();
|
||
|
var BaseClient = function () {
|
||
|
function BaseClient(proto, options) {
|
||
|
this._msgHandlers = new MsgHandlerManager();
|
||
|
this.flows = {
|
||
|
preCallApiFlow: new Flow(),
|
||
|
preApiReturnFlow: new Flow(),
|
||
|
postApiReturnFlow: new Flow(),
|
||
|
preSendMsgFlow: new Flow(),
|
||
|
postSendMsgFlow: new Flow(),
|
||
|
preSendBufferFlow: new Flow(),
|
||
|
preRecvBufferFlow: new Flow(),
|
||
|
preConnectFlow: new Flow(),
|
||
|
postConnectFlow: new Flow(),
|
||
|
postDisconnectFlow: new Flow()
|
||
|
};
|
||
|
this._apiSnCounter = new Counter(1);
|
||
|
this._pendingApis = [];
|
||
|
this.options = options;
|
||
|
this.serviceMap = ServiceMapUtil.getServiceMap(proto);
|
||
|
this.tsbuffer = new TSBuffer(proto.types);
|
||
|
this.logger = this.options.logger;
|
||
|
}
|
||
|
Object.defineProperty(BaseClient.prototype, "lastSN", {
|
||
|
get: function get() {
|
||
|
return this._apiSnCounter.last;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
Object.defineProperty(BaseClient.prototype, "nextSN", {
|
||
|
get: function get() {
|
||
|
return this._apiSnCounter.getNext(true);
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
BaseClient.prototype.callApi = function (apiName, req, options) {
|
||
|
if (options === void 0) {
|
||
|
options = {};
|
||
|
}
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var sn, pendingItem, promise;
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
sn = this._apiSnCounter.getNext();
|
||
|
pendingItem = {
|
||
|
sn: sn,
|
||
|
abortKey: options.abortKey,
|
||
|
service: this.serviceMap.apiName2Service[apiName]
|
||
|
};
|
||
|
this._pendingApis.push(pendingItem);
|
||
|
promise = new Promise(function (rs) {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
var pre, ret, preReturn;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
switch (_a.label) {
|
||
|
case 0:
|
||
|
return [4,
|
||
|
this.flows.preCallApiFlow.exec({
|
||
|
apiName: apiName,
|
||
|
req: req,
|
||
|
options: options
|
||
|
}, this.logger)];
|
||
|
case 1:
|
||
|
pre = _a.sent();
|
||
|
if (!pre || pendingItem.isAborted) {
|
||
|
this.abort(pendingItem.sn);
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
if (!pre.return)
|
||
|
return [3,
|
||
|
2];
|
||
|
ret = pre.return;
|
||
|
return [3,
|
||
|
4];
|
||
|
case 2:
|
||
|
return [4,
|
||
|
this._doCallApi(pre.apiName, pre.req, pre.options, pendingItem)];
|
||
|
case 3:
|
||
|
ret = _a.sent();
|
||
|
_a.label = 4;
|
||
|
case 4:
|
||
|
if (pendingItem.isAborted) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
return [4,
|
||
|
this.flows.preApiReturnFlow.exec(__assign$1(__assign$1({}, pre), {
|
||
|
return: ret
|
||
|
}), this.logger)];
|
||
|
case 5:
|
||
|
preReturn = _a.sent();
|
||
|
if (!preReturn) {
|
||
|
this.abort(pendingItem.sn);
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
rs(preReturn.return);
|
||
|
this.flows.postApiReturnFlow.exec(preReturn, this.logger);
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
promise.catch().then(function () {
|
||
|
_this._pendingApis.removeOne(function (v) {
|
||
|
return v.sn === pendingItem.sn;
|
||
|
});
|
||
|
});
|
||
|
return [2,
|
||
|
promise];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
BaseClient.prototype._doCallApi = function (apiName, req, options, pendingItem) {
|
||
|
var _a;
|
||
|
if (options === void 0) {
|
||
|
options = {};
|
||
|
}
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var promise;
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_b) {
|
||
|
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.log("[ApiReq] #" + pendingItem.sn, apiName, req);
|
||
|
promise = new Promise(function (rs) {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
var service, opEncode, promiseReturn, promiseSend, opSend, ret;
|
||
|
var _a, _b, _c;
|
||
|
return __generator$1(this, function (_d) {
|
||
|
switch (_d.label) {
|
||
|
case 0:
|
||
|
service = this.serviceMap.apiName2Service[apiName];
|
||
|
if (!service) {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError('Invalid api name: ' + apiName, {
|
||
|
code: 'INVALID_API_NAME',
|
||
|
type: TsrpcErrorType.ClientError
|
||
|
})
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
pendingItem.service = service;
|
||
|
opEncode = this._encodeApiReq(service, req, pendingItem);
|
||
|
if (!opEncode.isSucc) {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError(opEncode.errMsg, {
|
||
|
type: TsrpcErrorType.ClientError,
|
||
|
code: 'ENCODE_REQ_ERR'
|
||
|
})
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
promiseReturn = this._waitApiReturn(pendingItem, (_a = options.timeout) !== null && _a !== void 0 ? _a : this.options.timeout);
|
||
|
promiseSend = this._sendBuf(opEncode.buf, options, service.id, pendingItem);
|
||
|
return [4,
|
||
|
promiseSend];
|
||
|
case 1:
|
||
|
opSend = _d.sent();
|
||
|
if (opSend.err) {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: opSend.err
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
return [4,
|
||
|
promiseReturn];
|
||
|
case 2:
|
||
|
ret = _d.sent();
|
||
|
if (pendingItem.isAborted) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
if (ret.isSucc) {
|
||
|
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.log("[ApiRes] #" + pendingItem.sn + " " + apiName, ret.res);
|
||
|
}
|
||
|
else {
|
||
|
(_c = this.logger) === null || _c === void 0 ? void 0 : _c.log("[ApiErr] #" + pendingItem.sn + " " + apiName, ret.err);
|
||
|
}
|
||
|
rs(ret);
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
return [2,
|
||
|
promise];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
BaseClient.prototype._encodeApiReq = function (service, req, pendingItem) {
|
||
|
return TransportDataUtil.encodeApiReq(this.tsbuffer, service, req, this.type === 'LONG' ? pendingItem.sn : undefined);
|
||
|
};
|
||
|
BaseClient.prototype.sendMsg = function (msgName, msg, options) {
|
||
|
var _this = this;
|
||
|
if (options === void 0) {
|
||
|
options = {};
|
||
|
}
|
||
|
var promise = new Promise(function (rs) {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
var pre, service, opEncode, promiseSend, opSend;
|
||
|
var _a, _b;
|
||
|
return __generator$1(this, function (_c) {
|
||
|
switch (_c.label) {
|
||
|
case 0:
|
||
|
return [4,
|
||
|
this.flows.preSendMsgFlow.exec({
|
||
|
msgName: msgName,
|
||
|
msg: msg,
|
||
|
options: options
|
||
|
}, this.logger)];
|
||
|
case 1:
|
||
|
pre = _c.sent();
|
||
|
if (!pre) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.log("[SendMsg]", msgName, msg);
|
||
|
service = this.serviceMap.msgName2Service[msgName];
|
||
|
if (!service) {
|
||
|
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.error('Invalid msg name: ' + msgName);
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError('Invalid msg name: ' + msgName, {
|
||
|
code: 'INVALID_MSG_NAME',
|
||
|
type: TsrpcErrorType.ClientError
|
||
|
})
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
opEncode = this._encodeClientMsg(service, msg);
|
||
|
if (!opEncode.isSucc) {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError(opEncode.errMsg, {
|
||
|
type: TsrpcErrorType.ClientError,
|
||
|
code: 'ENCODE_MSG_ERR'
|
||
|
})
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
promiseSend = this._sendBuf(opEncode.buf, options, service.id);
|
||
|
return [4,
|
||
|
promiseSend];
|
||
|
case 2:
|
||
|
opSend = _c.sent();
|
||
|
if (opSend.err) {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: opSend.err
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
rs({
|
||
|
isSucc: true
|
||
|
});
|
||
|
this.flows.postSendMsgFlow.exec(pre, this.logger);
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
return promise;
|
||
|
};
|
||
|
BaseClient.prototype._encodeClientMsg = function (service, msg) {
|
||
|
return TransportDataUtil.encodeClientMsg(this.tsbuffer, service, msg);
|
||
|
};
|
||
|
BaseClient.prototype.listenMsg = function (msgName, handler) {
|
||
|
this._msgHandlers.addHandler(msgName, handler);
|
||
|
return handler;
|
||
|
};
|
||
|
BaseClient.prototype.unlistenMsg = function (msgName, handler) {
|
||
|
this._msgHandlers.removeHandler(msgName, handler);
|
||
|
};
|
||
|
BaseClient.prototype.unlistenMsgAll = function (msgName) {
|
||
|
this._msgHandlers.removeAllHandlers(msgName);
|
||
|
};
|
||
|
BaseClient.prototype.abort = function (sn) {
|
||
|
var _a, _b;
|
||
|
var index = this._pendingApis.findIndex(function (v) {
|
||
|
return v.sn === sn;
|
||
|
});
|
||
|
if (index === -1) {
|
||
|
return;
|
||
|
}
|
||
|
var pendingItem = this._pendingApis[index];
|
||
|
this._pendingApis.splice(index, 1);
|
||
|
pendingItem.onReturn = undefined;
|
||
|
pendingItem.isAborted = true;
|
||
|
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.log("[ApiAbort] #" + pendingItem.sn + " " + pendingItem.service.name);
|
||
|
(_b = pendingItem.onAbort) === null || _b === void 0 ? void 0 : _b.call(pendingItem);
|
||
|
};
|
||
|
BaseClient.prototype.abortByKey = function (abortKey) {
|
||
|
var _this = this;
|
||
|
this._pendingApis.filter(function (v) {
|
||
|
return v.abortKey === abortKey;
|
||
|
}).forEach(function (v) {
|
||
|
_this.abort(v.sn);
|
||
|
});
|
||
|
};
|
||
|
BaseClient.prototype.abortAll = function () {
|
||
|
var _this = this;
|
||
|
this._pendingApis.slice().forEach(function (v) {
|
||
|
return _this.abort(v.sn);
|
||
|
});
|
||
|
};
|
||
|
BaseClient.prototype._onRecvBuf = function (buf, pendingApiItem) {
|
||
|
var _a, _b, _c, _d, _e, _f, _g;
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var sn, pre, opParsed, parsed;
|
||
|
return __generator$1(this, function (_h) {
|
||
|
switch (_h.label) {
|
||
|
case 0:
|
||
|
sn = pendingApiItem === null || pendingApiItem === void 0 ? void 0 : pendingApiItem.sn;
|
||
|
this.options.debugBuf && ((_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug('[RecvBuf]' + (sn ? ' #' + sn : ''), 'length=' + buf.length, buf));
|
||
|
return [4,
|
||
|
this.flows.preRecvBufferFlow.exec({
|
||
|
buf: buf,
|
||
|
sn: sn
|
||
|
}, this.logger)];
|
||
|
case 1:
|
||
|
pre = _h.sent();
|
||
|
if (!pre) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
buf = pre.buf;
|
||
|
opParsed = TransportDataUtil.parseServerOutout(this.tsbuffer, this.serviceMap, buf, pendingApiItem === null || pendingApiItem === void 0 ? void 0 : pendingApiItem.service.id);
|
||
|
if (opParsed.isSucc) {
|
||
|
parsed = opParsed.result;
|
||
|
if (parsed.type === 'api') {
|
||
|
sn = sn !== null && sn !== void 0 ? sn : parsed.sn;
|
||
|
(_c = (_b = this._pendingApis.find(function (v) {
|
||
|
return v.sn === sn;
|
||
|
})) === null || _b === void 0 ? void 0 : _b.onReturn) === null || _c === void 0 ? void 0 : _c.call(_b, parsed.ret);
|
||
|
}
|
||
|
else if (parsed.type === 'msg') {
|
||
|
(_d = this.logger) === null || _d === void 0 ? void 0 : _d.log("[RecvMsg] " + parsed.service.name, parsed.msg);
|
||
|
this._msgHandlers.forEachHandler(parsed.service.name, this.logger, parsed.msg, this);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
(_e = this.logger) === null || _e === void 0 ? void 0 : _e.error('ParseServerOutputError: ' + opParsed.errMsg);
|
||
|
(_f = this.logger) === null || _f === void 0 ? void 0 : _f.error('Please check whether the proto on the server is the same as that on the client');
|
||
|
if (pendingApiItem) {
|
||
|
(_g = pendingApiItem.onReturn) === null || _g === void 0 ? void 0 : _g.call(pendingApiItem, {
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError('Parse server output error', {
|
||
|
type: TsrpcErrorType.ServerError
|
||
|
})
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
BaseClient.prototype._waitApiReturn = function (pendingItem, timeout) {
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
return [2,
|
||
|
new Promise(function (rs) {
|
||
|
var timer;
|
||
|
if (timeout) {
|
||
|
timer = setTimeout(function () {
|
||
|
timer = undefined;
|
||
|
_this._pendingApis.removeOne(function (v) {
|
||
|
return v.sn === pendingItem.sn;
|
||
|
});
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError('Request Timeout', {
|
||
|
type: TsrpcErrorType.NetworkError,
|
||
|
code: 'TIMEOUT'
|
||
|
})
|
||
|
});
|
||
|
}, timeout);
|
||
|
}
|
||
|
pendingItem.onReturn = function (ret) {
|
||
|
if (timer) {
|
||
|
clearTimeout(timer);
|
||
|
timer = undefined;
|
||
|
}
|
||
|
_this._pendingApis.removeOne(function (v) {
|
||
|
return v.sn === pendingItem.sn;
|
||
|
});
|
||
|
rs(ret);
|
||
|
};
|
||
|
})];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
return BaseClient;
|
||
|
}();
|
||
|
var defaultBaseClientOptions = {};
|
||
|
var BaseHttpClient = function (_super) {
|
||
|
__extends$1(BaseHttpClient, _super);
|
||
|
function BaseHttpClient(proto, http, options) {
|
||
|
var _a;
|
||
|
var _this = _super.call(this, proto, __assign$1(__assign$1({}, defaultBaseHttpClientOptions), options)) || this;
|
||
|
_this.type = 'SHORT';
|
||
|
_this._http = http;
|
||
|
_this._jsonServer = _this.options.server + (_this.options.server.endsWith('/') ? '' : '/');
|
||
|
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.log('TSRPC HTTP Client :', _this.options.server);
|
||
|
return _this;
|
||
|
}
|
||
|
BaseHttpClient.prototype._encodeApiReq = function (service, req, pendingItem) {
|
||
|
if (this.options.json) {
|
||
|
if (this.options.jsonPrune) {
|
||
|
var opPrune = this.tsbuffer.prune(req, pendingItem.service.reqSchemaId);
|
||
|
if (!opPrune.isSucc) {
|
||
|
return opPrune;
|
||
|
}
|
||
|
req = opPrune.pruneOutput;
|
||
|
}
|
||
|
return {
|
||
|
isSucc: true,
|
||
|
buf: JSON.stringify(req)
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
return TransportDataUtil.encodeApiReq(this.tsbuffer, service, req, undefined);
|
||
|
}
|
||
|
};
|
||
|
BaseHttpClient.prototype._encodeClientMsg = function (service, msg) {
|
||
|
if (this.options.json) {
|
||
|
if (this.options.jsonPrune) {
|
||
|
var opPrune = this.tsbuffer.prune(msg, service.msgSchemaId);
|
||
|
if (!opPrune.isSucc) {
|
||
|
return opPrune;
|
||
|
}
|
||
|
msg = opPrune.pruneOutput;
|
||
|
}
|
||
|
return {
|
||
|
isSucc: true,
|
||
|
buf: JSON.stringify(msg)
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
return TransportDataUtil.encodeClientMsg(this.tsbuffer, service, msg);
|
||
|
}
|
||
|
};
|
||
|
BaseHttpClient.prototype._sendBuf = function (buf, options, serviceId, pendingApiItem) {
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var sn, promise;
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
if (this.options.json) {
|
||
|
return [2,
|
||
|
this._sendJSON(buf, options, serviceId, pendingApiItem)];
|
||
|
}
|
||
|
sn = pendingApiItem === null || pendingApiItem === void 0 ? void 0 : pendingApiItem.sn;
|
||
|
promise = new Promise(function (rs) {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
var pre, _a, fetchPromise, abort, fetchRes;
|
||
|
var _b;
|
||
|
return __generator$1(this, function (_c) {
|
||
|
switch (_c.label) {
|
||
|
case 0:
|
||
|
return [4,
|
||
|
this.flows.preSendBufferFlow.exec({
|
||
|
buf: buf,
|
||
|
sn: pendingApiItem === null || pendingApiItem === void 0 ? void 0 : pendingApiItem.sn
|
||
|
}, this.logger)];
|
||
|
case 1:
|
||
|
pre = _c.sent();
|
||
|
if (!pre) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
buf = pre.buf;
|
||
|
this.options.debugBuf && ((_b = this.logger) === null || _b === void 0 ? void 0 : _b.debug('[SendBuf]' + (sn ? ' #' + sn : ''), "length=" + buf.length, buf));
|
||
|
_a = this._http.fetch({
|
||
|
url: this.options.server,
|
||
|
data: buf,
|
||
|
method: 'POST',
|
||
|
timeout: options.timeout || this.options.timeout,
|
||
|
transportOptions: options,
|
||
|
responseType: 'arraybuffer'
|
||
|
}), fetchPromise = _a.promise, abort = _a.abort;
|
||
|
if (pendingApiItem) {
|
||
|
pendingApiItem.onAbort = function () {
|
||
|
abort();
|
||
|
};
|
||
|
}
|
||
|
if (pendingApiItem === null || pendingApiItem === void 0 ? void 0 : pendingApiItem.isAborted) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
return [4,
|
||
|
fetchPromise];
|
||
|
case 2:
|
||
|
fetchRes = _c.sent();
|
||
|
if (!fetchRes.isSucc) {
|
||
|
rs({
|
||
|
err: fetchRes.err
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
rs({});
|
||
|
this._onRecvBuf(fetchRes.res, pendingApiItem);
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
promise.catch(function (e) { }).then(function () {
|
||
|
if (pendingApiItem) {
|
||
|
pendingApiItem.onAbort = undefined;
|
||
|
}
|
||
|
});
|
||
|
return [2,
|
||
|
promise];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
BaseHttpClient.prototype._sendJSON = function (jsonStr, options, serviceId, pendingApiItem) {
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
return [2,
|
||
|
new Promise(function (rs) {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
var _a, fetchPromise, abort, fetchRes, ret, opPrune;
|
||
|
var _b;
|
||
|
return __generator$1(this, function (_c) {
|
||
|
switch (_c.label) {
|
||
|
case 0:
|
||
|
_a = this._http.fetch({
|
||
|
url: this._jsonServer + this.serviceMap.id2Service[serviceId].name,
|
||
|
data: jsonStr,
|
||
|
method: 'POST',
|
||
|
timeout: options.timeout || this.options.timeout,
|
||
|
headers: {
|
||
|
'Content-Type': 'application/json'
|
||
|
},
|
||
|
transportOptions: options,
|
||
|
responseType: 'text'
|
||
|
}), fetchPromise = _a.promise, abort = _a.abort;
|
||
|
if (pendingApiItem) {
|
||
|
pendingApiItem.onAbort = function () {
|
||
|
abort();
|
||
|
};
|
||
|
}
|
||
|
if (pendingApiItem === null || pendingApiItem === void 0 ? void 0 : pendingApiItem.isAborted) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
return [4,
|
||
|
fetchPromise];
|
||
|
case 1:
|
||
|
fetchRes = _c.sent();
|
||
|
if (!fetchRes.isSucc) {
|
||
|
rs({
|
||
|
err: fetchRes.err
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
rs({});
|
||
|
try {
|
||
|
ret = JSON.parse(fetchRes.res);
|
||
|
}
|
||
|
catch (e) {
|
||
|
ret = {
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError({
|
||
|
message: e.message,
|
||
|
type: TsrpcError.Type.ServerError,
|
||
|
res: fetchRes.res
|
||
|
})
|
||
|
};
|
||
|
}
|
||
|
if (pendingApiItem) {
|
||
|
if (ret.isSucc) {
|
||
|
if (this.options.jsonPrune) {
|
||
|
opPrune = this.tsbuffer.prune(ret.res, pendingApiItem.service.resSchemaId);
|
||
|
if (opPrune.isSucc) {
|
||
|
ret.res = opPrune.pruneOutput;
|
||
|
}
|
||
|
else {
|
||
|
ret = {
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError('Invalid Server Output', {
|
||
|
type: TsrpcError.Type.ClientError,
|
||
|
innerErr: opPrune.errMsg
|
||
|
})
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
ret.err = new TsrpcError(ret.err);
|
||
|
}
|
||
|
(_b = pendingApiItem.onReturn) === null || _b === void 0 ? void 0 : _b.call(pendingApiItem, ret);
|
||
|
}
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
})];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
return BaseHttpClient;
|
||
|
}(BaseClient);
|
||
|
var defaultBaseHttpClientOptions = __assign$1(__assign$1({}, defaultBaseClientOptions), {
|
||
|
server: 'http://localhost:3000',
|
||
|
json: false,
|
||
|
jsonPrune: true
|
||
|
});
|
||
|
var BaseWsClient = function (_super) {
|
||
|
__extends$1(BaseWsClient, _super);
|
||
|
function BaseWsClient(proto, wsp, options) {
|
||
|
var _a;
|
||
|
var _this = _super.call(this, proto, __assign$1(__assign$1({}, defaultBaseWsClientOptions), options)) || this;
|
||
|
_this.type = 'LONG';
|
||
|
_this._onWsOpen = function () {
|
||
|
var _a;
|
||
|
if (!_this._connecting) {
|
||
|
return;
|
||
|
}
|
||
|
_this._status = WsClientStatus.Opened;
|
||
|
_this._connecting.rs({
|
||
|
isSucc: true
|
||
|
});
|
||
|
_this._connecting = undefined;
|
||
|
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.log('WebSocket connection to server successful');
|
||
|
_this.flows.postConnectFlow.exec({}, _this.logger);
|
||
|
};
|
||
|
_this._onWsClose = function (code, reason) {
|
||
|
var _a, _b;
|
||
|
var isConnectedBefore = _this.isConnected;
|
||
|
_this._status = WsClientStatus.Closed;
|
||
|
if (_this._connecting) {
|
||
|
_this._connecting.rs({
|
||
|
isSucc: false,
|
||
|
errMsg: 'WebSocket connection to server failed'
|
||
|
});
|
||
|
_this._connecting = undefined;
|
||
|
}
|
||
|
var isManual = !!_this._rsDisconnecting;
|
||
|
if (_this._rsDisconnecting) {
|
||
|
_this._rsDisconnecting();
|
||
|
_this._rsDisconnecting = undefined;
|
||
|
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.log('Disconnected succ', "code=" + code + " reason=" + reason);
|
||
|
}
|
||
|
else if (isConnectedBefore) {
|
||
|
(_b = _this.logger) === null || _b === void 0 ? void 0 : _b.log("Lost connection to " + _this.options.server, "code=" + code + " reason=" + reason);
|
||
|
}
|
||
|
if (isConnectedBefore) {
|
||
|
_this.flows.postDisconnectFlow.exec({
|
||
|
reason: reason,
|
||
|
isManual: isManual
|
||
|
}, _this.logger);
|
||
|
}
|
||
|
};
|
||
|
_this._onWsError = function (e) {
|
||
|
var _a;
|
||
|
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.error('[WebSocket Error]', e);
|
||
|
};
|
||
|
_this._onWsMessage = function (data) {
|
||
|
var _a;
|
||
|
if (typeof data === 'string') {
|
||
|
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.warn('[RecvText]', data);
|
||
|
}
|
||
|
else {
|
||
|
_this._onRecvBuf(data);
|
||
|
}
|
||
|
};
|
||
|
_this._status = WsClientStatus.Closed;
|
||
|
_this._wsp = wsp;
|
||
|
wsp.options = {
|
||
|
onOpen: _this._onWsOpen,
|
||
|
onClose: _this._onWsClose,
|
||
|
onError: _this._onWsError,
|
||
|
onMessage: _this._onWsMessage,
|
||
|
logger: _this.logger
|
||
|
};
|
||
|
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.log('TSRPC WebSocket Client :', _this.options.server);
|
||
|
return _this;
|
||
|
}
|
||
|
BaseWsClient.prototype._sendBuf = function (buf, options, serviceId, pendingApiItem) {
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
return [2,
|
||
|
new Promise(function (rs) {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
var pre;
|
||
|
var _a;
|
||
|
return __generator$1(this, function (_b) {
|
||
|
switch (_b.label) {
|
||
|
case 0:
|
||
|
return [4,
|
||
|
this.flows.preSendBufferFlow.exec({
|
||
|
buf: buf,
|
||
|
sn: pendingApiItem === null || pendingApiItem === void 0 ? void 0 : pendingApiItem.sn
|
||
|
}, this.logger)];
|
||
|
case 1:
|
||
|
pre = _b.sent();
|
||
|
if (!pre) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
buf = pre.buf;
|
||
|
if (!this.isConnected) {
|
||
|
rs({
|
||
|
err: new TsrpcError('WebSocket is not connected', {
|
||
|
code: 'WS_NOT_OPEN',
|
||
|
type: TsrpcError.Type.ClientError
|
||
|
})
|
||
|
});
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
if (this.options.debugBuf && buf instanceof Uint8Array) {
|
||
|
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug('[SendBuf]' + (pendingApiItem ? ' #' + pendingApiItem.sn : ''), "length=" + buf.byteLength, buf);
|
||
|
}
|
||
|
rs(this._wsp.send(buf));
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
})];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
Object.defineProperty(BaseWsClient.prototype, "status", {
|
||
|
get: function get() {
|
||
|
return this._status;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
Object.defineProperty(BaseWsClient.prototype, "isConnected", {
|
||
|
get: function get() {
|
||
|
return this._status === WsClientStatus.Opened;
|
||
|
},
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
BaseWsClient.prototype.connect = function () {
|
||
|
var _a;
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var pre, promiseConnect;
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_b) {
|
||
|
switch (_b.label) {
|
||
|
case 0:
|
||
|
if (this.isConnected) {
|
||
|
return [2,
|
||
|
{
|
||
|
isSucc: true
|
||
|
}];
|
||
|
}
|
||
|
if (this._connecting) {
|
||
|
return [2,
|
||
|
this._connecting.promise];
|
||
|
}
|
||
|
return [4,
|
||
|
this.flows.preConnectFlow.exec({}, this.logger)];
|
||
|
case 1:
|
||
|
pre = _b.sent();
|
||
|
if (pre === null || pre === void 0 ? void 0 : pre.return) {
|
||
|
return [2,
|
||
|
pre.return];
|
||
|
}
|
||
|
if (!pre) {
|
||
|
return [2,
|
||
|
new Promise(function (rs) { })];
|
||
|
}
|
||
|
try {
|
||
|
this._wsp.connect(this.options.server);
|
||
|
}
|
||
|
catch (e) {
|
||
|
return [2,
|
||
|
{
|
||
|
isSucc: false,
|
||
|
errMsg: e.message
|
||
|
}];
|
||
|
}
|
||
|
this._status = WsClientStatus.Opening;
|
||
|
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.log("Start connecting " + this.options.server + "...");
|
||
|
this._connecting = {};
|
||
|
promiseConnect = new Promise(function (rs) {
|
||
|
_this._connecting.rs = rs;
|
||
|
});
|
||
|
this._connecting.promise = promiseConnect;
|
||
|
return [2,
|
||
|
promiseConnect];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
BaseWsClient.prototype.disconnect = function (code, reason) {
|
||
|
var _a;
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var _this = this;
|
||
|
return __generator$1(this, function (_b) {
|
||
|
if (this._status === WsClientStatus.Closed) {
|
||
|
return [2
|
||
|
];
|
||
|
}
|
||
|
this._status = WsClientStatus.Closing;
|
||
|
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.log('Start disconnecting...');
|
||
|
return [2,
|
||
|
new Promise(function (rs) {
|
||
|
_this._rsDisconnecting = rs;
|
||
|
_this._wsp.close(code, reason);
|
||
|
})];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
return BaseWsClient;
|
||
|
}(BaseClient);
|
||
|
var defaultBaseWsClientOptions = __assign$1(__assign$1({}, defaultBaseClientOptions), {
|
||
|
server: 'ws://localhost:3000'
|
||
|
});
|
||
|
var WsClientStatus;
|
||
|
(function (WsClientStatus) {
|
||
|
WsClientStatus["Opening"] = "OPENING";
|
||
|
WsClientStatus["Opened"] = "OPENED";
|
||
|
WsClientStatus["Closing"] = "CLOSING";
|
||
|
WsClientStatus["Closed"] = "CLOSED";
|
||
|
})(WsClientStatus || (WsClientStatus = {}));
|
||
|
var HttpProxy = (function () {
|
||
|
function HttpProxy() {
|
||
|
}
|
||
|
HttpProxy.prototype.fetch = function (options) {
|
||
|
var _this = this;
|
||
|
var rs;
|
||
|
var promise = new Promise(function (_rs) {
|
||
|
rs = _rs;
|
||
|
});
|
||
|
var xhr = new XMLHttpRequest();
|
||
|
if (navigator.userAgent.indexOf('MSIE 8.0;') > -1) {
|
||
|
xhr.onreadystatechange = function () {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
return __generator$1(this, function (_a) {
|
||
|
if (xhr.readyState == 4) {
|
||
|
if (xhr.status == 0 || (xhr.response == null && xhr.responseText == null)) {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError('Network Error', {
|
||
|
type: TsrpcError.Type.NetworkError,
|
||
|
httpCode: xhr.status
|
||
|
})
|
||
|
});
|
||
|
return [2];
|
||
|
}
|
||
|
if (xhr.status == 12029) {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError({
|
||
|
message: 'Network Error',
|
||
|
type: TsrpcError.Type.NetworkError,
|
||
|
httpCode: xhr.status
|
||
|
})
|
||
|
});
|
||
|
return [2];
|
||
|
}
|
||
|
rs({
|
||
|
isSucc: true,
|
||
|
res: options.responseType === 'text' ? xhr.responseText : new Uint8Array(xhr.response)
|
||
|
});
|
||
|
}
|
||
|
return [2];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
xhr.onerror = function () {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError({
|
||
|
message: 'Network Error',
|
||
|
type: TsrpcError.Type.NetworkError,
|
||
|
httpCode: xhr.status
|
||
|
})
|
||
|
});
|
||
|
};
|
||
|
xhr.ontimeout = function () {
|
||
|
rs({
|
||
|
isSucc: false,
|
||
|
err: new TsrpcError({
|
||
|
message: 'Request Timeout',
|
||
|
type: TsrpcError.Type.NetworkError,
|
||
|
code: 'TIMEOUT'
|
||
|
})
|
||
|
});
|
||
|
};
|
||
|
xhr.onload = function () {
|
||
|
return __awaiter$1(_this, void 0, void 0, function () {
|
||
|
return __generator$1(this, function (_a) {
|
||
|
rs({
|
||
|
isSucc: true,
|
||
|
res: xhr.response && (options.responseType === 'text' ? xhr.responseText : new Uint8Array(xhr.response))
|
||
|
});
|
||
|
return [2];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
var transportOptions_1 = options.transportOptions;
|
||
|
if (!!transportOptions_1.onProgress) {
|
||
|
xhr.upload.onprogress = function (e) {
|
||
|
var _a;
|
||
|
(_a = transportOptions_1.onProgress) === null || _a === void 0 ? void 0 : _a.call(transportOptions_1, e.loaded / e.total);
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
xhr.open(options.method, options.url, true);
|
||
|
if (options.headers) {
|
||
|
for (var key in options.headers) {
|
||
|
xhr.setRequestHeader(key, options.headers[key]);
|
||
|
}
|
||
|
}
|
||
|
xhr.responseType = options.responseType;
|
||
|
var timeout = options.timeout;
|
||
|
if (timeout) {
|
||
|
xhr.timeout = timeout;
|
||
|
}
|
||
|
xhr.send(options.data);
|
||
|
var abort = xhr.abort.bind(xhr);
|
||
|
return {
|
||
|
promise: promise,
|
||
|
abort: abort
|
||
|
};
|
||
|
};
|
||
|
return HttpProxy;
|
||
|
}());
|
||
|
var HttpClient = (function (_super) {
|
||
|
__extends$1(HttpClient, _super);
|
||
|
function HttpClient(proto, options) {
|
||
|
var _this = this;
|
||
|
var httpProxy = new HttpProxy;
|
||
|
_this = _super.call(this, proto, httpProxy, __assign$1(__assign$1({}, defaultHttpClientOptions), options)) || this;
|
||
|
return _this;
|
||
|
}
|
||
|
HttpClient.prototype.callApi = function (apiName, req, options) {
|
||
|
if (options === void 0) {
|
||
|
options = {};
|
||
|
}
|
||
|
return _super.prototype.callApi.call(this, apiName, req, options);
|
||
|
};
|
||
|
HttpClient.prototype.sendMsg = function (msgName, msg, options) {
|
||
|
if (options === void 0) {
|
||
|
options = {};
|
||
|
}
|
||
|
return _super.prototype.sendMsg.call(this, msgName, msg, options);
|
||
|
};
|
||
|
return HttpClient;
|
||
|
}(BaseHttpClient));
|
||
|
var defaultHttpClientOptions = __assign$1({}, defaultBaseHttpClientOptions);
|
||
|
var WebSocketProxy = (function () {
|
||
|
function WebSocketProxy() {
|
||
|
}
|
||
|
WebSocketProxy.prototype.connect = function (server) {
|
||
|
var _this = this;
|
||
|
this._ws = new WebSocket(server);
|
||
|
this._ws.binaryType = 'arraybuffer';
|
||
|
this._ws.onopen = this.options.onOpen;
|
||
|
this._ws.onclose = function (e) {
|
||
|
_this.options.onClose(e.code, e.reason);
|
||
|
_this._ws = undefined;
|
||
|
};
|
||
|
this._ws.onmessage = function (e) {
|
||
|
var _a;
|
||
|
if (e.data instanceof ArrayBuffer) {
|
||
|
_this.options.onMessage(new Uint8Array(e.data));
|
||
|
}
|
||
|
else if (typeof e.data === 'string') {
|
||
|
_this.options.onMessage(e.data);
|
||
|
}
|
||
|
else {
|
||
|
(_a = _this.options.logger) === null || _a === void 0 ? void 0 : _a.warn('[Unresolved Recv]', e.data);
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
WebSocketProxy.prototype.close = function (code, reason) {
|
||
|
var _a;
|
||
|
(_a = this._ws) === null || _a === void 0 ? void 0 : _a.close(code, reason);
|
||
|
this._ws = undefined;
|
||
|
};
|
||
|
WebSocketProxy.prototype.send = function (data) {
|
||
|
return __awaiter$1(this, void 0, void 0, function () {
|
||
|
var sendData, buf;
|
||
|
return __generator$1(this, function (_a) {
|
||
|
try {
|
||
|
sendData = void 0;
|
||
|
if (typeof data === 'string') {
|
||
|
sendData = data;
|
||
|
}
|
||
|
else {
|
||
|
buf = data;
|
||
|
if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
|
||
|
sendData = buf.buffer;
|
||
|
}
|
||
|
else {
|
||
|
sendData = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
||
|
}
|
||
|
}
|
||
|
this._ws.send(sendData);
|
||
|
return [2, {}];
|
||
|
}
|
||
|
catch (err) {
|
||
|
return [2, {
|
||
|
err: new TsrpcError('Network Error', {
|
||
|
code: 'SEND_BUF_ERR',
|
||
|
type: TsrpcError.Type.NetworkError,
|
||
|
innerErr: err
|
||
|
})
|
||
|
}];
|
||
|
}
|
||
|
return [2];
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
return WebSocketProxy;
|
||
|
}());
|
||
|
var WsClient = (function (_super) {
|
||
|
__extends$1(WsClient, _super);
|
||
|
function WsClient(proto, options) {
|
||
|
var _this = this;
|
||
|
var wsp = new WebSocketProxy();
|
||
|
_this = _super.call(this, proto, wsp, __assign$1(__assign$1({}, defaultWsClientOptions), options)) || this;
|
||
|
return _this;
|
||
|
}
|
||
|
return WsClient;
|
||
|
}(BaseWsClient));
|
||
|
var defaultWsClientOptions = __assign$1({}, defaultBaseWsClientOptions);
|
||
|
|
||
|
let client = new HttpClient(serviceProto, {
|
||
|
server: 'http://localhost:3000',
|
||
|
logger: console
|
||
|
});
|
||
|
function test() {
|
||
|
return __awaiter(this, void 0, void 0, function* () {
|
||
|
yield client.callApi('AddData', {
|
||
|
content: 'AAAAA'
|
||
|
});
|
||
|
let ret = yield client.callApi('GetData', {});
|
||
|
console.log('ret', ret);
|
||
|
});
|
||
|
}
|
||
|
test();
|
||
|
class Main {
|
||
|
constructor() {
|
||
|
if (window["Laya3D"])
|
||
|
Laya3D.init(GameConfig.width, GameConfig.height);
|
||
|
else
|
||
|
Laya.init(GameConfig.width, GameConfig.height, Laya["WebGL"]);
|
||
|
Laya["Physics"] && Laya["Physics"].enable();
|
||
|
Laya["DebugPanel"] && Laya["DebugPanel"].enable();
|
||
|
Laya.stage.scaleMode = GameConfig.scaleMode;
|
||
|
Laya.stage.screenMode = GameConfig.screenMode;
|
||
|
Laya.stage.alignV = GameConfig.alignV;
|
||
|
Laya.stage.alignH = GameConfig.alignH;
|
||
|
Laya.URL.exportSceneToJson = GameConfig.exportSceneToJson;
|
||
|
if (GameConfig.debug || Laya.Utils.getQueryString("debug") == "true")
|
||
|
Laya.enableDebugPanel();
|
||
|
if (GameConfig.physicsDebug && Laya["PhysicsDebugDraw"])
|
||
|
Laya["PhysicsDebugDraw"].enable();
|
||
|
if (GameConfig.stat)
|
||
|
Laya.Stat.show();
|
||
|
Laya.alertGlobalError(true);
|
||
|
Laya.ResourceVersion.enable("version.json", Laya.Handler.create(this, this.onVersionLoaded), Laya.ResourceVersion.FILENAME_VERSION);
|
||
|
}
|
||
|
onVersionLoaded() {
|
||
|
Laya.AtlasInfoManager.enable("fileconfig.json", Laya.Handler.create(this, this.onConfigLoaded));
|
||
|
}
|
||
|
onConfigLoaded() {
|
||
|
GameConfig.startScene && Laya.Scene.open(GameConfig.startScene);
|
||
|
}
|
||
|
}
|
||
|
new Main();
|
||
|
|
||
|
}());
|