UNPKG

wechaty-grpc

Version:
111 lines 4.13 kB
#!/usr/bin/env -S node --no-warnings --loader ts-node/esm "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const tstest_1 = require("tstest"); const util_1 = __importDefault(require("util")); const mod_js_1 = require("../src/mod.js"); const puppet_server_impl_js_1 = require("../tests/puppet-server-impl.js"); (0, tstest_1.test)('integration testing', async (t) => { const ENDPOINT = 'localhost:18788'; const DING_DATA_LIST = ['data1', 'data2']; const EVENT_DATA_LIST = []; /** * Create Server */ const testServer = getTestServer(); const server = new mod_js_1.grpc.Server(); server.addService(mod_js_1.puppet.PuppetService, testServer); await util_1.default.promisify(server.bindAsync.bind(server))(ENDPOINT, mod_js_1.grpc.ServerCredentials.createInsecure()); server.start(); /** * Create Client */ const client = new mod_js_1.puppet.PuppetClient(ENDPOINT, mod_js_1.grpc.credentials.createInsecure()); /** * gRPC: Stream */ const eventStream = client.event(new mod_js_1.puppet.EventRequest()); const future = new Promise((resolve, reject) => { eventStream .on('data', (chunk) => { const payload = chunk.getPayload(); EVENT_DATA_LIST.push(payload); console.info('on(data)', payload); if (EVENT_DATA_LIST.length === DING_DATA_LIST.length) { resolve(); } }) .on('error', reject); }); /** * gRPC: Ding */ for (const data of DING_DATA_LIST) { const request = new mod_js_1.puppet.DingRequest(); request.setData(data); console.info('ding() for ', data); await util_1.default.promisify(client.ding.bind(client))(request); } /** * Check Result */ await future; t.same(EVENT_DATA_LIST, DING_DATA_LIST, 'should get ding data back through event stream'); /** * Close Client & Server */ /** * Issue #130: Assertion `(current_nghttp2_memory_) >= (previous_size)' failed. * https://github.com/wechaty/grpc/issues/130 */ await new Promise(resolve => setImmediate(resolve)); eventStream.cancel(); await new Promise(resolve => server.tryShutdown(resolve)); // server.forceShutdown() }); function getTestServer() { let eventStream; const dataQueue = []; /** * Implements the SayHello RPC method. */ const puppetTestServer = { ...puppet_server_impl_js_1.puppetServerImpl, ding: (call, callback) => { const data = call.request.getData(); if (!eventStream) { dataQueue.push(data); } else { const eventResponse = new mod_js_1.puppet.EventResponse(); eventResponse.setType(mod_js_1.puppet.EventType.EVENT_TYPE_DONG); eventResponse.setPayload(data); eventStream.write(eventResponse); } callback(null, new mod_js_1.puppet.DingResponse()); }, event: (streamingCall) => { if (eventStream) { throw new Error('eventStream can not be created again'); } eventStream = streamingCall; while (dataQueue.length > 0) { const data = dataQueue.shift(); const eventResponse = new mod_js_1.puppet.EventResponse(); eventResponse.setType(mod_js_1.puppet.EventType.EVENT_TYPE_DONG); eventResponse.setPayload(data); eventStream.write(eventResponse); } /** * Detect if Inexor Core is gone (GRPC disconnects) * https://github.com/grpc/grpc/issues/8117#issuecomment-362198092 */ eventStream.on('cancelled', () => console.info('eventStream.on(calcelled)')); }, }; return puppetTestServer; } //# sourceMappingURL=integration.spec.js.map