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
}

View file

@ -196,8 +196,6 @@ if (nodeIntegration) {
}
}
const errorUtils = require('@electron/internal/common/error-utils')
// Load the preload scripts.
for (const preloadScript of preloadScripts) {
try {
@ -206,7 +204,7 @@ for (const preloadScript of preloadScripts) {
console.error(`Unable to load preload script: ${preloadScript}`)
console.error(error)
ipcRendererInternal.send('ELECTRON_BROWSER_PRELOAD_ERROR', preloadScript, errorUtils.serialize(error))
ipcRendererInternal.send('ELECTRON_BROWSER_PRELOAD_ERROR', preloadScript, error)
}
}

View file

@ -1,5 +1,4 @@
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal'
import * as errorUtils from '@electron/internal/common/error-utils'
type IPCHandler = (event: Electron.IpcRendererEvent, ...args: any[]) => any
@ -9,7 +8,7 @@ export const handle = function <T extends IPCHandler> (channel: string, handler:
try {
event.sender.send(replyChannel, null, await handler(event, ...args))
} catch (error) {
event.sender.send(replyChannel, errorUtils.serialize(error))
event.sender.send(replyChannel, error)
}
})
}
@ -18,7 +17,7 @@ export function invokeSync<T> (command: string, ...args: any[]): T {
const [ error, result ] = ipcRendererInternal.sendSync(command, ...args)
if (error) {
throw errorUtils.deserialize(error)
throw error
} else {
return result
}