UNPKG

3.48 kBJavaScriptView Raw
1"use strict";
2// Copyright (c) Jupyter Development Team.
3// Distributed under the terms of the Modified BSD License.
4Object.defineProperty(exports, "__esModule", { value: true });
5exports.serialize = exports.deserialize = void 0;
6/**
7 * Deserialize and return the unpacked message.
8 *
9 * #### Notes
10 * Handles JSON blob strings and binary messages.
11 */
12function deserialize(data) {
13 let value;
14 if (typeof data === 'string') {
15 value = JSON.parse(data);
16 }
17 else {
18 value = deserializeBinary(data);
19 }
20 return value;
21}
22exports.deserialize = deserialize;
23/**
24 * Serialize a kernel message for transport.
25 *
26 * #### Notes
27 * If there is binary content, an `ArrayBuffer` is returned,
28 * otherwise the message is converted to a JSON string.
29 */
30function serialize(msg) {
31 var _a;
32 let value;
33 if ((_a = msg.buffers) === null || _a === void 0 ? void 0 : _a.length) {
34 value = serializeBinary(msg);
35 }
36 else {
37 value = JSON.stringify(msg);
38 }
39 return value;
40}
41exports.serialize = serialize;
42/**
43 * Deserialize a binary message to a Kernel Message.
44 */
45function deserializeBinary(buf) {
46 const data = new DataView(buf);
47 // read the header: 1 + nbufs 32b integers
48 const nbufs = data.getUint32(0);
49 const offsets = [];
50 if (nbufs < 2) {
51 throw new Error('Invalid incoming Kernel Message');
52 }
53 for (let i = 1; i <= nbufs; i++) {
54 offsets.push(data.getUint32(i * 4));
55 }
56 const jsonBytes = new Uint8Array(buf.slice(offsets[0], offsets[1]));
57 const msg = JSON.parse(new TextDecoder('utf8').decode(jsonBytes));
58 // the remaining chunks are stored as DataViews in msg.buffers
59 msg.buffers = [];
60 for (let i = 1; i < nbufs; i++) {
61 const start = offsets[i];
62 const stop = offsets[i + 1] || buf.byteLength;
63 msg.buffers.push(new DataView(buf.slice(start, stop)));
64 }
65 return msg;
66}
67/**
68 * Implement the binary serialization protocol.
69 *
70 * Serialize Kernel message to ArrayBuffer.
71 */
72function serializeBinary(msg) {
73 const offsets = [];
74 const buffers = [];
75 const encoder = new TextEncoder();
76 let origBuffers = [];
77 if (msg.buffers !== undefined) {
78 origBuffers = msg.buffers;
79 delete msg['buffers'];
80 }
81 const jsonUtf8 = encoder.encode(JSON.stringify(msg));
82 buffers.push(jsonUtf8.buffer);
83 for (let i = 0; i < origBuffers.length; i++) {
84 // msg.buffers elements could be either views or ArrayBuffers
85 // buffers elements are ArrayBuffers
86 const b = origBuffers[i];
87 buffers.push(ArrayBuffer.isView(b) ? b.buffer : b);
88 }
89 const nbufs = buffers.length;
90 offsets.push(4 * (nbufs + 1));
91 for (let i = 0; i + 1 < buffers.length; i++) {
92 offsets.push(offsets[offsets.length - 1] + buffers[i].byteLength);
93 }
94 const msgBuf = new Uint8Array(offsets[offsets.length - 1] + buffers[buffers.length - 1].byteLength);
95 // use DataView.setUint32 for network byte-order
96 const view = new DataView(msgBuf.buffer);
97 // write nbufs to first 4 bytes
98 view.setUint32(0, nbufs);
99 // write offsets to next 4 * nbufs bytes
100 for (let i = 0; i < offsets.length; i++) {
101 view.setUint32(4 * (i + 1), offsets[i]);
102 }
103 // write all the buffers at their respective offsets
104 for (let i = 0; i < buffers.length; i++) {
105 msgBuf.set(new Uint8Array(buffers[i]), offsets[i]);
106 }
107 return msgBuf.buffer;
108}
109//# sourceMappingURL=serialize.js.map
\No newline at end of file