OPENCLIENT RPC, händelser och delade anslutningar
OPENCLIENT(url, [id]) är den inbyggda klienten för Open Platform-protokollet. Den omvandlar http/https-URL:er till ws/wss. Logiska klienter med samma URL delar en WebSocket. .online(fn) tar emot serverns metadata {type:'init',id:...}; .message(fn) tar emot oombedda meddelanden. .rpc(message) returnerar ett löfte; .send(message, callback, [filter], [timeoutMs]) använder en callback; .cmd(message) skickar utan att vänta. .remove() stänger den fysiska socketen först när dess sista logiska klient har tagits bort.
Exempelet inkluderar en lokal protokollserver. callbackid, error och response är protokollfält. En callback timout är opt-in; ställa in en för begäranden som kräver en tidsfrist. Håll verkliga plattformkrediter och URL i serverkonfigurationen.
exports.install = function() {
ROUTE('SOCKET /fixture/', fixture);
ROUTE('GET /openclient/', exercise);
};
function fixture() {
var server = this;
server.on('open', function(client) {
client.send({ type: 'init', id: 'local-fixture', version: 1 });
});
server.on('message', function(client, message) {
if (message.type === 'ignore')
return;
if (message.type === 'event') {
client.send({ type: 'notice', value: message.value });
return;
}
client.send({ callbackid: message.callbackid, error: message.type === 'fail' ? 'denied' : null, response: { value: message.value } });
});
}
async function exercise($) {
var a;
var b;
try {
var url = $.hostname('/fixture/');
a = OPENCLIENT(url, 'first');
await new Promise(function(resolve, reject) {
var timer = setTimeout(() => reject(new Error('init deadline')), 2000);
a.online(function(meta) { if (meta) { clearTimeout(timer); resolve(); } });
});
b = OPENCLIENT(url, 'second');
var shared = a.ws === b.ws;
var sum = await a.rpc({ type: 'echo', value: 7 });
var event = new Promise(resolve => a.message(resolve));
a.cmd({ type: 'event', value: 9 });
var notice = await event;
var denied = await new Promise(resolve => a.send({ type: 'fail' }, err => resolve(String(err)), 300));
var timeout = await new Promise(resolve => a.send({ type: 'ignore' }, err => resolve(String(err)), 50));
a.remove();
a = null;
var alive = await b.rpc({ type: 'echo', value: 11 });
var meta = b.meta;
b.remove();
b = null;
$.json({ shared: shared, sum: sum, notice: notice, denied: denied, timeout: timeout, alive: alive, meta: meta });
} catch (e) { $.invalid(e); }
finally { if (a) a.remove(); if (b) b.remove(); }
}