|
@@ -2,12 +2,10 @@
|
|
|
|
|
|
import * as electron from 'electron'
|
|
|
import { EventEmitter } from 'events'
|
|
|
-import { isBuffer, bufferToMeta, BufferMeta, metaToBuffer } from '@electron/internal/common/remote/buffer-utils'
|
|
|
import objectsRegistry from './objects-registry'
|
|
|
import { ipcMainInternal } from '../ipc-main-internal'
|
|
|
import * as guestViewManager from '@electron/internal/browser/guest-view-manager'
|
|
|
-import * as errorUtils from '@electron/internal/common/error-utils'
|
|
|
-import { isPromise } from '@electron/internal/common/remote/is-promise'
|
|
|
+import { isPromise, isSerializableObject } from '@electron/internal/common/remote/type-utils'
|
|
|
|
|
|
const v8Util = process.electronBinding('v8_util')
|
|
|
const eventBinding = process.electronBinding('event')
|
|
@@ -105,16 +103,14 @@ type MetaType = {
|
|
|
value: any,
|
|
|
} | {
|
|
|
type: 'buffer',
|
|
|
- value: BufferMeta,
|
|
|
+ value: Uint8Array,
|
|
|
} | {
|
|
|
type: 'array',
|
|
|
members: MetaType[]
|
|
|
} | {
|
|
|
type: 'error',
|
|
|
+ value: Error,
|
|
|
members: ObjectMember[]
|
|
|
-} | {
|
|
|
- type: 'date',
|
|
|
- value: number
|
|
|
} | {
|
|
|
type: 'promise',
|
|
|
then: MetaType
|
|
@@ -126,16 +122,14 @@ const valueToMeta = function (sender: electron.WebContents, contextId: string, v
|
|
|
let type: MetaType['type'] = typeof value
|
|
|
if (type === 'object') {
|
|
|
// Recognize certain types of objects.
|
|
|
- if (value === null) {
|
|
|
- type = 'value'
|
|
|
- } else if (isBuffer(value)) {
|
|
|
+ if (value instanceof Buffer) {
|
|
|
type = 'buffer'
|
|
|
} else if (Array.isArray(value)) {
|
|
|
type = 'array'
|
|
|
} else if (value instanceof Error) {
|
|
|
type = 'error'
|
|
|
- } else if (value instanceof Date) {
|
|
|
- type = 'date'
|
|
|
+ } else if (isSerializableObject(value)) {
|
|
|
+ type = 'value'
|
|
|
} else if (isPromise(value)) {
|
|
|
type = 'promise'
|
|
|
} else if (hasProp.call(value, 'callee') && value.length != null) {
|
|
@@ -165,7 +159,7 @@ const valueToMeta = function (sender: electron.WebContents, contextId: string, v
|
|
|
proto: getObjectPrototype(value)
|
|
|
}
|
|
|
} else if (type === 'buffer') {
|
|
|
- return { type, value: bufferToMeta(value) }
|
|
|
+ return { type, value }
|
|
|
} else if (type === 'promise') {
|
|
|
// Add default handler to prevent unhandled rejections in main process
|
|
|
// Instead they should appear in the renderer process
|
|
@@ -178,16 +172,14 @@ const valueToMeta = function (sender: electron.WebContents, contextId: string, v
|
|
|
})
|
|
|
}
|
|
|
} else if (type === 'error') {
|
|
|
- const members = plainObjectToMeta(value)
|
|
|
-
|
|
|
- // Error.name is not part of own properties.
|
|
|
- members.push({
|
|
|
- name: 'name',
|
|
|
- value: value.name
|
|
|
- })
|
|
|
- return { type, members }
|
|
|
- } else if (type === 'date') {
|
|
|
- return { type, value: value.getTime() }
|
|
|
+ return {
|
|
|
+ type,
|
|
|
+ value,
|
|
|
+ members: Object.keys(value).map(name => ({
|
|
|
+ name,
|
|
|
+ value: valueToMeta(sender, contextId, value[name])
|
|
|
+ }))
|
|
|
+ }
|
|
|
} else {
|
|
|
return {
|
|
|
type: 'value',
|
|
@@ -196,24 +188,6 @@ const valueToMeta = function (sender: electron.WebContents, contextId: string, v
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// Convert object to meta by value.
|
|
|
-const plainObjectToMeta = function (obj: any): ObjectMember[] {
|
|
|
- return Object.getOwnPropertyNames(obj).map(function (name) {
|
|
|
- return {
|
|
|
- name: name,
|
|
|
- value: obj[name]
|
|
|
- }
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-// Convert Error into meta data.
|
|
|
-const exceptionToMeta = function (error: Error) {
|
|
|
- return {
|
|
|
- type: 'exception',
|
|
|
- value: errorUtils.serialize(error)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
const throwRPCError = function (message: string) {
|
|
|
const error = new Error(message) as Error & {code: string, errno: number}
|
|
|
error.code = 'EBADRPC'
|
|
@@ -253,10 +227,7 @@ type MetaTypeFromRenderer = {
|
|
|
value: MetaTypeFromRenderer[]
|
|
|
} | {
|
|
|
type: 'buffer',
|
|
|
- value: BufferMeta
|
|
|
-} | {
|
|
|
- type: 'date',
|
|
|
- value: number
|
|
|
+ value: Uint8Array
|
|
|
} | {
|
|
|
type: 'promise',
|
|
|
then: MetaTypeFromRenderer
|
|
@@ -285,9 +256,7 @@ const unwrapArgs = function (sender: electron.WebContents, frameId: number, cont
|
|
|
case 'array':
|
|
|
return unwrapArgs(sender, frameId, contextId, meta.value)
|
|
|
case 'buffer':
|
|
|
- return metaToBuffer(meta.value)
|
|
|
- case 'date':
|
|
|
- return new Date(meta.value)
|
|
|
+ return Buffer.from(meta.value.buffer, meta.value.byteOffset, meta.value.byteLength)
|
|
|
case 'promise':
|
|
|
return Promise.resolve({
|
|
|
then: metaToValue(meta.then)
|
|
@@ -365,7 +334,10 @@ const handleRemoteCommand = function (channel: string, handler: (event: Electron
|
|
|
try {
|
|
|
returnValue = handler(event, contextId, ...args)
|
|
|
} catch (error) {
|
|
|
- returnValue = exceptionToMeta(error)
|
|
|
+ returnValue = {
|
|
|
+ type: 'exception',
|
|
|
+ value: valueToMeta(event.sender, contextId, error)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (returnValue !== undefined) {
|