Skip to content

Commit bcac4af

Browse files
authored
Merge pull request #3127 from davidbrochart/deserialization
Make sure buffer is a DataView
2 parents 767311e + 41f8112 commit bcac4af

File tree

4 files changed

+19
-29
lines changed

4 files changed

+19
-29
lines changed

jupyterlab_widgets/src/manager.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,7 @@ export abstract class LabWidgetManager extends ManagerBase
133133
) {
134134
const data = msg.content.data as any;
135135
const buffer_paths = data.buffer_paths || [];
136-
// Make sure the buffers are DataViews
137-
const buffers = (msg.buffers || []).map(b => {
138-
if (b instanceof DataView) {
139-
return b;
140-
} else {
141-
return new DataView(b instanceof ArrayBuffer ? b : b.buffer);
142-
}
143-
});
136+
const buffers = msg.buffers || [];
144137
put_buffers(data.state, buffer_paths, buffers);
145138
info.resolve({ comm, msg });
146139
}

packages/base-manager/src/manager-base.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,7 @@ export abstract class ManagerBase implements IWidgetManager {
157157
}
158158
const data = (msg.content.data as unknown) as ISerializedState;
159159
const buffer_paths = data.buffer_paths || [];
160-
// Make sure the buffers are DataViews
161-
const buffers = (msg.buffers || []).map(b => {
162-
if (b instanceof DataView) {
163-
return b;
164-
} else {
165-
return new DataView(b instanceof ArrayBuffer ? b : b.buffer);
166-
}
167-
});
160+
const buffers = msg.buffers || [];
168161
put_buffers(data.state, buffer_paths, buffers);
169162
return this.new_model(
170163
{

packages/base/src/utils.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,30 @@ export function reject(message: string, log: boolean) {
100100
export function put_buffers(
101101
state: Dict<BufferJSON>,
102102
buffer_paths: (string | number)[][],
103-
buffers: DataView[]
103+
buffers: (
104+
| DataView
105+
| ArrayBuffer
106+
| ArrayBufferView
107+
| { buffer: ArrayBuffer }
108+
)[]
104109
): void {
105110
for (let i = 0; i < buffer_paths.length; i++) {
106111
const buffer_path = buffer_paths[i];
107-
// say we want to set state[x][y][z] = buffers[i]
112+
// make sure the buffers are DataViews
113+
let buffer = buffers[i];
114+
if (!(buffer instanceof DataView)) {
115+
buffer = new DataView(
116+
buffer instanceof ArrayBuffer ? buffer : buffer.buffer
117+
);
118+
}
119+
// say we want to set state[x][y][z] = buffer
108120
let obj = state as any;
109121
// we first get obj = state[x][y]
110122
for (let j = 0; j < buffer_path.length - 1; j++) {
111123
obj = obj[buffer_path[j]];
112124
}
113-
// and then set: obj[z] = buffers[i]
114-
obj[buffer_path[buffer_path.length - 1]] = buffers[i];
125+
// and then set: obj[z] = buffer
126+
obj[buffer_path[buffer_path.length - 1]] = buffer;
115127
}
116128
}
117129

packages/base/src/widget.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -216,15 +216,7 @@ export class WidgetModel extends Backbone.Model {
216216
.then(() => {
217217
const state = data.state;
218218
const buffer_paths = data.buffer_paths || [];
219-
// Make sure the buffers are DataViews
220-
const buffers = (msg.buffers || []).map(b => {
221-
if (b instanceof DataView) {
222-
return b;
223-
} else {
224-
return new DataView(b instanceof ArrayBuffer ? b : b.buffer);
225-
}
226-
});
227-
219+
const buffers = msg.buffers || [];
228220
utils.put_buffers(state, buffer_paths, buffers);
229221
return (this.constructor as typeof WidgetModel)._deserialize_state(
230222
state,

0 commit comments

Comments
 (0)