Skip to content

Commit dd8a349

Browse files
authored
fix(_bsontype): only check bsontype if it is a prototype member.
1 parent 3142508 commit dd8a349

16 files changed

+233
-65
lines changed

lib/bson/binary.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ function Binary(buffer, subType) {
4040
throw new Error('only String, Buffer, Uint8Array or Array accepted');
4141
}
4242

43-
this._bsontype = 'Binary';
44-
4543
if (buffer instanceof Number) {
4644
this.sub_type = buffer;
4745
this.position = 0;
@@ -81,6 +79,11 @@ function Binary(buffer, subType) {
8179
}
8280
}
8381

82+
Object.defineProperty(Binary.prototype, '_bsontype', {
83+
value: 'Binary',
84+
writable: false
85+
});
86+
8487
/**
8588
* Updates this binary with byte_value.
8689
*

lib/bson/code.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88
*/
99
var Code = function Code(code, scope) {
1010
if (!(this instanceof Code)) return new Code(code, scope);
11-
this._bsontype = 'Code';
1211
this.code = code;
1312
this.scope = scope;
1413
};
1514

15+
Object.defineProperty(Code.prototype, '_bsontype', {
16+
value: 'Code',
17+
writable: false
18+
});
19+
1620
/**
1721
* @ignore
1822
*/

lib/bson/db_ref.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@
1010
function DBRef(namespace, oid, db) {
1111
if (!(this instanceof DBRef)) return new DBRef(namespace, oid, db);
1212

13-
this._bsontype = 'DBRef';
1413
this.namespace = namespace;
1514
this.oid = oid;
1615
this.db = db;
1716
}
1817

18+
Object.defineProperty(DBRef.prototype, '_bsontype', {
19+
value: 'DBRef',
20+
writable: false
21+
});
22+
1923
/**
2024
* @ignore
2125
* @api private

lib/bson/decimal128.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,14 @@ var lessThan = function(left, right) {
181181
* @return {Double}
182182
*/
183183
var Decimal128 = function(bytes) {
184-
this._bsontype = 'Decimal128';
185184
this.bytes = bytes;
186185
};
187186

187+
Object.defineProperty(Decimal128.prototype, '_bsontype', {
188+
value: 'Decimal128',
189+
writable: false
190+
});
191+
188192
/**
189193
* Create a Decimal128 instance from a string representation
190194
*

lib/bson/double.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
function Double(value) {
99
if (!(this instanceof Double)) return new Double(value);
1010

11-
this._bsontype = 'Double';
1211
this.value = value;
1312
}
1413

14+
Object.defineProperty(Double.prototype, '_bsontype', {
15+
value: 'Double',
16+
writable: false
17+
});
18+
1519
/**
1620
* Access the number value.
1721
*

lib/bson/int_32.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
var Int32 = function(value) {
99
if (!(this instanceof Int32)) return new Int32(value);
1010

11-
this._bsontype = 'Int32';
1211
this.value = value;
1312
};
1413

14+
Object.defineProperty(Int32.prototype, '_bsontype', {
15+
value: 'Int32',
16+
writable: false
17+
});
18+
1519
/**
1620
* Access the number value.
1721
*

lib/bson/long.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
function Long(low, high) {
4444
if (!(this instanceof Long)) return new Long(low, high);
4545

46-
this._bsontype = 'Long';
4746
/**
4847
* @type {number}
4948
* @ignore
@@ -57,6 +56,11 @@ function Long(low, high) {
5756
this.high_ = high | 0; // force into 32 signed bits.
5857
}
5958

59+
Object.defineProperty(Long.prototype, '_bsontype', {
60+
value: 'Long',
61+
writable: false
62+
});
63+
6064
/**
6165
* Return the int value.
6266
*

lib/bson/max_key.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
*/
77
function MaxKey() {
88
if (!(this instanceof MaxKey)) return new MaxKey();
9-
10-
this._bsontype = 'MaxKey';
119
}
1210

11+
Object.defineProperty(MaxKey.prototype, '_bsontype', {
12+
value: 'MaxKey',
13+
writable: false
14+
});
15+
1316
module.exports = MaxKey;
1417
module.exports.MaxKey = MaxKey;

lib/bson/min_key.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
*/
77
function MinKey() {
88
if (!(this instanceof MinKey)) return new MinKey();
9-
10-
this._bsontype = 'MinKey';
119
}
1210

11+
Object.defineProperty(MinKey.prototype, '_bsontype', {
12+
value: 'MinKey',
13+
writable: false
14+
});
15+
1316
module.exports = MinKey;
1417
module.exports.MinKey = MinKey;

