worker-rpc
Version:
A simple RPC layer for communicating with web workers and over other transports
155 lines (154 loc) • 8.11 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var assert_1 = __importDefault(require("assert"));
var RpcProvider_1 = __importDefault(require("../src/RpcProvider"));
suite('RPC provider', function () {
var local, remote, transferLocalToRemote, transferRemoteToLocal, errorLocal, errorRemote;
setup(function () {
local = new RpcProvider_1.default(function (message, transfer) { return (transferLocalToRemote = transfer, remote.dispatch(message)); }, 50);
local.error.addHandler(function (err) { return errorLocal = err; });
remote = new RpcProvider_1.default(function (message, transfer) { return (transferRemoteToLocal = transfer, local.dispatch(message)); }, 50);
remote.error.addHandler(function (err) { return errorRemote = err; });
transferLocalToRemote = transferRemoteToLocal = undefined;
errorRemote = errorLocal = undefined;
});
suite('signals', function () {
test('Signals are propagated', function () {
var x = -1;
remote.registerSignalHandler('action', function (value) { return x = value; });
local.signal('action', 5);
assert_1.default(!errorLocal);
assert_1.default(!errorRemote);
assert_1.default.strictEqual(x, 5);
});
test('Unregistered signals raise an error', function () {
local.signal('action', 10);
assert_1.default(errorLocal);
assert_1.default(errorRemote);
});
test('Multiple signals do not interfere', function () {
var x = -1, y = -1;
remote.registerSignalHandler('setx', function (value) { return x = value; });
remote.registerSignalHandler('sety', function (value) { return y = value; });
local.signal('setx', 5);
local.signal('sety', 6);
assert_1.default(!errorLocal);
assert_1.default(!errorRemote);
assert_1.default.strictEqual(x, 5);
assert_1.default.strictEqual(y, 6);
});
test('Multiple handlers can be bound to one signal', function () {
var x = -1;
remote.registerSignalHandler('action', function (value) { return x = value; });
local.signal('action', 1);
local.signal('action', 2);
assert_1.default(!errorLocal);
assert_1.default(!errorRemote);
assert_1.default.strictEqual(x, 2);
});
test('Handlers can be deregistered', function () {
var x = -1;
var handler = function (value) { return x = value; };
remote.registerSignalHandler('action', handler);
remote.deregisterSignalHandler('action', handler);
local.signal('action', 5);
assert_1.default(!errorLocal);
assert_1.default(!errorRemote);
assert_1.default.strictEqual(x, -1);
});
test('Transfer is honored', function () {
var x = -1;
var transfer = [1, 2, 3];
remote.registerSignalHandler('action', function (value) { return x = value; });
local.signal('action', 2, transfer);
assert_1.default(!errorLocal);
assert_1.default(!errorRemote);
assert_1.default.strictEqual(x, 2);
assert_1.default.strictEqual(transferLocalToRemote, transfer);
assert_1.default(!transferRemoteToLocal);
});
});
suite('RPC', function () {
test('RPC handlers can return values', function () {
remote.registerRpcHandler('action', function () { return 10; });
return local
.rpc('action')
.then(function (result) { return (assert_1.default.strictEqual(result, 10),
assert_1.default(!errorLocal),
assert_1.default(!errorRemote)); });
});
test('RPC handlers can return promises', function () {
remote.registerRpcHandler('action', function () { return new Promise(function (r) { return setTimeout(function () { return r(10); }, 15); }); });
return local
.rpc('action')
.then(function (result) { return (assert_1.default.strictEqual(result, 10),
assert_1.default(!errorLocal),
assert_1.default(!errorRemote)); });
});
test('Promise rejection is transferred', function () {
remote.registerRpcHandler('action', function () { return new Promise(function (resolve, reject) { return setTimeout(function () { return reject(10); }, 15); }); });
return local
.rpc('action')
.then(function () { return Promise.reject('should have been rejected'); }, function (result) { return (assert_1.default.strictEqual(result, 10),
assert_1.default(!errorLocal),
assert_1.default(!errorRemote)); });
});
test('Invalid RPC calls are rejected', function () {
return local
.rpc('action')
.then(function () { return Promise.reject('should have been rejected'); }, function () { return undefined; });
});
test('Invalid RPC calls throw on both ends', function () {
return local
.rpc('action')
.then(function () { return Promise.reject('should have been rejected'); }, function () { return undefined; })
.then(function () { return (assert_1.default(errorLocal),
assert_1.default(errorRemote)); });
});
test('RPC calls time out', function () {
remote.registerRpcHandler('action', function () { return new Promise(function (r) { return setTimeout(function () { return r(10); }, 100); }); });
return local
.rpc('action')
.then(function () { return Promise.reject('should have been rejected'); }, function () { return (assert_1.default(errorLocal), new Promise(function (r) { return setTimeout(r, 100); })); })
.then(function () { return assert_1.default(errorRemote); });
});
test('Multiple RPC handlers do not interfere', function () {
remote.registerRpcHandler('a1', function (value) { return new Promise(function (r) { return setTimeout(function () { return r(value); }, 30); }); });
remote.registerRpcHandler('a2', function (value) { return 2 * value; });
return Promise
.all([
local.rpc('a1', 10),
local.rpc('a2', 20)
])
.then(function (_a) {
var r1 = _a[0], r2 = _a[1];
return (assert_1.default.strictEqual(r1, 10),
assert_1.default.strictEqual(r2, 40),
assert_1.default(!errorLocal),
assert_1.default(!errorRemote));
});
});
test('RPC handler can be deregistered', function () {
var handler = function () { return 10; };
remote.registerRpcHandler('action', handler);
remote.deregisterRpcHandler('action', handler);
return local
.rpc('action')
.then(function () { return Promise.reject('should have been rejected'); }, function () { return (assert_1.default(errorLocal),
assert_1.default(errorRemote)); });
});
test('Transfer is honored', function () {
var transfer = [1, 2, 3];
remote.registerRpcHandler('action', function () { return 10; });
return local
.rpc('action', undefined, transfer)
.then(function (x) { return (assert_1.default.strictEqual(transferLocalToRemote, transfer),
assert_1.default.strictEqual(x, 10),
assert_1.default(!errorLocal),
assert_1.default(!errorRemote)); });
});
});
});