%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
'use strict'; const common = require('../common'); const Countdown = require('../common/countdown'); const assert = require('assert'); const { AsyncLocalStorage } = require('async_hooks'); const http = require('http'); const cls = new AsyncLocalStorage(); const NUM_CLIENTS = 10; // Run multiple clients that receive data from a server // in multiple chunks, in a single non-closure function. // Use the AsyncLocalStorage (ALS) APIs to maintain the context // and data download. Make sure that individual clients // receive their respective data, with no conflicts. // Set up a server that sends large buffers of data, filled // with cardinal numbers, increasing per request let index = 0; const server = http.createServer((q, r) => { // Send a large chunk as response, otherwise the data // may be sent in a single chunk, and the callback in the // client may be called only once, defeating the purpose of test r.end((index++ % 10).toString().repeat(1024 * 1024)); }); const countdown = new Countdown(NUM_CLIENTS, () => { server.close(); }); server.listen(0, common.mustCall(() => { for (let i = 0; i < NUM_CLIENTS; i++) { cls.run(new Map(), common.mustCall(() => { const options = { port: server.address().port }; const req = http.get(options, common.mustCall((res) => { const store = cls.getStore(); store.set('data', ''); // Make ondata and onend non-closure // functions and fully dependent on ALS res.setEncoding('utf8'); res.on('data', ondata); res.on('end', common.mustCall(onend)); })); req.end(); })); } })); // Accumulate the current data chunk with the store data function ondata(d) { const store = cls.getStore(); assert.notStrictEqual(store, undefined); let chunk = store.get('data'); chunk += d; store.set('data', chunk); } // Retrieve the store data, and test for homogeneity function onend() { const store = cls.getStore(); assert.notStrictEqual(store, undefined); const data = store.get('data'); assert.strictEqual(data, data[0].repeat(data.length)); countdown.dec(); }