int-cli
Version:
INT is the new generation of bottom-up created system of IoT and blockchain
69 lines (68 loc) • 2.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const error_code_1 = require("../error_code");
const chain_1 = require("../chain");
class ViewExecutor {
constructor(options) {
this.m_handler = options.handler;
this.m_method = options.method;
this.m_param = options.param;
this.m_externContext = options.externContext;
this.m_header = options.header;
this.m_storage = options.storage;
this.m_logger = options.logger;
}
get externContext() {
return this.m_externContext;
}
async prepareContext(blockHeader, storage, externContext) {
let database = (await storage.getReadableDataBase(chain_1.Chain.dbUser)).value;
let context = Object.create(externContext);
// context.getNow = (): number => {
// return blockHeader.timestamp;
// };
Object.defineProperty(context, 'now', {
writable: false,
value: blockHeader.timestamp
});
// context.getHeight = (): number => {
// return blockHeader.number;
// };
Object.defineProperty(context, 'height', {
writable: false,
value: blockHeader.number
});
// context.getStorage = (): IReadWritableKeyValue => {
// return kv;
// }
Object.defineProperty(context, 'storage', {
writable: false,
value: database
});
Object.defineProperty(context, 'logger', {
writable: false,
value: this.m_logger
});
return context;
}
async execute() {
let fcall = this.m_handler.getViewMethod(this.m_method);
if (!fcall) {
// 找不到view method时, 错误日志里列出全部可选的method
let methods = this.m_handler.getViewMethodNames();
this.m_logger.error(`view execute getViewMethod fail, method=${this.m_method}; suport methods [${methods.join(',')} ]`);
return { err: error_code_1.ErrorCode.RESULT_NOT_SUPPORT, methods };
}
let context = await this.prepareContext(this.m_header, this.m_storage, this.m_externContext);
try {
this.m_logger.info(`will execute view method ${this.m_method}, params ${JSON.stringify(this.m_param)}`);
let v = await fcall(context, this.m_param);
return { err: error_code_1.ErrorCode.RESULT_OK, value: v };
}
catch (error) {
this.m_logger.error(`view execute error ${error}`);
return { err: error_code_1.ErrorCode.RESULT_EXCEPTION };
}
}
}
exports.ViewExecutor = ViewExecutor;