UNPKG

redisai-js

Version:

A high-performance Typescript client for RedisAI

997 lines 66.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var client_1 = require("../src/client"); var redis_1 = require("redis"); var tensor_1 = require("../src/tensor"); var dtype_1 = require("../src/dtype"); require("mocha"); var chai_1 = require("chai"); var model_1 = require("../src/model"); var fs = __importStar(require("fs")); var backend_1 = require("../src/backend"); var script_1 = require("../src/script"); var src_1 = require("../src"); var util_1 = __importDefault(require("util")); // tslint:disable-next-line:no-var-requires var Jimp = require('jimp'); var mochaAsync = function (fn) { return function (done) { fn.call().then(done, function (err) { done(err); }); }; }; it('test vanilla client access', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); return [4 /*yield*/, util_1.default.promisify(aiclient.client.set).bind(aiclient.client)('redisai-js-foo', 'foo')]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.tensorset positive testing without data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, tensor, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 1], null); return [4 /*yield*/, aiclient.tensorset('t1', tensor)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.tensorset positive testing with data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, tensor, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]); return [4 /*yield*/, aiclient.tensorset('t1', tensor)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.tensorset negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, tensor, result, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [-1, 1], null); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, aiclient.tensorset('t1', tensor)]; case 2: result = _a.sent(); return [3 /*break*/, 4]; case 3: e_1 = _a.sent(); chai_1.expect(e_1.toString()).to.equal('ReplyError: ERR invalid or negative value found in tensor shape'); return [3 /*break*/, 4]; case 4: aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.tensorset/ai.tensorget positive testing with data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, tensor, result, tensorg, i; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]); return [4 /*yield*/, aiclient.tensorset('t1', tensor)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); return [4 /*yield*/, aiclient.tensorget('t1')]; case 2: tensorg = _a.sent(); for (i = 0; i < tensor.data.length; i++) { chai_1.expect(tensorg.data[i]).to.equal(tensor.data[i]); } aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.tensorset/ai.tensorget positive testing with default data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, tensor, result, tensorg, i; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], null); return [4 /*yield*/, aiclient.tensorset('t1', tensor)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); return [4 /*yield*/, aiclient.tensorget('t1')]; case 2: tensorg = _a.sent(); for (i = 0; i < tensorg.data.length; i++) { chai_1.expect(tensorg.data[i]).to.equal(0); } aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.tensorget positive/negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var mockedTensorGetReply, result, e_2, mockedTensorGetReply2, result12, e_3, mockedTensorGetReply3, result3, e_4, mockedTensorGetReply4, result4, e_5, mockedTensorGetReply5, tensor; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); mockedTensorGetReply = []; return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply)]; case 1: result = _a.sent(); return [3 /*break*/, 3]; case 2: e_2 = _a.sent(); chai_1.expect(e_2.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing dtype,shape,values.'); return [3 /*break*/, 3]; case 3: _a.trys.push([3, 5, , 6]); mockedTensorGetReply2 = ['shape', [1], 'values', [10]]; return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply2)]; case 4: result12 = _a.sent(); return [3 /*break*/, 6]; case 5: e_3 = _a.sent(); chai_1.expect(e_3.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing dtype.'); return [3 /*break*/, 6]; case 6: _a.trys.push([6, 8, , 9]); mockedTensorGetReply3 = ['dtype', 'FLOAT', 'values', [10]]; return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply3)]; case 7: result3 = _a.sent(); return [3 /*break*/, 9]; case 8: e_4 = _a.sent(); chai_1.expect(e_4.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing shape.'); return [3 /*break*/, 9]; case 9: _a.trys.push([9, 11, , 12]); mockedTensorGetReply4 = ['dtype', 'FLOAT', 'shape', [1]]; return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply4)]; case 10: result4 = _a.sent(); return [3 /*break*/, 12]; case 11: e_5 = _a.sent(); chai_1.expect(e_5.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing values.'); return [3 /*break*/, 12]; case 12: mockedTensorGetReply5 = ['dtype', 'FLOAT', 'shape', [1], 'values', [10]]; return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply5)]; case 13: tensor = _a.sent(); chai_1.expect(tensor.data[0]).to.closeTo(10.0, 0.1); return [2 /*return*/]; } }); }); })); it('ai.tensorset/ai.tensorget positive testing with default data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, inputImage, imageWidth, imageHeight, image, helpers, normalized, buffer, tensor, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); return [4 /*yield*/, Jimp.read('./tests/test_data/panda-224x224.jpg')]; case 1: inputImage = _a.sent(); imageWidth = 224; imageHeight = 224; image = inputImage.cover(imageWidth, imageHeight); helpers = new src_1.Helpers(); normalized = helpers.normalizeRGB(image.bitmap.data); buffer = Buffer.from(normalized.buffer); tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [imageWidth, imageHeight, 3], buffer); return [4 /*yield*/, aiclient.tensorset('tensor-image', tensor)]; case 2: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.tensorget negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, result, e_6; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, aiclient.tensorget('dontexist')]; case 2: result = _a.sent(); return [3 /*break*/, 4]; case 3: e_6 = _a.sent(); chai_1.expect(e_6.toString()).to.equal('ReplyError: ERR tensor key is empty'); return [3 /*break*/, 4]; case 4: aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelset modelOnnx linear_iris testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlobOnnx, modelOnnx, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlobOnnx = fs.readFileSync('./tests/test_data/linear_iris.onnx'); modelOnnx = new model_1.Model(backend_1.Backend.ONNX, 'CPU', [], [], modelBlobOnnx); return [4 /*yield*/, aiclient.modelset('modelOnnx', modelOnnx)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelset modelOnnx mnist testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlobOnnx, modelOnnx, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlobOnnx = fs.readFileSync('./tests/test_data/mnist.onnx'); modelOnnx = new model_1.Model(backend_1.Backend.ONNX, 'CPU', [], [], modelBlobOnnx); return [4 /*yield*/, aiclient.modelset('mnist', modelOnnx)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelset positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, model, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob); return [4 /*yield*/, aiclient.modelset('m1', model)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelset tiny-yolo-voc testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, model, result; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlob = fs.readFileSync('./tests/test_data/tiny-yolo-voc.pb'); model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['input'], ['output'], modelBlob); return [4 /*yield*/, aiclient.modelset('tiny-yolo-voc', model)]; case 1: result = _a.sent(); chai_1.expect(result).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelrun positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, tensorA, resultA, tensorB, resultB, modelBlob, model, resultModelSet, resultModelRun, tensorC; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]); return [4 /*yield*/, aiclient.tensorset('tensorA', tensorA)]; case 1: resultA = _a.sent(); chai_1.expect(resultA).to.equal('OK'); tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]); return [4 /*yield*/, aiclient.tensorset('tensorB', tensorB)]; case 2: resultB = _a.sent(); chai_1.expect(resultB).to.equal('OK'); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob); return [4 /*yield*/, aiclient.modelset('mymodel', model)]; case 3: resultModelSet = _a.sent(); chai_1.expect(resultModelSet).to.equal('OK'); return [4 /*yield*/, aiclient.modelrun('mymodel', ['tensorA', 'tensorB'], ['tensorC'])]; case 4: resultModelRun = _a.sent(); chai_1.expect(resultModelRun).to.equal('OK'); return [4 /*yield*/, aiclient.tensorget('tensorC')]; case 5: tensorC = _a.sent(); chai_1.expect(tensorC.data[0]).to.closeTo(6.0, 0.1); chai_1.expect(tensorC.data[1]).to.closeTo(15.0, 0.1); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelrun with tag positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, tensorA, resultA, tensorB, resultB, modelBlob, model, resultModelSet, resultModelRun, tensorC, modelInfo, resultModelResetStat; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]); return [4 /*yield*/, aiclient.tensorset('tensorA', tensorA)]; case 1: resultA = _a.sent(); chai_1.expect(resultA).to.equal('OK'); tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]); return [4 /*yield*/, aiclient.tensorset('tensorB', tensorB)]; case 2: resultB = _a.sent(); chai_1.expect(resultB).to.equal('OK'); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob); model.tag = 'test_tag'; return [4 /*yield*/, aiclient.modelset('mymodel-wtag', model)]; case 3: resultModelSet = _a.sent(); chai_1.expect(resultModelSet).to.equal('OK'); return [4 /*yield*/, aiclient.modelrun('mymodel-wtag', ['tensorA', 'tensorB'], ['tensorC'])]; case 4: resultModelRun = _a.sent(); chai_1.expect(resultModelRun).to.equal('OK'); return [4 /*yield*/, aiclient.tensorget('tensorC')]; case 5: tensorC = _a.sent(); chai_1.expect(tensorC.data[0]).to.closeTo(6.0, 0.1); chai_1.expect(tensorC.data[1]).to.closeTo(15.0, 0.1); return [4 /*yield*/, aiclient.info('mymodel-wtag')]; case 6: modelInfo = _a.sent(); chai_1.expect(modelInfo.key).to.equal('mymodel-wtag'); chai_1.expect(modelInfo.tag).to.equal('test_tag'); chai_1.expect(modelInfo.calls).to.equal(1); return [4 /*yield*/, aiclient.infoResetStat('mymodel-wtag')]; case 7: resultModelResetStat = _a.sent(); chai_1.expect(resultModelResetStat).to.equal('OK'); return [4 /*yield*/, aiclient.info('mymodel-wtag')]; case 8: modelInfo = _a.sent(); chai_1.expect(modelInfo.calls).to.equal(0); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modeldel positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, model, resultModelSet, resultModelDel; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob); model.tag = 'test_tag'; return [4 /*yield*/, aiclient.modelset('mymodel-wtag', model)]; case 1: resultModelSet = _a.sent(); chai_1.expect(resultModelSet).to.equal('OK'); return [4 /*yield*/, aiclient.modeldel('mymodel-wtag')]; case 2: resultModelDel = _a.sent(); chai_1.expect(resultModelDel).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelget positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, inputs, outputs, model, resultModelSet, modelOut, index, index; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); inputs = ['a', 'b']; outputs = ['c']; model = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob); model.tag = 'test_tag'; return [4 /*yield*/, aiclient.modelset('mymodel', model)]; case 1: resultModelSet = _a.sent(); chai_1.expect(resultModelSet).to.equal('OK'); return [4 /*yield*/, aiclient.modelget('mymodel')]; case 2: modelOut = _a.sent(); chai_1.expect(modelOut.blob.toString()).to.equal(modelBlob.toString()); for (index = 0; index < modelOut.outputs.length; index++) { chai_1.expect(modelOut.outputs[index]).to.equal(outputs[index]); chai_1.expect(modelOut.outputs[index]).to.equal(model.outputs[index]); } for (index = 0; index < modelOut.inputs.length; index++) { chai_1.expect(modelOut.inputs[index]).to.equal(inputs[index]); chai_1.expect(modelOut.inputs[index]).to.equal(model.inputs[index]); } chai_1.expect(modelOut.batchsize).to.equal(model.batchsize); chai_1.expect(modelOut.minbatchsize).to.equal(model.minbatchsize); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelget batching positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, inputs, outputs, model, resultModelSet, modelOut, resultModelSet2, modelOut2; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); inputs = ['a', 'b']; outputs = ['c']; model = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob); model.tag = 'test_tag'; model.batchsize = 100; model.minbatchsize = 5; return [4 /*yield*/, aiclient.modelset('mymodel-batching', model)]; case 1: resultModelSet = _a.sent(); chai_1.expect(resultModelSet).to.equal('OK'); return [4 /*yield*/, aiclient.modelget('mymodel-batching')]; case 2: modelOut = _a.sent(); return [4 /*yield*/, aiclient.modelset('mymodel-batching-loop', modelOut)]; case 3: resultModelSet2 = _a.sent(); chai_1.expect(resultModelSet2).to.equal('OK'); return [4 /*yield*/, aiclient.modelget('mymodel-batching-loop')]; case 4: modelOut2 = _a.sent(); chai_1.expect(modelOut.batchsize).to.equal(model.batchsize); chai_1.expect(modelOut.minbatchsize).to.equal(model.minbatchsize); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelget batching via constructor positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, inputs, outputs, model, resultModelSet, modelOut, resultModelSet2, modelOut2, model2; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); inputs = ['a', 'b']; outputs = ['c']; model = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob, 100, 5); model.tag = 'test_tag'; return [4 /*yield*/, aiclient.modelset('mymodel-batching-t2', model)]; case 1: resultModelSet = _a.sent(); chai_1.expect(resultModelSet).to.equal('OK'); return [4 /*yield*/, aiclient.modelget('mymodel-batching-t2')]; case 2: modelOut = _a.sent(); return [4 /*yield*/, aiclient.modelset('mymodel-batching-loop-t2', modelOut)]; case 3: resultModelSet2 = _a.sent(); chai_1.expect(resultModelSet2).to.equal('OK'); return [4 /*yield*/, aiclient.modelget('mymodel-batching-loop')]; case 4: modelOut2 = _a.sent(); chai_1.expect(modelOut.batchsize).to.equal(model.batchsize); chai_1.expect(modelOut.minbatchsize).to.equal(model.minbatchsize); model2 = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob, 1000); chai_1.expect(model2.batchsize).to.equal(1000); chai_1.expect(model2.minbatchsize).to.equal(0); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelget negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var mockedReply, result, e_7, mockedReply, result, e_8, mockedReply, result, e_9, mockedReply, result, e_10; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); mockedReply = []; return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)]; case 1: result = _a.sent(); return [3 /*break*/, 3]; case 2: e_7 = _a.sent(); chai_1.expect(e_7.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing backend,device,blob.'); return [3 /*break*/, 3]; case 3: _a.trys.push([3, 5, , 6]); mockedReply = ['backend', 'TF', 'device', 'CPU']; return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)]; case 4: result = _a.sent(); return [3 /*break*/, 6]; case 5: e_8 = _a.sent(); chai_1.expect(e_8.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing blob.'); return [3 /*break*/, 6]; case 6: _a.trys.push([6, 8, , 9]); mockedReply = ['blob', [], 'device', 'CPU']; return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)]; case 7: result = _a.sent(); return [3 /*break*/, 9]; case 8: e_9 = _a.sent(); chai_1.expect(e_9.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing backend.'); return [3 /*break*/, 9]; case 9: _a.trys.push([9, 11, , 12]); mockedReply = ['blob', [], 'backend', 'TF']; return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)]; case 10: result = _a.sent(); return [3 /*break*/, 12]; case 11: e_10 = _a.sent(); chai_1.expect(e_10.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing device.'); return [3 /*break*/, 12]; case 12: return [2 /*return*/]; } }); }); })); it('ai.scriptrun with tag positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, scriptFileStr, scriptStr, tensorA, resultA, tensorB, resultB, script, script2, resultScriptSet, resultScriptSetWithTag, resultScriptRun, resultScriptRunWithTag, tensorC, tensorD, scriptInfo, scriptInfoTag, resultScriptResetStat; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); scriptFileStr = fs.readFileSync('./tests/test_data/script.txt').toString(); scriptStr = 'def bar(a, b):\n return a + b\n'; tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]); return [4 /*yield*/, aiclient.tensorset('tensorA', tensorA)]; case 1: resultA = _a.sent(); chai_1.expect(resultA).to.equal('OK'); tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]); return [4 /*yield*/, aiclient.tensorset('tensorB', tensorB)]; case 2: resultB = _a.sent(); chai_1.expect(resultB).to.equal('OK'); script = new script_1.Script('CPU', scriptFileStr); script2 = new script_1.Script('CPU', scriptStr); script2.tag = 'test_tag'; return [4 /*yield*/, aiclient.scriptset('myscript', script)]; case 3: resultScriptSet = _a.sent(); chai_1.expect(resultScriptSet).to.equal('OK'); return [4 /*yield*/, aiclient.scriptset('myscript-wtag', script2)]; case 4: resultScriptSetWithTag = _a.sent(); chai_1.expect(resultScriptSetWithTag).to.equal('OK'); return [4 /*yield*/, aiclient.scriptrun('myscript', 'bar', ['tensorA', 'tensorB'], ['tensorC'])]; case 5: resultScriptRun = _a.sent(); return [4 /*yield*/, aiclient.scriptrun('myscript-wtag', 'bar', ['tensorA', 'tensorB'], ['tensorD'])]; case 6: resultScriptRunWithTag = _a.sent(); chai_1.expect(resultScriptRun).to.equal('OK'); chai_1.expect(resultScriptRunWithTag).to.equal('OK'); return [4 /*yield*/, aiclient.tensorget('tensorC')]; case 7: tensorC = _a.sent(); chai_1.expect(tensorC.data[0]).to.closeTo(5.0, 0.1); chai_1.expect(tensorC.data[1]).to.closeTo(8.0, 0.1); return [4 /*yield*/, aiclient.tensorget('tensorD')]; case 8: tensorD = _a.sent(); chai_1.expect(tensorD.data[0]).to.closeTo(5.0, 0.1); chai_1.expect(tensorD.data[1]).to.closeTo(8.0, 0.1); return [4 /*yield*/, aiclient.info('myscript')]; case 9: scriptInfo = _a.sent(); chai_1.expect(scriptInfo.key).to.equal('myscript'); chai_1.expect(scriptInfo.calls).to.equal(1); return [4 /*yield*/, aiclient.info('myscript-wtag')]; case 10: scriptInfoTag = _a.sent(); chai_1.expect(scriptInfoTag.key).to.equal('myscript-wtag'); chai_1.expect(scriptInfoTag.tag).to.equal('test_tag'); chai_1.expect(scriptInfoTag.calls).to.equal(1); return [4 /*yield*/, aiclient.infoResetStat('myscript-wtag')]; case 11: resultScriptResetStat = _a.sent(); chai_1.expect(resultScriptResetStat).to.equal('OK'); return [4 /*yield*/, aiclient.info('myscript-wtag')]; case 12: scriptInfoTag = _a.sent(); chai_1.expect(scriptInfoTag.calls).to.equal(0); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.scriptdel positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, scriptStr, script, resultScriptSet, resultScriptDel; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); scriptStr = 'def bar(a, b):\n return a + b\n'; script = new script_1.Script('CPU', scriptStr); return [4 /*yield*/, aiclient.scriptset('myscript', script)]; case 1: resultScriptSet = _a.sent(); chai_1.expect(resultScriptSet).to.equal('OK'); return [4 /*yield*/, aiclient.scriptdel('myscript')]; case 2: resultScriptDel = _a.sent(); chai_1.expect(resultScriptDel).to.equal('OK'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.scriptget positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, scriptStr, script, resultScriptSet, scriptOut, scriptInfo; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); scriptStr = 'def bar(a, b):\n return a + b\n'; script = new script_1.Script('CPU', scriptStr); return [4 /*yield*/, aiclient.scriptset('myscript', script)]; case 1: resultScriptSet = _a.sent(); chai_1.expect(resultScriptSet).to.equal('OK'); return [4 /*yield*/, aiclient.scriptget('myscript')]; case 2: scriptOut = _a.sent(); chai_1.expect(scriptOut.script).to.equal(scriptStr); return [4 /*yield*/, aiclient.info('myscript')]; case 3: scriptInfo = _a.sent(); chai_1.expect(scriptInfo.key).to.equal('myscript'); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.scriptget negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var mockedReply, result, e_11, mockedReply, result, e_12, mockedReply, result, e_13; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); mockedReply = []; return [4 /*yield*/, script_1.Script.NewScriptFromScriptGetReply(mockedReply)]; case 1: result = _a.sent(); return [3 /*break*/, 3]; case 2: e_11 = _a.sent(); chai_1.expect(e_11.toString()).to.equal('Error: AI.SCRIPTGET reply did not had the full elements to build the Script. Missing device,source.'); return [3 /*break*/, 3]; case 3: _a.trys.push([3, 5, , 6]); mockedReply = ['device', 'CPU']; return [4 /*yield*/, script_1.Script.NewScriptFromScriptGetReply(mockedReply)]; case 4: result = _a.sent(); return [3 /*break*/, 6]; case 5: e_12 = _a.sent(); chai_1.expect(e_12.toString()).to.equal('Error: AI.SCRIPTGET reply did not had the full elements to build the Script. Missing source.'); return [3 /*break*/, 6]; case 6: _a.trys.push([6, 8, , 9]); mockedReply = ['source', '']; return [4 /*yield*/, script_1.Script.NewScriptFromScriptGetReply(mockedReply)]; case 7: result = _a.sent(); return [3 /*break*/, 9]; case 8: e_13 = _a.sent(); chai_1.expect(e_13.toString()).to.equal('Error: AI.SCRIPTGET reply did not had the full elements to build the Script. Missing device.'); return [3 /*break*/, 9]; case 9: return [2 /*return*/]; } }); }); })); it('ai.info negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, result, e_14; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, aiclient.info('dontexist')]; case 2: result = _a.sent(); return [3 /*break*/, 4]; case 3: e_14 = _a.sent(); chai_1.expect(e_14.toString()).to.equal('ReplyError: ERR cannot find run info for key'); return [3 /*break*/, 4]; case 4: aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.info negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var mockedReply, result, e_15, mockedReply, result, e_16, mockedReply, result, e_17, mockedReply, result, e_18, mockedReply, result, e_19, positiveMockedReply, stats; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); mockedReply = []; return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)]; case 1: result = _a.sent(); return [3 /*break*/, 3]; case 2: e_15 = _a.sent(); chai_1.expect(e_15.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing key,type,backend,device.'); return [3 /*break*/, 3]; case 3: _a.trys.push([3, 5, , 6]); mockedReply = ['key', 'a', 'type', 'model', 'backend', 'TF']; return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)]; case 4: result = _a.sent(); return [3 /*break*/, 6]; case 5: e_16 = _a.sent(); chai_1.expect(e_16.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing device.'); return [3 /*break*/, 6]; case 6: _a.trys.push([6, 8, , 9]); mockedReply = ['key', 'a', 'type', 'model', 'device', 'CPU']; return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)]; case 7: result = _a.sent(); return [3 /*break*/, 9]; case 8: e_17 = _a.sent(); chai_1.expect(e_17.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing backend.'); return [3 /*break*/, 9]; case 9: _a.trys.push([9, 11, , 12]); mockedReply = ['key', 'a', 'backend', 'TF', 'device', 'CPU']; return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)]; case 10: result = _a.sent(); return [3 /*break*/, 12]; case 11: e_18 = _a.sent(); chai_1.expect(e_18.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing type.'); return [3 /*break*/, 12]; case 12: _a.trys.push([12, 14, , 15]); mockedReply = ['type', 'script', 'backend', 'TF', 'device', 'CPU']; return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)]; case 13: result = _a.sent(); return [3 /*break*/, 15]; case 14: e_19 = _a.sent(); chai_1.expect(e_19.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing key.'); return [3 /*break*/, 15]; case 15: positiveMockedReply = ['key', 'key1', 'type', 'script', 'backend', 'TF', 'device', 'CPU']; return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(positiveMockedReply)]; case 16: stats = _a.sent(); chai_1.expect(stats.key).to.equal('key1'); chai_1.expect(stats.type).to.equal('script'); chai_1.expect(stats.backend).to.equal(backend_1.Backend.TF); chai_1.expect(stats.device).to.equal('CPU'); chai_1.expect(stats.tag).to.equal(undefined); chai_1.expect(stats.calls).to.equal(0); return [2 /*return*/]; } }); }); })); it('ai.scriptget negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, result, e_20; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, aiclient.scriptget('dontexist')]; case 2: result = _a.sent(); return [3 /*break*/, 4]; case 3: e_20 = _a.sent(); chai_1.expect(e_20.toString()).to.equal('ReplyError: ERR script key is empty'); return [3 /*break*/, 4]; case 4: aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.modelget negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, result, e_21; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, aiclient.modelget('dontexist')]; case 2: result = _a.sent(); return [3 /*break*/, 4]; case 3: e_21 = _a.sent(); chai_1.expect(e_21.toString()).to.equal('ReplyError: ERR model key is empty'); return [3 /*break*/, 4]; case 4: aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.dagrun simple tensorset modelrun tensorget positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, model, resultModelSet, dag, tensorA, tensorB, resultDagRun, tensorC; return __generator(this, function (_a) { switch (_a.label) { case 0: nativeClient = redis_1.createClient(); aiclient = new client_1.Client(nativeClient); modelBlob = fs.readFileSync('./tests/test_data/graph.pb'); model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob); model.tag = 'test_tag'; return [4 /*yield*/, aiclient.modelset('mymodel-dag', model)]; case 1: resultModelSet = _a.sent(); chai_1.expect(resultModelSet).to.equal('OK'); dag = new src_1.Dag(); tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]); dag.tensorset('tensorA', tensorA); tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]); dag.tensorset('tensorB', tensorB); dag.modelrun('mymodel-dag', ['tensorA', 'tensorB'], ['tensorC']); dag.tensorget('tensorC'); return [4 /*yield*/, aiclient.dagrun(null, null, dag)]; case 2: resultDagRun = _a.sent(); chai_1.expect(resultDagRun.length).to.equal(4); chai_1.expect(resultDagRun[0]).to.equal('OK'); chai_1.expect(resultDagRun[1]).to.equal('OK'); chai_1.expect(resultDagRun[2]).to.equal('OK'); tensorC = resultDagRun[3]; chai_1.expect(tensorC.data[0]).to.closeTo(6.0, 0.1); chai_1.expect(tensorC.data[1]).to.closeTo(15.0, 0.1); aiclient.end(true); return [2 /*return*/]; } }); }); })); it('ai.dagrun chaining positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () { var nativeClient, aiclient, modelBlob, model, resultModelSet, dag, te