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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue