OPENCLIENT RPC, evenementen en gedeelde verbindingen
OPENCLIENT(url, [id]) is de native client van het Open Platform-protocol. Hij zet http/https-URL's om naar ws/wss. Logische clients met dezelfde URL delen een WebSocket. .online(fn) ontvangt de metadata {type:'init',id:...} van de server; .message(fn) ontvangt ongevraagde berichten. .rpc(message) geeft een promise terug; .send(message, callback, [filter], [timeoutMs]) gebruikt een callback; .cmd(message) verstuurt zonder te wachten. .remove() sluit de fysieke socket pas nadat zijn laatste logische client is verwijderd.
Het voorbeeld omvat een lokale protocolserver. callbackid, error en response zijn protocole velden. Een callback timeout is opt-in; instel één voor verzoeken die een deadline nodig hebben. Houd echte platformkredits en URL's in de serverconfiguratie.
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(); }
}