diff --git a/filenames.gypi b/filenames.gypi index a3a4b6c808f36..d5381e15b3032 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -44,6 +44,7 @@ 'lib/common/api/deprecate.js', 'lib/common/api/deprecations.js', 'lib/common/api/is-promise.js', + 'lib/common/api/is-typed-array.js', 'lib/common/api/exports/electron.js', 'lib/common/api/native-image.js', 'lib/common/api/shell.js', diff --git a/lib/browser/rpc-server.js b/lib/browser/rpc-server.js index 083c5e4d03e0f..6e9d80ed21ae6 100644 --- a/lib/browser/rpc-server.js +++ b/lib/browser/rpc-server.js @@ -2,7 +2,7 @@ const electron = require('electron') const v8Util = process.atomBinding('v8_util') -const {ipcMain, isPromise, webContents} = electron +const {ipcMain, isPromise, isTypedArray, webContents} = electron const objectsRegistry = require('./objects-registry') @@ -63,6 +63,8 @@ let valueToMeta = function (sender, value, optimizeSimpleObject = false) { meta.type = 'buffer' } else if (Array.isArray(value)) { meta.type = 'array' + } else if (isTypedArray(value)) { + meta.type = 'typed-array' } else if (value instanceof Error) { meta.type = 'error' } else if (value instanceof Date) { @@ -149,6 +151,8 @@ const unwrapArgs = function (sender, args) { return unwrapArgs(sender, meta.value) case 'buffer': return new Buffer(meta.value) + case 'typed-array': + return Buffer.from(meta.value) case 'date': return new Date(meta.value) case 'promise': diff --git a/lib/common/api/exports/electron.js b/lib/common/api/exports/electron.js index efa44d452cc6c..4539649c7fae0 100644 --- a/lib/common/api/exports/electron.js +++ b/lib/common/api/exports/electron.js @@ -48,6 +48,11 @@ exports.defineProperties = function (exports) { get: function () { return require('../is-promise') } + }, + isTypedArray: { + get: function () { + return require('../is-typed-array') + } } }) } diff --git a/lib/common/api/is-typed-array.js b/lib/common/api/is-typed-array.js new file mode 100644 index 0000000000000..8b63a0cb1b743 --- /dev/null +++ b/lib/common/api/is-typed-array.js @@ -0,0 +1,17 @@ +'use strict' + +module.exports = function isTypedArray (val) { + return ( + val && + (val instanceof Int8Array || + val instanceof Int16Array || + val instanceof Int32Array || + val instanceof Uint8Array || + val instanceof Uint8ClampedArray || + val instanceof Uint16Array || + val instanceof Uint32Array || + val instanceof Float32Array || + val instanceof Float64Array) || + (Object.prototype.toString.call(val).substr(-6, 5) === 'Array') + ) +} diff --git a/lib/renderer/api/remote.js b/lib/renderer/api/remote.js index 40f067f3401b1..ae6564fe0f278 100644 --- a/lib/renderer/api/remote.js +++ b/lib/renderer/api/remote.js @@ -1,7 +1,7 @@ 'use strict' const v8Util = process.atomBinding('v8_util') -const {ipcRenderer, isPromise, CallbacksRegistry} = require('electron') +const {ipcRenderer, isPromise, isTypedArray, CallbacksRegistry} = require('electron') const callbacksRegistry = new CallbacksRegistry() @@ -35,6 +35,11 @@ const wrapArgs = function (args, visited) { type: 'buffer', value: Array.prototype.slice.call(value, 0) } + } else if (isTypedArray(value)) { + return { + type: 'typed-array', + value: Array.prototype.slice.call(value) + } } else if (value instanceof Date) { return { type: 'date', @@ -164,6 +169,8 @@ const metaToValue = function (meta) { return results case 'buffer': return new Buffer(meta.value) + case 'typed-array': + return Buffer.from(meta.value) case 'promise': return Promise.resolve({ then: metaToValue(meta.then)