| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 97aafe2 commit 04c04c8
9 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -10,43 +10,14 @@ const { | |||
| 10 | 10 | } = primordials; | |
| 11 | 11 | const { Buffer } = require('buffer'); | |
| 12 | 12 | const { StringDecoder } = require('string_decoder'); | |
| 13 | - const v8 = require('v8'); | ||
| 14 | - const { isArrayBufferView } = require('internal/util/types'); | ||
| 15 | - const assert = require('internal/assert'); | ||
| 13 | + const { serialize, deserialize } = internalBinding('ipc_serdes'); | ||
| 16 | 14 | const { streamBaseState, kLastWriteWasAsync } = internalBinding('stream_wrap'); | |
| 17 | 15 | ||
| 18 | 16 | const kMessageBuffer = Symbol('kMessageBuffer'); | |
| 19 | 17 | const kMessageBufferSize = Symbol('kMessageBufferSize'); | |
| 20 | 18 | const kJSONBuffer = Symbol('kJSONBuffer'); | |
| 21 | 19 | const kStringDecoder = Symbol('kStringDecoder'); | |
| 22 | 20 | ||
| 23 | - // Extend V8's serializer APIs to give more JSON-like behaviour in | ||
| 24 | - // some cases; in particular, for native objects this serializes them the same | ||
| 25 | - // way that JSON does rather than throwing an exception. | ||
| 26 | - const kArrayBufferViewTag = 0; | ||
| 27 | - const kNotArrayBufferViewTag = 1; | ||
| 28 | - class ChildProcessSerializer extends v8.DefaultSerializer { | ||
| 29 | - _writeHostObject(object) { | ||
| 30 | - if (isArrayBufferView(object)) { | ||
| 31 | - this.writeUint32(kArrayBufferViewTag); | ||
| 32 | - return super._writeHostObject(object); | ||
| 33 | - } | ||
| 34 | - this.writeUint32(kNotArrayBufferViewTag); | ||
| 35 | - this.writeValue({ ...object }); | ||
| 36 | - } | ||
| 37 | - } | ||
| 38 | - | ||
| 39 | - class ChildProcessDeserializer extends v8.DefaultDeserializer { | ||
| 40 | - _readHostObject() { | ||
| 41 | - const tag = this.readUint32(); | ||
| 42 | - if (tag === kArrayBufferViewTag) | ||
| 43 | - return super._readHostObject(); | ||
| 44 | - | ||
| 45 | - assert(tag === kNotArrayBufferViewTag); | ||
| 46 | - return this.readValue(); | ||
| 47 | - } | ||
| 48 | - } | ||
| 49 | - | ||
| 50 | 21 | // Messages are parsed in either of the following formats: | |
| 51 | 22 | // - Newline-delimited JSON, or | |
| 52 | 23 | // - V8-serialized buffers, prefixed with their length as a big endian uint32 | |
@@ -90,38 +61,25 @@ const advanced = { | |||
| 90 | 61 | channel[kMessageBufferSize], | |
| 91 | 62 | ); | |
| 92 | 63 | ||
| 93 | - const deserializer = new ChildProcessDeserializer( | ||
| 94 | - TypedArrayPrototypeSubarray(concatenatedBuffer, 4, fullMessageSize), | ||
| 95 | - ); | ||
| 64 | + const serializedMessage = | ||
| 65 | + TypedArrayPrototypeSubarray(concatenatedBuffer, 4, fullMessageSize); | ||
| 96 | 66 | ||
| 97 | 67 | messageBufferHead = TypedArrayPrototypeSubarray(concatenatedBuffer, fullMessageSize); | |
| 98 | 68 | channel[kMessageBufferSize] = messageBufferHead.length; | |
| 99 | 69 | channel[kMessageBuffer] = | |
| 100 | 70 | channel[kMessageBufferSize] !== 0 ? [messageBufferHead] : []; | |
| 101 | 71 | ||
| 102 | - deserializer.readHeader(); | ||
| 103 | - yield deserializer.readValue(); | ||
| 72 | + yield deserialize(serializedMessage); | ||
| 104 | 73 | } | |
| 105 | 74 | ||
| 106 | 75 | channel.buffering = channel[kMessageBufferSize] > 0; | |
| 107 | 76 | }, | |
| 108 | 77 | ||
| 109 | 78 | writeChannelMessage(channel, req, message, handle) { | |
| 110 | - const ser = new ChildProcessSerializer(); | ||
| 111 | - // Add 4 bytes, to later populate with message length | ||
| 112 | - ser.writeRawBytes(Buffer.allocUnsafe(4)); | ||
| 113 | - ser.writeHeader(); | ||
| 114 | - ser.writeValue(message); | ||
| 115 | - | ||
| 116 | - const serializedMessage = ser.releaseBuffer(); | ||
| 117 | - const serializedMessageLength = serializedMessage.length - 4; | ||
| 118 | - | ||
| 119 | - serializedMessage.set([ | ||
| 120 | - serializedMessageLength >> 24 & 0xFF, | ||
| 121 | - serializedMessageLength >> 16 & 0xFF, | ||
| 122 | - serializedMessageLength >> 8 & 0xFF, | ||
| 123 | - serializedMessageLength & 0xFF, | ||
| 124 | - ], 0); | ||
| 79 | + // Pass the stable Buffer constructor so the native codec can classify Node | ||
| 80 | + // Buffers via `value.constructor === Buffer` without reading the tamperable | ||
| 81 | + // Buffer.prototype.constructor. | ||
| 82 | + const serializedMessage = serialize(message, Buffer); | ||
| 125 | 83 | ||
| 126 | 84 | const result = channel.writeBuffer(req, serializedMessage, handle); | |
| 127 | 85 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -135,6 +135,7 @@ | |||
| 135 | 135 | 'src/node_http_parser.cc', | |
| 136 | 136 | 'src/node_http2.cc', | |
| 137 | 137 | 'src/node_i18n.cc', | |
| 138 | + 'src/node_ipc_serdes.cc', | ||
| 138 | 139 | 'src/node_locks.cc', | |
| 139 | 140 | 'src/node_main_instance.cc', | |
| 140 | 141 | 'src/node_messaging.cc', | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -59,6 +59,7 @@ | |||
| 59 | 59 | V(http_parser) \ | |
| 60 | 60 | V(inspector) \ | |
| 61 | 61 | V(internal_only_v8) \ | |
| 62 | + V(ipc_serdes) \ | ||
| 62 | 63 | V(js_stream) \ | |
| 63 | 64 | V(js_udp_wrap) \ | |
| 64 | 65 | V(locks) \ | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -82,6 +82,7 @@ class ExternalReferenceRegistry { | |||
| 82 | 82 | V(heap_utils) \ | |
| 83 | 83 | V(http_parser) \ | |
| 84 | 84 | V(internal_only_v8) \ | |
| 85 | + V(ipc_serdes) \ | ||
| 85 | 86 | V(locks) \ | |
| 86 | 87 | V(messaging) \ | |
| 87 | 88 | V(mksnapshot) \ | |
| Back | FazBrowse Home | New Git URL |
0 commit comments