elasticio / amqp-rpc Goto Github PK
View Code? Open in Web Editor NEWRPC over RabbitMQ for Node.js
RPC over RabbitMQ for Node.js
e.g. following sample:
server.addCommand('print-hello-world', (name) => {
console.log('Hello, ${name}!');
return Promise.resolve({foo: 'bar'});
});
RabbitMQ has a pseudo-queue that can be used as the reply queue called amq.rabbitmq.reply-to
. Using this queue is faster than declaring a transient queue on every client and easier to manage than creating a long-lived queue.
I have been experimenting with this library and reading all the documentation of rabbitmq.
This library seems to follow the example of "Tutorial 6":
https://www.rabbitmq.com/getstarted.html
which is good but I discover this bit: https://www.rabbitmq.com/direct-reply-to.html
Where does the client's queue come from? The client can declare a single-use queue for each request-response pair. But this is inefficient; even a transient unmirrored queue can be expensive to create and then delete (compared with the cost of sending a message). This is especially true in a cluster as all cluster nodes need to agree that the queue has been created, even if it is unmirrored.
So alternatively the client can create a long-lived queue for its replies. But this can be fiddly to manage, especially if the client itself is not long-lived.
The direct reply-to feature allows RPC clients to receive replies directly from their RPC server, without going through a reply queue. ("Directly" here still means going through the same connection and a RabbitMQ node; there is no direct network connection between RPC client and RPC server processes.)
I've been trying this and it works well with few small changes.
I am wondering if you are willing to accept a PR changing the default behavior, instead of declaring a queue when no repliesQueue
is provided, using amq.rabbitmq.reply-to
directly.
The only reason I can think for not doing this is keeping the library agnostic to rabbitmq, in that case I might contribute an example instead.
The AMQPRPCClient will reject the rpc request when timeout without removing the request.
The promise have reject,so the timeout request(in the this._requests) is useless .If not remove it,will cause stack overflow?
I cloned this repo and after npm install
see following errors:
npm WARN prepublish-on-install As of npm@5, `prepublish` scripts are deprecated.
npm WARN prepublish-on-install Use `prepare` for build steps and `prepublishOnly` for upload-only.
npm WARN prepublish-on-install See the deprecation note in `npm help scripts` for more information.
> @elastic.io/[email protected] prepublish /Users/zubairov/Repositories/amqp-rpc
> npm run lint && npm run test
> @elastic.io/[email protected] lint /Users/zubairov/Repositories/amqp-rpc
> eslint --ignore-path .gitignore .
> @elastic.io/[email protected] test /Users/zubairov/Repositories/amqp-rpc
> istanbul cover _mocha
Failed to parse file: /Users/zubairov/Repositories/amqp-rpc/src/AMQPRPCClient.js
Transformation error; return original code
{ Error: Line 39: Unexpected identifier
at constructError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2407:21)
at createError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2426:17)
at unexpectedTokenError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2500:13)
at throwUnexpectedToken (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2505:15)
at parseClassBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5147:21)
at parseClassDeclaration (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5169:21)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3981:24)
at parseFunctionSourceElements (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4869:23)
at parseFunctionExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5074:16)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3273:24)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseGroupExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3162:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3239:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at isolateCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2663:18)
at parseExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3942:16)
at parseExpressionStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4222:20)
at parseStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4760:24)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3989:16)
at parseScriptBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5490:25)
at parseProgram (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5506:16)
at Object.parse (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5690:23)
at Instrumenter.instrumentSync (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/instrumenter.js:459:31)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:54:31
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:105:23)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/src/index.js:9:59)
at Module._compile (module.js:624:30)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:107:24)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/test/integration/amqpevents.test.js:9:5)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:231:27
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:228:14)
at Mocha.run (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:514:10)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/bin/_mocha:480:18)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Function.Module.runMain (module.js:665:10)
at runFn (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:122:16)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:251:17
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/util/file-matcher.js:68:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:361:13
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at done (/Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:246:17)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:44:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:358:17
at LOOP (fs.js:1754:14)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
lineNumber: 39,
description: 'Unexpected identifier',
index: 1131 }
Failed to parse file: /Users/zubairov/Repositories/amqp-rpc/src/AMQPRPCServer.js
Transformation error; return original code
{ Error: Line 38: Unexpected identifier
at constructError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2407:21)
at createError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2426:17)
at unexpectedTokenError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2500:13)
at throwUnexpectedToken (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2505:15)
at parseClassBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5147:21)
at parseClassDeclaration (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5169:21)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3981:24)
at parseFunctionSourceElements (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4869:23)
at parseFunctionExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5074:16)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3273:24)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseGroupExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3162:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3239:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at isolateCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2663:18)
at parseExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3942:16)
at parseExpressionStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4222:20)
at parseStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4760:24)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3989:16)
at parseScriptBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5490:25)
at parseProgram (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5506:16)
at Object.parse (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5690:23)
at Instrumenter.instrumentSync (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/instrumenter.js:459:31)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:54:31
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:105:23)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/src/index.js:9:144)
at Module._compile (module.js:624:30)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:107:24)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/test/integration/amqpevents.test.js:9:5)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:231:27
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:228:14)
at Mocha.run (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:514:10)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/bin/_mocha:480:18)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Function.Module.runMain (module.js:665:10)
at runFn (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:122:16)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:251:17
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/util/file-matcher.js:68:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:361:13
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at done (/Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:246:17)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:44:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:358:17
at LOOP (fs.js:1754:14)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
lineNumber: 38,
description: 'Unexpected identifier',
index: 1144 }
Failed to parse file: /Users/zubairov/Repositories/amqp-rpc/src/AMQPEventsSender.js
Transformation error; return original code
{ Error: Line 35: Unexpected identifier
at constructError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2407:21)
at createError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2426:17)
at unexpectedTokenError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2500:13)
at throwUnexpectedToken (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2505:15)
at parseClassBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5147:21)
at parseClassDeclaration (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5169:21)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3981:24)
at parseFunctionSourceElements (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4869:23)
at parseFunctionExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5074:16)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3273:24)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseGroupExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3162:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3239:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at isolateCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2663:18)
at parseExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3942:16)
at parseExpressionStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4222:20)
at parseStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4760:24)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3989:16)
at parseScriptBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5490:25)
at parseProgram (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5506:16)
at Object.parse (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5690:23)
at Instrumenter.instrumentSync (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/instrumenter.js:459:31)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:54:31
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:105:23)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/src/index.js:9:390)
at Module._compile (module.js:624:30)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:107:24)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/test/integration/amqpevents.test.js:9:5)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:231:27
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:228:14)
at Mocha.run (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:514:10)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/bin/_mocha:480:18)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Function.Module.runMain (module.js:665:10)
at runFn (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:122:16)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:251:17
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/util/file-matcher.js:68:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:361:13
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at done (/Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:246:17)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:44:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:358:17
at LOOP (fs.js:1754:14)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
lineNumber: 35,
description: 'Unexpected identifier',
index: 1078 }
Failed to parse file: /Users/zubairov/Repositories/amqp-rpc/src/AMQPEventsReceiver.js
Transformation error; return original code
{ Error: Line 35: Unexpected identifier
at constructError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2407:21)
at createError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2426:17)
at unexpectedTokenError (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2500:13)
at throwUnexpectedToken (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2505:15)
at parseClassBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5147:21)
at parseClassDeclaration (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5169:21)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3981:24)
at parseFunctionSourceElements (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4869:23)
at parseFunctionExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5074:16)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3273:24)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseGroupExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3162:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePrimaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3239:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseLeftHandSideExpressionAllowCall (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3414:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parsePostfixExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3490:16)
at parseUnaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3550:20)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseBinaryExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3639:16)
at inheritCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2681:18)
at parseConditionalExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3696:16)
at parseAssignmentExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3893:16)
at isolateCoverGrammar (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:2663:18)
at parseExpression (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3942:16)
at parseExpressionStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4222:20)
at parseStatement (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:4760:24)
at parseStatementListItem (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:3989:16)
at parseScriptBody (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5490:25)
at parseProgram (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5506:16)
at Object.parse (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/node_modules/esprima/esprima.js:5690:23)
at Instrumenter.instrumentSync (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/instrumenter.js:459:31)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:54:31
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:105:23)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/src/index.js:9:483)
at Module._compile (module.js:624:30)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:107:24)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/test/integration/amqpevents.test.js:9:5)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:231:27
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:228:14)
at Mocha.run (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/lib/mocha.js:514:10)
at Object.<anonymous> (/Users/zubairov/Repositories/amqp-rpc/node_modules/mocha/bin/_mocha:480:18)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Object.Module._extensions.(anonymous function) [as .js] (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/hook.js:109:37)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Function.Module.runMain (module.js:665:10)
at runFn (/Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:122:16)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/command/common/run-with-cover.js:251:17
at /Users/zubairov/Repositories/amqp-rpc/node_modules/istanbul/lib/util/file-matcher.js:68:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:361:13
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:52:16
at done (/Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:246:17)
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:44:16
at /Users/zubairov/Repositories/amqp-rpc/node_modules/async/lib/async.js:358:17
at LOOP (fs.js:1754:14)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
lineNumber: 35,
description: 'Unexpected identifier',
index: 1059 }
50 -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_,------,
4 -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_| /\_/\
0 -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-^|__( x .x)
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- "" ""
50 passing (153ms)
4 failing
1) AMQPEventsSender AMQPEventsReceiver "before each" hook for "should send events throught amqp":
Error: connect ECONNREFUSED 127.0.0.1:5672
at Object._errnoException (util.js:1026:11)
at _exceptionWithHostPort (util.js:1049:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1174:14)
2) AMQPRPCClient Should handle timeouts:
Error: connect ECONNREFUSED 127.0.0.1:5672
at Object._errnoException (util.js:1026:11)
at _exceptionWithHostPort (util.js:1049:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1174:14)
3) AMQPRPCClient to AMQPRPCServer "before each" hook for "Should bypass arguments from proxy call to agent":
Error: connect ECONNREFUSED 127.0.0.1:5672
at Object._errnoException (util.js:1026:11)
at _exceptionWithHostPort (util.js:1049:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1174:14)
4) AMQPRPCClient to AMQPRPCServer "after each" hook for "Should bypass arguments from proxy call to agent":
TypeError: Cannot read property 'disconnect' of undefined
at Context.afterEach (test/unit/AMQPRPCServer.test.js:25:16)
=============================================================================
Writing coverage object [/Users/zubairov/Repositories/amqp-rpc/coverage/coverage.json]
Writing coverage reports at [/Users/zubairov/Repositories/amqp-rpc/coverage]
=============================================================================
=============================== Coverage summary ===============================
Statements : 100% ( 41/41 )
Branches : 100% ( 6/6 )
Functions : 100% ( 10/10 )
Lines : 100% ( 41/41 )
================================================================================
npm ERR! code ELIFECYCLE
npm ERR! errno 4
npm ERR! @elastic.io/[email protected] test: `istanbul cover _mocha`
npm ERR! Exit status 4
npm ERR!
npm ERR! Failed at the @elastic.io/[email protected] test script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/zubairov/.npm/_logs/2018-01-05T09_42_10_456Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 4
npm ERR! @elastic.io/[email protected] prepublish: `npm run lint && npm run test`
npm ERR! Exit status 4
npm ERR!
npm ERR! Failed at the @elastic.io/[email protected] prepublish script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/zubairov/.npm/_logs/2018-01-05T09_42_10_518Z-debug.log
Hello!
I'm attempting to run the RPC server and client in separate processes. I've been completely unable to do so. Is there any chance I'm missing something and you have an example of this? Here's what I've done:
I tried to pass in _requestsQueue to both the client and server so that the names wouldn't be randomly generated. That then failed as my queue didn't exist since assertQueue will only run when _requestsQueue is empty. I've temporarily worked around that, but now I'm encountering a new error.
I can launch the server successfully due to my patch from the first step, now I can have the client remotely connect and issue a single rpc request successfully. The second time I call sendCommand without tearing everything down it fails:
Error: Unknown command print-hello-world
I'm not sure how far down this rabbit hole I should go in case I'm missing something. Do you have any thoughts on how I can separate the client / server? Ideally, I'd like to have multiple consumers as well.
Thanks!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.