refactor: take advantage of structured clone algorithm in the remote module (#20427)

This commit is contained in:
Milan Burda 2019-10-10 15:59:08 +02:00 committed by John Kleinschmidt
parent c2e77e4429
commit b92163d226
13 changed files with 87 additions and 210 deletions

View file

@ -4,9 +4,7 @@ const v8Util = process.electronBinding('v8_util')
const { hasSwitch } = process.electronBinding('command_line')
const { CallbacksRegistry } = require('@electron/internal/renderer/remote/callbacks-registry')
const bufferUtils = require('@electron/internal/common/remote/buffer-utils')
const errorUtils = require('@electron/internal/common/error-utils')
const { isPromise } = require('@electron/internal/common/remote/is-promise')
const { isPromise, isSerializableObject } = require('@electron/internal/common/remote/type-utils')
const { ipcRendererInternal } = require('@electron/internal/renderer/ipc-renderer-internal')
const callbacksRegistry = new CallbacksRegistry()
@ -43,17 +41,17 @@ function wrapArgs (args, visited = new Set()) {
}
visited.delete(value)
return meta
} else if (bufferUtils.isBuffer(value)) {
} else if (value instanceof Buffer) {
return {
type: 'buffer',
value: bufferUtils.bufferToMeta(value)
value
}
} else if (value instanceof Date) {
} else if (isSerializableObject(value)) {
return {
type: 'date',
value: value.getTime()
type: 'value',
value
}
} else if ((value != null) && typeof value === 'object') {
} else if (typeof value === 'object') {
if (isPromise(value)) {
return {
type: 'promise',
@ -97,7 +95,7 @@ function wrapArgs (args, visited = new Set()) {
} else {
return {
type: 'value',
value: value
value
}
}
}
@ -215,11 +213,10 @@ function metaToValue (meta) {
const types = {
value: () => meta.value,
array: () => meta.members.map((member) => metaToValue(member)),
buffer: () => bufferUtils.metaToBuffer(meta.value),
buffer: () => Buffer.from(meta.value.buffer, meta.value.byteOffset, meta.value.byteLength),
promise: () => Promise.resolve({ then: metaToValue(meta.then) }),
error: () => metaToPlainObject(meta),
date: () => new Date(meta.value),
exception: () => { throw errorUtils.deserialize(meta.value) }
error: () => metaToError(meta),
exception: () => { throw metaToError(meta.value) }
}
if (meta.type in types) {
@ -261,12 +258,10 @@ function metaToValue (meta) {
}
}
// Construct a plain object from the meta.
function metaToPlainObject (meta) {
const obj = (() => meta.type === 'error' ? new Error() : {})()
for (let i = 0; i < meta.members.length; i++) {
const { name, value } = meta.members[i]
obj[name] = value
function metaToError (meta) {
const obj = meta.value
for (const { name, value } of meta.members) {
obj[name] = metaToValue(value)
}
return obj
}