4952 lines
215 KiB
JavaScript
Raw Normal View History

2021-07-21 23:11:13 +08:00
(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();
}());