UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

120 lines 14.6 kB
import '@iotize/tap/service/impl/interface'; import { Buffer } from 'buffer'; import { Observable } from 'rxjs'; export const DEFAULT_TAP_REQUEST_MAX_SIZE_OPTIONS = { maxRequestByteSize: 180, maxResponseByteSize: 200, }; export function computeTapRequestCallSize(chunk) { let bodyLength = computeBodyLength(chunk); return (2 + // Request length 7 + // GET /A/B/C bodyLength); } export function createSingleChunkMultiTapRequestCalls(calls, index = 0, { maxResponseByteSize, maxRequestByteSize, } = DEFAULT_TAP_REQUEST_MAX_SIZE_OPTIONS) { let totalResponseByteSize = 0; let totalRequestByteSize = 0; const chunck = []; if (index >= calls.length) { return { calls: [], nextIndex: undefined, }; } for (; index < calls.length; index++) { const { call, responseBodySize } = calls[index]; const tapRequestByteSize = computeTapRequestCallSize(call); totalResponseByteSize += responseBodySize + 2; totalRequestByteSize += tapRequestByteSize; if (chunck.length > 0 && (totalResponseByteSize > maxResponseByteSize || totalRequestByteSize > maxRequestByteSize)) { return { calls: chunck, nextIndex: index, }; } else { chunck.push(call); } } return { nextIndex: undefined, calls: chunck, }; } export function chunkMultiTapRequestCalls(calls, options = DEFAULT_TAP_REQUEST_MAX_SIZE_OPTIONS) { function encodeChunks() { let chuncks = []; let nextIndex = 0; while (nextIndex !== undefined) { const nextChunk = createSingleChunkMultiTapRequestCalls(calls, nextIndex, options); nextIndex = nextChunk.nextIndex; chuncks.push(nextChunk.calls); } return chuncks; } return encodeChunks(); } export function createMultiTapRequestCallChuncksExecutor(tap, chunks) { return new Observable((emitter) => { let stop = false; (async () => { try { for (let index = 0; index < chunks.length; index++) { if (stop) { return; } const chunck = chunks[index]; let responses; if (chunck.length === 1) { responses = [await tap.lwm2m.execute(chunck[0])]; } else { responses = await tap.service.interface.executeMultipleCalls(chunck); } emitter.next({ index, responses, }); } emitter.complete(); } catch (err) { emitter.error(err); } })(); return () => { stop = true; }; }); } function computeBodyLength(chunk) { if (chunk.body !== undefined) { if (chunk.body instanceof Uint8Array || chunk.body instanceof Buffer) { return chunk.body.length; } else { if (chunk.bodyEncoder) { try { const encoded = typeof chunk.bodyEncoder === 'function' ? chunk.bodyEncoder(chunk.body) : chunk.bodyEncoder.encode(chunk.body); return encoded.length; } catch (err) { console.warn(`Filed to encode body to compute body length`, chunk, err); return 0; } } else { console.warn(`Found body but no body encoder provider to this Tap request`, chunk); return 0; } } } else { return 0; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktcmVxdWVzdHMtdXRpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL211bHRpLXJlcXVlc3RzL211bHRpLXJlcXVlc3RzLXV0aWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxvQ0FBb0MsQ0FBQztBQVE1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUc7SUFDbEQsa0JBQWtCLEVBQUUsR0FBRztJQUN2QixtQkFBbUIsRUFBRSxHQUFHO0NBQ3pCLENBQUM7QUFPRixNQUFNLFVBQVUseUJBQXlCLENBQUMsS0FBc0I7SUFDOUQsSUFBSSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsT0FBTyxDQUNMLENBQUMsR0FBRyxpQkFBaUI7UUFDckIsQ0FBQyxHQUFHLGFBQWE7UUFDakIsVUFBVSxDQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLHFDQUFxQyxDQUNuRCxLQUEyRCxFQUMzRCxRQUFnQixDQUFDLEVBQ2pCLEVBQ0UsbUJBQW1CLEVBQ25CLGtCQUFrQixNQUloQixvQ0FBb0M7SUFFeEMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7SUFDOUIsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFFN0IsTUFBTSxNQUFNLEdBQXNCLEVBQUUsQ0FBQztJQUNyQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ3pCLE9BQU87WUFDTCxLQUFLLEVBQUUsRUFBRTtZQUNULFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7S0FDSDtJQUNELE9BQU8sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFF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QUFJLEtBQUssU0FBUyxFQUFFO1FBQzVCLElBQUksS0FBSyxDQUFDLElBQUksWUFBWSxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksWUFBWSxNQUFNLEVBQUU7WUFDcEUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMxQjthQUFNO1lBQ0wsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO2dCQUNyQixJQUFJO29CQUNGLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxDQUFDLFdBQVcsS0FBSyxVQUFVO3dCQUNyQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUMvQixDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7aUJBQ3ZCO2dCQUFDLE9BQU8sR0FBRyxFQUFFO29CQUNaLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkNBQTZDLEVBQzdDLEtBQUssRUFDTCxHQUFHLENBQ0osQ0FBQztvQkFDRixPQUFPLENBQUMsQ0FBQztpQkFDVjthQUNGO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkRBQTZELEVBQzdELEtBQUssQ0FDTixDQUFDO2dCQUNGLE9BQU8sQ0FBQyxDQUFDO2FBQ1Y7U0FDRjtLQUNGO1NBQU07UUFDTCxPQUFPLENBQUMsQ0FBQztLQUNWO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnQGlvdGl6ZS90YXAvc2VydmljZS9pbXBsL2ludGVyZmFjZSc7XG5cbmltcG9ydCB7XG4gIHNlcnZpY2VDYWxsVG9TdHJpbmcsXG4gIFNlcnZpY2VDYWxsVHlwZSxcbiAgVGFwLFxuICBUYXBSZXNwb25zZSxcbn0gZnJvbSAnQGlvdGl6ZS90YXAnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEFQX1JFUVVFU1RfTUFYX1NJWkVfT1BUSU9OUyA9IHtcbiAgbWF4UmVxdWVzdEJ5dGVTaXplOiAxODAsXG4gIG1heFJlc3BvbnNlQnl0ZVNpemU6IDIwMCxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRml4ZWRSZXNwb25zZUJvZHlTaXplU2VydmljZUNhbGw8Qm9keVR5cGUsIFJldHVyblR5cGU+IHtcbiAgY2FsbDogU2VydmljZUNhbGxUeXBlPEJvZHlUeXBlLCBSZXR1cm5UeXBlPjtcbiAgcmVzcG9uc2VCb2R5U2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVRhcFJlcXVlc3RDYWxsU2l6ZShjaHVuazogU2VydmljZUNhbGxUeXBlKSB7XG4gIGxldCBib2R5TGVuZ3RoID0gY29tcHV0ZUJvZHlMZW5ndGgoY2h1bmspO1xuICByZXR1cm4gKFxuICAgIDIgKyAvLyBSZXF1ZXN0IGxlbmd0aFxuICAgIDcgKyAvLyBHRVQgL0EvQi9DXG4gICAgYm9keUxlbmd0aFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2luZ2xlQ2h1bmtNdWx0aVRhcFJlcXVlc3RDYWxscyhcbiAgY2FsbHM6IEZpeGVkUmVzcG9uc2VCb2R5U2l6ZVNlcnZpY2VDYWxsPHVua25vd24sIHVua25vd24+W10sXG4gIGluZGV4OiBudW1iZXIgPSAwLFxuICB7XG4gICAgbWF4UmVzcG9uc2VCeXRlU2l6ZSxcbiAgICBtYXhSZXF1ZXN0Qnl0ZVNpemUsXG4gIH06IHtcbiAgICBtYXhSZXNwb25zZUJ5dGVTaXplOiBudW1iZXI7XG4gICAgbWF4UmVxdWVzdEJ5dGVTaXplOiBudW1iZXI7XG4gIH0gPSBERUZBVUxUX1RBUF9SRVFVRVNUX01BWF9TSVpFX09QVElPTlNcbikge1xuICBsZXQgdG90YWxSZXNwb25zZUJ5dGVTaXplID0gMDtcbiAgbGV0IHRvdGFsUmVxdWVzdEJ5dGVTaXplID0gMDtcblxuICBjb25zdCBjaHVuY2s6IFNlcnZpY2VDYWxsVHlwZVtdID0gW107XG4gIGlmIChpbmRleCA+PSBjYWxscy5sZW5ndGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2FsbHM6IFtdLFxuICAgICAgbmV4dEluZGV4OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuICBmb3IgKDsgaW5kZXggPCBjYWxscy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCB7IGNhbGwsIHJlc3BvbnNlQm9keVNpemUgfSA9IGNhbGxzW2luZGV4XTtcbiAgICBjb25zdCB0YXBSZXF1ZXN0Qnl0ZVNpemUgPSBjb21wdXRlVGFwUmVxdWVzdENhbGxTaXplKGNhbGwpO1xuICAgIHRvdGFsUmVzcG9uc2VCeXRlU2l6ZSArPSByZXNwb25zZUJvZHlTaXplICsgMjtcbiAgICB0b3RhbFJlcXVlc3RCeXRlU2l6ZSArPSB0YXBSZXF1ZXN0Qnl0ZVNpemU7XG4gICAgaWYgKFxuICAgICAgY2h1bmNrLmxlbmd0aCA+IDAgJiZcbiAgICAgICh0b3RhbFJlc3BvbnNlQnl0ZVNpemUgPiBtYXhSZXNwb25zZUJ5dGVTaXplIHx8XG4gICAgICAgIHRvdGFsUmVxdWVzdEJ5dGVTaXplID4gbWF4UmVxdWVzdEJ5dGVTaXplKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FsbHM6IGNodW5jayxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNodW5jay5wdXNoKGNhbGwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIG5leHRJbmRleDogdW5kZWZpbmVkLFxuICAgIGNhbGxzOiBjaHVuY2ssXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaHVua011bHRpVGFwUmVxdWVzdENhbGxzKFxuICBjYWxsczogRml4ZWRSZXNwb25zZUJvZHlTaXplU2VydmljZUNhbGw8dW5rbm93biwgdW5rbm93bj5bXSxcbiAgb3B0aW9uczoge1xuICAgIG1heFJlcXVlc3RCeXRlU2l6ZTogbnVtYmVyO1xuICAgIG1heFJlc3BvbnNlQnl0ZVNpemU6IG51bWJlcjtcbiAgfSA9IERFRkFVTFRfVEFQX1JFUVVFU1RfTUFYX1NJWkVfT1BUSU9OU1xuKTogU2VydmljZUNhbGxUeXBlW11bXSB7XG4gIGZ1bmN0aW9uIGVuY29kZUNodW5rcygpOiBTZXJ2aWNlQ2FsbFR5cGVbXVtdIHtcbiAgICBsZXQgY2h1bmNrczogU2VydmljZUNhbGxUeXBlW11bXSA9IFtdO1xuICAgIGxldCBuZXh0SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG4gICAgd2hpbGUgKG5leHRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuZXh0Q2h1bmsgPSBjcmVhdGVTaW5nbGVDaHVua011bHRpVGFwUmVxdWVzdENhbGxzKFxuICAgICAgICBjYWxscyxcbiAgICAgICAgbmV4dEluZGV4LFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgbmV4dEluZGV4ID0gbmV4dENodW5rLm5leHRJbmRleDtcbiAgICAgIGNodW5ja3MucHVzaChuZXh0Q2h1bmsuY2FsbHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2h1bmNrcztcbiAgfVxuXG4gIHJldHVybiBlbmNvZGVDaHVua3MoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU11bHRpVGFwUmVxdWVzdENhbGxDaHVuY2tzRXhlY3V0b3IoXG4gIHRhcDogVGFwLFxuICBjaHVua3M6IFNlcnZpY2VDYWxsVHlwZVtdW11cbikge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGU8eyBpbmRleDogbnVtYmVyOyByZXNwb25zZXM6IFRhcFJlc3BvbnNlPHVua25vd24+W10gfT4oXG4gICAgKGVtaXR0ZXIpID0+IHtcbiAgICAgIGxldCBzdG9wID0gZmFsc2U7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaHVua3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpZiAoc3RvcCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjaHVuY2sgPSBjaHVua3NbaW5kZXhdO1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlczogVGFwUmVzcG9uc2U8dW5rbm93bj5bXTtcbiAgICAgICAgICAgIGlmIChjaHVuY2subGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlcyA9IFthd2FpdCB0YXAubHdtMm0uZXhlY3V0ZShjaHVuY2tbMF0pXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlcyA9IGF3YWl0IHRhcC5zZXJ2aWNlLmludGVyZmFjZS5leGVjdXRlTXVsdGlwbGVDYWxscyhcbiAgICAgICAgICAgICAgICBjaHVuY2tcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtaXR0ZXIubmV4dCh7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICByZXNwb25zZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdHRlci5jb21wbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlbWl0dGVyLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgIH07XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlQm9keUxlbmd0aChjaHVuazogU2VydmljZUNhbGxUeXBlPGFueSwgYW55Pik6IG51bWJlciB7XG4gIGlmIChjaHVuay5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoY2h1bmsuYm9keSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgY2h1bmsuYm9keSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGNodW5rLmJvZHkubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2h1bmsuYm9keUVuY29kZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbmNvZGVkID1cbiAgICAgICAgICAgIHR5cGVvZiBjaHVuay5ib2R5RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICA/IGNodW5rLmJvZHlFbmNvZGVyKGNodW5rLmJvZHkpXG4gICAgICAgICAgICAgIDogY2h1bmsuYm9keUVuY29kZXIuZW5jb2RlKGNodW5rLmJvZHkpO1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkLmxlbmd0aDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYEZpbGVkIHRvIGVuY29kZSBib2R5IHRvIGNvbXB1dGUgYm9keSBsZW5ndGhgLFxuICAgICAgICAgICAgY2h1bmssXG4gICAgICAgICAgICBlcnJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEZvdW5kIGJvZHkgYnV0IG5vIGJvZHkgZW5jb2RlciBwcm92aWRlciB0byB0aGlzIFRhcCByZXF1ZXN0YCxcbiAgICAgICAgICBjaHVua1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cbiJdfQ==