lib/bson/objectid.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ var ObjectID = function ObjectID(id) {
3939
if (id instanceof ObjectID) return id;
4040
if (!(this instanceof ObjectID)) return new ObjectID(id);
4141

42-
this._bsontype = 'ObjectID';
43-
4442
// The most common usecase (blank id, new objectId instance)
4543
if (id == null || typeof id === 'number') {
4644
// Generate a new id
@@ -78,6 +76,11 @@ var ObjectID = function ObjectID(id) {
7876
if (ObjectID.cacheHexString) this.__id = this.toString('hex');
7977
};
8078

79+
Object.defineProperty(ObjectID.prototype, '_bsontype', {
80+
value: 'ObjectID',
81+
writable: false
82+
});
83+
8184
// Allow usage of ObjectId as well as ObjectID
8285
// var ObjectId = ObjectID;
8386

lib/bson/parser/calculate_size.js

+15-12
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi
6161
if (value && value.toBSON) {
6262
value = value.toBSON();
6363
}
64+
var _bsontype, _objPrototype;
6465

6566
switch (typeof value) {
6667
case 'string':
@@ -84,15 +85,17 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi
8485
case 'boolean':
8586
return (name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + (1 + 1);
8687
case 'object':
88+
var _objPrototype = value && Object.getPrototypeOf(value)
89+
var _bsontype = _objPrototype && _objPrototype._bsontype || undefined;
8790
if (
8891
value == null ||
8992
value instanceof MinKey ||
9093
value instanceof MaxKey ||
91-
value['_bsontype'] === 'MinKey' ||
92-
value['_bsontype'] === 'MaxKey'
94+
_bsontype === 'MinKey' ||
95+
_bsontype === 'MaxKey'
9396
) {
9497
return (name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + 1;
95-
} else if (value instanceof ObjectID || value['_bsontype'] === 'ObjectID' || value['_bsontype'] === 'ObjectId') {
98+
} else if (value instanceof ObjectID || _bsontype === 'ObjectID' || _bsontype === 'ObjectId') {
9699
return (name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + (12 + 1);
97100
} else if (value instanceof Date || isDate(value)) {
98101
return (name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + (8 + 1);
@@ -104,14 +107,14 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi
104107
value instanceof Long ||
105108
value instanceof Double ||
106109
value instanceof Timestamp ||
107-
value['_bsontype'] === 'Long' ||
108-
value['_bsontype'] === 'Double' ||
109-
value['_bsontype'] === 'Timestamp'
110+
_bsontype === 'Long' ||
111+
_bsontype === 'Double' ||
112+
_bsontype === 'Timestamp'
110113
) {
111114
return (name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + (8 + 1);
112-
} else if (value instanceof Decimal128 || value['_bsontype'] === 'Decimal128') {
115+
} else if (value instanceof Decimal128 || _bsontype === 'Decimal128') {
113116
return (name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + (16 + 1);
114-
} else if (value instanceof Code || value['_bsontype'] === 'Code') {
117+
} else if (value instanceof Code || _bsontype === 'Code') {
115118
// Calculate size depending on the availability of a scope
116119
if (value.scope != null && Object.keys(value.scope).length > 0) {
117120
return (
@@ -132,7 +135,7 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi
132135
1
133136
);
134137
}
135-
} else if (value instanceof Binary || value['_bsontype'] === 'Binary') {
138+
} else if (value instanceof Binary || _bsontype === 'Binary') {
136139
// Check what kind of subtype we have
137140
if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) {
138141
return (
@@ -144,15 +147,15 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi
144147
(name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + (value.position + 1 + 4 + 1)
145148
);
146149
}
147-
} else if (value instanceof Symbol || value['_bsontype'] === 'Symbol') {
150+
} else if (value instanceof Symbol || _bsontype === 'Symbol') {
148151
return (
149152
(name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) +
150153
Buffer.byteLength(value.value, 'utf8') +
151154
4 +
152155
1 +
153156
1
154157
);
155-
} else if (value instanceof DBRef || value['_bsontype'] === 'DBRef') {
158+
} else if (value instanceof DBRef || _bsontype === 'DBRef') {
156159
// Set up correct object for serialization
157160
var ordered_values = {
158161
$ref: value.namespace,
@@ -183,7 +186,7 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi
183186
(value.multiline ? 1 : 0) +
184187
1
185188
);
186-
} else if (value instanceof BSONRegExp || value['_bsontype'] === 'BSONRegExp') {
189+
} else if (value instanceof BSONRegExp || _bsontype === 'BSONRegExp') {
187190
return (
188191
(name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) +
189192
1 +

0 commit comments

Comments
 (0)