refactor: take advantage of structured clone algorithm in the remote module (#20427)
This commit is contained in:
parent
c2e77e4429
commit
b92163d226
13 changed files with 87 additions and 210 deletions
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue