subject: { type: String, required: true }, | subject: { type: String, required: true }, | ||||
message: { type: String, required: true }, | message: { type: String, required: true }, | ||||
user: { type: String, required: true }, | user: { type: String, required: true }, | ||||
tag: [{type: String, index: true }], | |||||
tag: [{type: String }], | |||||
//createtime: { type: Date, default: Date.now }, | //createtime: { type: Date, default: Date.now }, | ||||
}); | }); | ||||
MessageSchema.index({tag:'text'}); | |||||
module.exports = mongoose.model('Message', MessageSchema); | module.exports = mongoose.model('Message', MessageSchema); |
db = db.getSiblingDB('omdb') | |||||
print(db.getCollectionNames()) | |||||
db.messages.insert( | |||||
[ | |||||
{ | |||||
"subject": "DOLORE LABORIS AUTE", | |||||
"message": "Ex sunt elit elit in ex ad labore minim. Elit amet irure sit aliquip excepteur sit qui et aute qui mollit cillum.", | |||||
"user": "Jaime Potter", | |||||
"tag": [ | |||||
"sit", | |||||
"in", | |||||
"dolore", | |||||
"ullamco" | |||||
] | |||||
}, | |||||
{ | |||||
"subject": "NON IPSUM MOLLIT", | |||||
"message": "Ut laborum proident magna magna qui non in voluptate reprehenderit labore. Qui consectetur dolor nisi culpa cillum quis.", | |||||
"user": "Goff Durham", | |||||
"tag": [ | |||||
"aliqua", | |||||
"sunt", | |||||
"labore", | |||||
"minim" | |||||
] | |||||
}, | |||||
{ | |||||
"subject": "ESSE IPSUM INCIDIDUNT", | |||||
"message": "Esse enim amet laboris proident do do ut cupidatat laborum ex. Sit esse id laborum aliqua id.", | |||||
"user": "Helena Mercado", | |||||
"tag": [ | |||||
"fugiat", | |||||
"nisi", | |||||
"incididunt", | |||||
"ullamco" | |||||
] | |||||
}, | |||||
{ | |||||
"subject": "PARIATUR DOLOR SUNT", | |||||
"message": "Exercitation officia ad consequat est voluptate est incididunt ut culpa consectetur. Consectetur irure veniam ipsum sint sit anim minim aute exercitation ullamco nostrud reprehenderit consequat.", | |||||
"user": "Christi Walker", | |||||
"tag": [ | |||||
"consectetur", | |||||
"sint", | |||||
"qui", | |||||
"ipsum" | |||||
] | |||||
}, | |||||
{ | |||||
"subject": "TEMPOR ID VOLUPTATE", | |||||
"message": "Anim ex commodo officia consequat in magna esse sunt mollit sunt commodo. Ex sit aute reprehenderit elit magna sunt irure pariatur cupidatat labore.", | |||||
"user": "Kent Schroeder", | |||||
"tag": [ | |||||
"adipisicing", | |||||
"nulla", | |||||
"tempor", | |||||
"veniam" | |||||
] | |||||
}, | |||||
{ | |||||
"subject": "LOREM EST AUTE", | |||||
"message": "Irure excepteur laborum quis tempor officia cillum officia est ea adipisicing duis enim aliqua. Est dolor laborum officia elit ullamco.", | |||||
"user": "Dominguez Stevens", | |||||
"tag": [ | |||||
"mollit", | |||||
"amet", | |||||
"consectetur", | |||||
"dolore" | |||||
] | |||||
}, | |||||
{ | |||||
"subject": "ESSE MOLLIT CILLUM", | |||||
"message": "Eu culpa laborum consequat sunt aliqua excepteur. Voluptate pariatur deserunt consequat id nostrud do magna occaecat sint nulla non nostrud.", | |||||
"user": "Terrell Padilla", | |||||
"tag": [ | |||||
"Lorem", | |||||
"consequat", | |||||
"fugiat", | |||||
"aliqua" | |||||
] | |||||
} | |||||
] | |||||
) |
../bunyan/bin/bunyan |
../ldapjs/bin/ldapjs-add |
../ldapjs/bin/ldapjs-compare |
../ldapjs/bin/ldapjs-delete |
../ldapjs/bin/ldapjs-modify |
../ldapjs/bin/ldapjs-search |
../ncp/bin/ncp |
x.scrollDown = ESC + 'T'; | x.scrollDown = ESC + 'T'; | ||||
x.clearScreen = '\u001Bc'; | x.clearScreen = '\u001Bc'; | ||||
x.clearTerminal = process.platform === 'win32' ? | |||||
`${x.eraseScreen}${ESC}0f` : | |||||
// 1. Erases the screen (Only done in case `2` is not supported) | |||||
// 2. Erases the whole screen including scrollback buffer | |||||
// 3. Moves cursor to the top-left position | |||||
// More info: https://www.real-world-systems.com/docs/ANSIcode.html | |||||
`${x.eraseScreen}${ESC}3J${ESC}H`; | |||||
x.beep = BEL; | x.beep = BEL; | ||||
x.link = (text, url) => { | x.link = (text, url) => { |
{ | { | ||||
"_from": "ansi-escapes@^3.0.0", | |||||
"_id": "ansi-escapes@3.1.0", | |||||
"_from": "ansi-escapes@^3.2.0", | |||||
"_id": "ansi-escapes@3.2.0", | |||||
"_inBundle": false, | "_inBundle": false, | ||||
"_integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", | |||||
"_integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", | |||||
"_location": "/ansi-escapes", | "_location": "/ansi-escapes", | ||||
"_phantomChildren": {}, | "_phantomChildren": {}, | ||||
"_requested": { | "_requested": { | ||||
"type": "range", | "type": "range", | ||||
"registry": true, | "registry": true, | ||||
"raw": "ansi-escapes@^3.0.0", | |||||
"raw": "ansi-escapes@^3.2.0", | |||||
"name": "ansi-escapes", | "name": "ansi-escapes", | ||||
"escapedName": "ansi-escapes", | "escapedName": "ansi-escapes", | ||||
"rawSpec": "^3.0.0", | |||||
"rawSpec": "^3.2.0", | |||||
"saveSpec": null, | "saveSpec": null, | ||||
"fetchSpec": "^3.0.0" | |||||
"fetchSpec": "^3.2.0" | |||||
}, | }, | ||||
"_requiredBy": [ | "_requiredBy": [ | ||||
"/inquirer" | "/inquirer" | ||||
], | ], | ||||
"_resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", | |||||
"_shasum": "f73207bb81207d75fd6c83f125af26eea378ca30", | |||||
"_spec": "ansi-escapes@^3.0.0", | |||||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/inquirer", | |||||
"_resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", | |||||
"_shasum": "8780b98ff9dbf5638152d1f1fe5c1d7b4442976b", | |||||
"_spec": "ansi-escapes@^3.2.0", | |||||
"_where": "/home/erik/Documents/workspace_brackets/a1_BME_Project_Ohm/om/node_modules/inquirer", | |||||
"author": { | "author": { | ||||
"name": "Sindre Sorhus", | "name": "Sindre Sorhus", | ||||
"email": "sindresorhus@gmail.com", | "email": "sindresorhus@gmail.com", | ||||
"scripts": { | "scripts": { | ||||
"test": "xo && ava" | "test": "xo && ava" | ||||
}, | }, | ||||
"version": "3.1.0" | |||||
"version": "3.2.0" | |||||
} | } |
### clearScreen | ### clearScreen | ||||
Clear the terminal screen. | |||||
Clear the terminal screen. (Viewport) | |||||
### clearTerminal | |||||
Clear the whole terminal, including scrollback buffer. (Not just the visible part of it) | |||||
### beep | ### beep | ||||
node_modules | |||||
*.log |
language: node_js | |||||
node_js: | |||||
- 0.8 | |||||
- 0.10 |
Copyright (c) 2011 Mark Cavage, All rights reserved. | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE |
node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS. | |||||
Currently BER encoding is supported; at some point I'll likely have to do DER. | |||||
## Usage | |||||
Mostly, if you're *actually* needing to read and write ASN.1, you probably don't | |||||
need this readme to explain what and why. If you have no idea what ASN.1 is, | |||||
see this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc | |||||
The source is pretty much self-explanatory, and has read/write methods for the | |||||
common types out there. | |||||
### Decoding | |||||
The following reads an ASN.1 sequence with a boolean. | |||||
var Ber = require('asn1').Ber; | |||||
var reader = new Ber.Reader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff])); | |||||
reader.readSequence(); | |||||
console.log('Sequence len: ' + reader.length); | |||||
if (reader.peek() === Ber.Boolean) | |||||
console.log(reader.readBoolean()); | |||||
### Encoding | |||||
The following generates the same payload as above. | |||||
var Ber = require('asn1').Ber; | |||||
var writer = new Ber.Writer(); | |||||
writer.startSequence(); | |||||
writer.writeBoolean(true); | |||||
writer.endSequence(); | |||||
console.log(writer.buffer); | |||||
## Installation | |||||
npm install asn1 | |||||
## License | |||||
MIT. | |||||
## Bugs | |||||
See <https://github.com/mcavage/node-asn1/issues>. |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
module.exports = { | |||||
newInvalidAsn1Error: function(msg) { | |||||
var e = new Error(); | |||||
e.name = 'InvalidAsn1Error'; | |||||
e.message = msg || ''; | |||||
return e; | |||||
} | |||||
}; |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
var errors = require('./errors'); | |||||
var types = require('./types'); | |||||
var Reader = require('./reader'); | |||||
var Writer = require('./writer'); | |||||
///--- Exports | |||||
module.exports = { | |||||
Reader: Reader, | |||||
Writer: Writer | |||||
}; | |||||
for (var t in types) { | |||||
if (types.hasOwnProperty(t)) | |||||
module.exports[t] = types[t]; | |||||
} | |||||
for (var e in errors) { | |||||
if (errors.hasOwnProperty(e)) | |||||
module.exports[e] = errors[e]; | |||||
} |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
var assert = require('assert'); | |||||
var ASN1 = require('./types'); | |||||
var errors = require('./errors'); | |||||
///--- Globals | |||||
var newInvalidAsn1Error = errors.newInvalidAsn1Error; | |||||
///--- API | |||||
function Reader(data) { | |||||
if (!data || !Buffer.isBuffer(data)) | |||||
throw new TypeError('data must be a node Buffer'); | |||||
this._buf = data; | |||||
this._size = data.length; | |||||
// These hold the "current" state | |||||
this._len = 0; | |||||
this._offset = 0; | |||||
} | |||||
Object.defineProperty(Reader.prototype, 'length', { | |||||
enumerable: true, | |||||
get: function () { return (this._len); } | |||||
}); | |||||
Object.defineProperty(Reader.prototype, 'offset', { | |||||
enumerable: true, | |||||
get: function () { return (this._offset); } | |||||
}); | |||||
Object.defineProperty(Reader.prototype, 'remain', { | |||||
get: function () { return (this._size - this._offset); } | |||||
}); | |||||
Object.defineProperty(Reader.prototype, 'buffer', { | |||||
get: function () { return (this._buf.slice(this._offset)); } | |||||
}); | |||||
/** | |||||
* Reads a single byte and advances offset; you can pass in `true` to make this | |||||
* a "peek" operation (i.e., get the byte, but don't advance the offset). | |||||
* | |||||
* @param {Boolean} peek true means don't move offset. | |||||
* @return {Number} the next byte, null if not enough data. | |||||
*/ | |||||
Reader.prototype.readByte = function(peek) { | |||||
if (this._size - this._offset < 1) | |||||
return null; | |||||
var b = this._buf[this._offset] & 0xff; | |||||
if (!peek) | |||||
this._offset += 1; | |||||
return b; | |||||
}; | |||||
Reader.prototype.peek = function() { | |||||
return this.readByte(true); | |||||
}; | |||||
/** | |||||
* Reads a (potentially) variable length off the BER buffer. This call is | |||||
* not really meant to be called directly, as callers have to manipulate | |||||
* the internal buffer afterwards. | |||||
* | |||||
* As a result of this call, you can call `Reader.length`, until the | |||||
* next thing called that does a readLength. | |||||
* | |||||
* @return {Number} the amount of offset to advance the buffer. | |||||
* @throws {InvalidAsn1Error} on bad ASN.1 | |||||
*/ | |||||
Reader.prototype.readLength = function(offset) { | |||||
if (offset === undefined) | |||||
offset = this._offset; | |||||
if (offset >= this._size) | |||||
return null; | |||||
var lenB = this._buf[offset++] & 0xff; | |||||
if (lenB === null) | |||||
return null; | |||||
if ((lenB & 0x80) == 0x80) { | |||||
lenB &= 0x7f; | |||||
if (lenB == 0) | |||||
throw newInvalidAsn1Error('Indefinite length not supported'); | |||||
if (lenB > 4) | |||||
throw newInvalidAsn1Error('encoding too long'); | |||||
if (this._size - offset < lenB) | |||||
return null; | |||||
this._len = 0; | |||||
for (var i = 0; i < lenB; i++) | |||||
this._len = (this._len << 8) + (this._buf[offset++] & 0xff); | |||||
} else { | |||||
// Wasn't a variable length | |||||
this._len = lenB; | |||||
} | |||||
return offset; | |||||
}; | |||||
/** | |||||
* Parses the next sequence in this BER buffer. | |||||
* | |||||
* To get the length of the sequence, call `Reader.length`. | |||||
* | |||||
* @return {Number} the sequence's tag. | |||||
*/ | |||||
Reader.prototype.readSequence = function(tag) { | |||||
var seq = this.peek(); | |||||
if (seq === null) | |||||
return null; | |||||
if (tag !== undefined && tag !== seq) | |||||
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + | |||||
': got 0x' + seq.toString(16)); | |||||
var o = this.readLength(this._offset + 1); // stored in `length` | |||||
if (o === null) | |||||
return null; | |||||
this._offset = o; | |||||
return seq; | |||||
}; | |||||
Reader.prototype.readInt = function() { | |||||
return this._readTag(ASN1.Integer); | |||||
}; | |||||
Reader.prototype.readBoolean = function() { | |||||
return (this._readTag(ASN1.Boolean) === 0 ? false : true); | |||||
}; | |||||
Reader.prototype.readEnumeration = function() { | |||||
return this._readTag(ASN1.Enumeration); | |||||
}; | |||||
Reader.prototype.readString = function(tag, retbuf) { | |||||
if (!tag) | |||||
tag = ASN1.OctetString; | |||||
var b = this.peek(); | |||||
if (b === null) | |||||
return null; | |||||
if (b !== tag) | |||||
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + | |||||
': got 0x' + b.toString(16)); | |||||
var o = this.readLength(this._offset + 1); // stored in `length` | |||||
if (o === null) | |||||
return null; | |||||
if (this.length > this._size - o) | |||||
return null; | |||||
this._offset = o; | |||||
if (this.length === 0) | |||||
return retbuf ? new Buffer(0) : ''; | |||||
var str = this._buf.slice(this._offset, this._offset + this.length); | |||||
this._offset += this.length; | |||||
return retbuf ? str : str.toString('utf8'); | |||||
}; | |||||
Reader.prototype.readOID = function(tag) { | |||||
if (!tag) | |||||
tag = ASN1.OID; | |||||
var b = this.readString(tag, true); | |||||
if (b === null) | |||||
return null; | |||||
var values = []; | |||||
var value = 0; | |||||
for (var i = 0; i < b.length; i++) { | |||||
var byte = b[i] & 0xff; | |||||
value <<= 7; | |||||
value += byte & 0x7f; | |||||
if ((byte & 0x80) == 0) { | |||||
values.push(value); | |||||
value = 0; | |||||
} | |||||
} | |||||
value = values.shift(); | |||||
values.unshift(value % 40); | |||||
values.unshift((value / 40) >> 0); | |||||
return values.join('.'); | |||||
}; | |||||
Reader.prototype._readTag = function(tag) { | |||||
assert.ok(tag !== undefined); | |||||
var b = this.peek(); | |||||
if (b === null) | |||||
return null; | |||||
if (b !== tag) | |||||
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + | |||||
': got 0x' + b.toString(16)); | |||||
var o = this.readLength(this._offset + 1); // stored in `length` | |||||
if (o === null) | |||||
return null; | |||||
if (this.length > 4) | |||||
throw newInvalidAsn1Error('Integer too long: ' + this.length); | |||||
if (this.length > this._size - o) | |||||
return null; | |||||
this._offset = o; | |||||
var fb = this._buf[this._offset]; | |||||
var value = 0; | |||||
for (var i = 0; i < this.length; i++) { | |||||
value <<= 8; | |||||
value |= (this._buf[this._offset++] & 0xff); | |||||
} | |||||
if ((fb & 0x80) == 0x80 && i !== 4) | |||||
value -= (1 << (i * 8)); | |||||
return value >> 0; | |||||
}; | |||||
///--- Exported API | |||||
module.exports = Reader; |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
module.exports = { | |||||
EOC: 0, | |||||
Boolean: 1, | |||||
Integer: 2, | |||||
BitString: 3, | |||||
OctetString: 4, | |||||
Null: 5, | |||||
OID: 6, | |||||
ObjectDescriptor: 7, | |||||
External: 8, | |||||
Real: 9, // float | |||||
Enumeration: 10, | |||||
PDV: 11, | |||||
Utf8String: 12, | |||||
RelativeOID: 13, | |||||
Sequence: 16, | |||||
Set: 17, | |||||
NumericString: 18, | |||||
PrintableString: 19, | |||||
T61String: 20, | |||||
VideotexString: 21, | |||||
IA5String: 22, | |||||
UTCTime: 23, | |||||
GeneralizedTime: 24, | |||||
GraphicString: 25, | |||||
VisibleString: 26, | |||||
GeneralString: 28, | |||||
UniversalString: 29, | |||||
CharacterString: 30, | |||||
BMPString: 31, | |||||
Constructor: 32, | |||||
Context: 128 | |||||
}; |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
var assert = require('assert'); | |||||
var ASN1 = require('./types'); | |||||
var errors = require('./errors'); | |||||
///--- Globals | |||||
var newInvalidAsn1Error = errors.newInvalidAsn1Error; | |||||
var DEFAULT_OPTS = { | |||||
size: 1024, | |||||
growthFactor: 8 | |||||
}; | |||||
///--- Helpers | |||||
function merge(from, to) { | |||||
assert.ok(from); | |||||
assert.equal(typeof(from), 'object'); | |||||
assert.ok(to); | |||||
assert.equal(typeof(to), 'object'); | |||||
var keys = Object.getOwnPropertyNames(from); | |||||
keys.forEach(function(key) { | |||||
if (to[key]) | |||||
return; | |||||
var value = Object.getOwnPropertyDescriptor(from, key); | |||||
Object.defineProperty(to, key, value); | |||||
}); | |||||
return to; | |||||
} | |||||
///--- API | |||||
function Writer(options) { | |||||
options = merge(DEFAULT_OPTS, options || {}); | |||||
this._buf = new Buffer(options.size || 1024); | |||||
this._size = this._buf.length; | |||||
this._offset = 0; | |||||
this._options = options; | |||||
// A list of offsets in the buffer where we need to insert | |||||
// sequence tag/len pairs. | |||||
this._seq = []; | |||||
} | |||||
Object.defineProperty(Writer.prototype, 'buffer', { | |||||
get: function () { | |||||
if (this._seq.length) | |||||
throw new InvalidAsn1Error(this._seq.length + ' unended sequence(s)'); | |||||
return (this._buf.slice(0, this._offset)); | |||||
} | |||||
}); | |||||
Writer.prototype.writeByte = function(b) { | |||||
if (typeof(b) !== 'number') | |||||
throw new TypeError('argument must be a Number'); | |||||
this._ensure(1); | |||||
this._buf[this._offset++] = b; | |||||
}; | |||||
Writer.prototype.writeInt = function(i, tag) { | |||||
if (typeof(i) !== 'number') | |||||
throw new TypeError('argument must be a Number'); | |||||
if (typeof(tag) !== 'number') | |||||
tag = ASN1.Integer; | |||||
var sz = 4; | |||||
while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) && | |||||
(sz > 1)) { | |||||
sz--; | |||||
i <<= 8; | |||||
} | |||||
if (sz > 4) | |||||
throw new InvalidAsn1Error('BER ints cannot be > 0xffffffff'); | |||||
this._ensure(2 + sz); | |||||
this._buf[this._offset++] = tag; | |||||
this._buf[this._offset++] = sz; | |||||
while (sz-- > 0) { | |||||
this._buf[this._offset++] = ((i & 0xff000000) >>> 24); | |||||
i <<= 8; | |||||
} | |||||
}; | |||||
Writer.prototype.writeNull = function() { | |||||
this.writeByte(ASN1.Null); | |||||
this.writeByte(0x00); | |||||
}; | |||||
Writer.prototype.writeEnumeration = function(i, tag) { | |||||
if (typeof(i) !== 'number') | |||||
throw new TypeError('argument must be a Number'); | |||||
if (typeof(tag) !== 'number') | |||||
tag = ASN1.Enumeration; | |||||
return this.writeInt(i, tag); | |||||
}; | |||||
Writer.prototype.writeBoolean = function(b, tag) { | |||||
if (typeof(b) !== 'boolean') | |||||
throw new TypeError('argument must be a Boolean'); | |||||
if (typeof(tag) !== 'number') | |||||
tag = ASN1.Boolean; | |||||
this._ensure(3); | |||||
this._buf[this._offset++] = tag; | |||||
this._buf[this._offset++] = 0x01; | |||||
this._buf[this._offset++] = b ? 0xff : 0x00; | |||||
}; | |||||
Writer.prototype.writeString = function(s, tag) { | |||||
if (typeof(s) !== 'string') | |||||
throw new TypeError('argument must be a string (was: ' + typeof(s) + ')'); | |||||
if (typeof(tag) !== 'number') | |||||
tag = ASN1.OctetString; | |||||
var len = Buffer.byteLength(s); | |||||
this.writeByte(tag); | |||||
this.writeLength(len); | |||||
if (len) { | |||||
this._ensure(len); | |||||
this._buf.write(s, this._offset); | |||||
this._offset += len; | |||||
} | |||||
}; | |||||
Writer.prototype.writeBuffer = function(buf, tag) { | |||||
if (typeof(tag) !== 'number') | |||||
throw new TypeError('tag must be a number'); | |||||
if (!Buffer.isBuffer(buf)) | |||||
throw new TypeError('argument must be a buffer'); | |||||
this.writeByte(tag); | |||||
this.writeLength(buf.length); | |||||
this._ensure(buf.length); | |||||
buf.copy(this._buf, this._offset, 0, buf.length); | |||||
this._offset += buf.length; | |||||
}; | |||||
Writer.prototype.writeStringArray = function(strings) { | |||||
if ((!strings instanceof Array)) | |||||
throw new TypeError('argument must be an Array[String]'); | |||||
var self = this; | |||||
strings.forEach(function(s) { | |||||
self.writeString(s); | |||||
}); | |||||
}; | |||||
// This is really to solve DER cases, but whatever for now | |||||
Writer.prototype.writeOID = function(s, tag) { | |||||
if (typeof(s) !== 'string') | |||||
throw new TypeError('argument must be a string'); | |||||
if (typeof(tag) !== 'number') | |||||
tag = ASN1.OID; | |||||
if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) | |||||
throw new Error('argument is not a valid OID string'); | |||||
function encodeOctet(bytes, octet) { | |||||
if (octet < 128) { | |||||
bytes.push(octet); | |||||
} else if (octet < 16384) { | |||||
bytes.push((octet >>> 7) | 0x80); | |||||
bytes.push(octet & 0x7F); | |||||
} else if (octet < 2097152) { | |||||
bytes.push((octet >>> 14) | 0x80); | |||||
bytes.push(((octet >>> 7) | 0x80) & 0xFF); | |||||
bytes.push(octet & 0x7F); | |||||
} else if (octet < 268435456) { | |||||
bytes.push((octet >>> 21) | 0x80); | |||||
bytes.push(((octet >>> 14) | 0x80) & 0xFF); | |||||
bytes.push(((octet >>> 7) | 0x80) & 0xFF); | |||||
bytes.push(octet & 0x7F); | |||||
} else { | |||||
bytes.push(((octet >>> 28) | 0x80) & 0xFF); | |||||
bytes.push(((octet >>> 21) | 0x80) & 0xFF); | |||||
bytes.push(((octet >>> 14) | 0x80) & 0xFF); | |||||
bytes.push(((octet >>> 7) | 0x80) & 0xFF); | |||||
bytes.push(octet & 0x7F); | |||||
} | |||||
} | |||||
var tmp = s.split('.'); | |||||
var bytes = []; | |||||
bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10)); | |||||
tmp.slice(2).forEach(function(b) { | |||||
encodeOctet(bytes, parseInt(b, 10)); | |||||
}); | |||||
var self = this; | |||||
this._ensure(2 + bytes.length); | |||||
this.writeByte(tag); | |||||
this.writeLength(bytes.length); | |||||
bytes.forEach(function(b) { | |||||
self.writeByte(b); | |||||
}); | |||||
}; | |||||
Writer.prototype.writeLength = function(len) { | |||||
if (typeof(len) !== 'number') | |||||
throw new TypeError('argument must be a Number'); | |||||
this._ensure(4); | |||||
if (len <= 0x7f) { | |||||
this._buf[this._offset++] = len; | |||||
} else if (len <= 0xff) { | |||||
this._buf[this._offset++] = 0x81; | |||||
this._buf[this._offset++] = len; | |||||
} else if (len <= 0xffff) { | |||||
this._buf[this._offset++] = 0x82; | |||||
this._buf[this._offset++] = len >> 8; | |||||
this._buf[this._offset++] = len; | |||||
} else if (len <= 0xffffff) { | |||||
this._buf[this._offset++] = 0x83; | |||||
this._buf[this._offset++] = len >> 16; | |||||
this._buf[this._offset++] = len >> 8; | |||||
this._buf[this._offset++] = len; | |||||
} else { | |||||
throw new InvalidAsn1ERror('Length too long (> 4 bytes)'); | |||||
} | |||||
}; | |||||
Writer.prototype.startSequence = function(tag) { | |||||
if (typeof(tag) !== 'number') | |||||
tag = ASN1.Sequence | ASN1.Constructor; | |||||
this.writeByte(tag); | |||||
this._seq.push(this._offset); | |||||
this._ensure(3); | |||||
this._offset += 3; | |||||
}; | |||||
Writer.prototype.endSequence = function() { | |||||
var seq = this._seq.pop(); | |||||
var start = seq + 3; | |||||
var len = this._offset - start; | |||||
if (len <= 0x7f) { | |||||
this._shift(start, len, -2); | |||||
this._buf[seq] = len; | |||||
} else if (len <= 0xff) { | |||||
this._shift(start, len, -1); | |||||
this._buf[seq] = 0x81; | |||||
this._buf[seq + 1] = len; | |||||
} else if (len <= 0xffff) { | |||||
this._buf[seq] = 0x82; | |||||
this._buf[seq + 1] = len >> 8; | |||||
this._buf[seq + 2] = len; | |||||
} else if (len <= 0xffffff) { | |||||
this._shift(start, len, 1); | |||||
this._buf[seq] = 0x83; | |||||
this._buf[seq + 1] = len >> 16; | |||||
this._buf[seq + 2] = len >> 8; | |||||
this._buf[seq + 3] = len; | |||||
} else { | |||||
throw new InvalidAsn1Error('Sequence too long'); | |||||
} | |||||
}; | |||||
Writer.prototype._shift = function(start, len, shift) { | |||||
assert.ok(start !== undefined); | |||||
assert.ok(len !== undefined); | |||||
assert.ok(shift); | |||||
this._buf.copy(this._buf, start + shift, start, start + len); | |||||
this._offset += shift; | |||||
}; | |||||
Writer.prototype._ensure = function(len) { | |||||
assert.ok(len); | |||||
if (this._size - this._offset < len) { | |||||
var sz = this._size * this._options.growthFactor; | |||||
if (sz - this._offset < len) | |||||
sz += len; | |||||
var buf = new Buffer(sz); | |||||
this._buf.copy(buf, 0, 0, this._offset); | |||||
this._buf = buf; | |||||
this._size = sz; | |||||
} | |||||
}; | |||||
///--- Exported API | |||||
module.exports = Writer; |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
// If you have no idea what ASN.1 or BER is, see this: | |||||
// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc | |||||
var Ber = require('./ber/index'); | |||||
///--- Exported API | |||||
module.exports = { | |||||
Ber: Ber, | |||||
BerReader: Ber.Reader, | |||||
BerWriter: Ber.Writer | |||||
}; |
{ | |||||
"_from": "asn1@0.2.3", | |||||
"_id": "asn1@0.2.3", | |||||
"_inBundle": false, | |||||
"_integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", | |||||
"_location": "/asn1", | |||||
"_phantomChildren": {}, | |||||
"_requested": { | |||||
"type": "version", | |||||
"registry": true, | |||||
"raw": "asn1@0.2.3", | |||||
"name": "asn1", | |||||
"escapedName": "asn1", | |||||
"rawSpec": "0.2.3", | |||||
"saveSpec": null, | |||||
"fetchSpec": "0.2.3" | |||||
}, | |||||
"_requiredBy": [ | |||||
"/ldapjs" | |||||
], | |||||
"_resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", | |||||
"_shasum": "dac8787713c9966849fc8180777ebe9c1ddf3b86", | |||||
"_spec": "asn1@0.2.3", | |||||
"_where": "/home/erik/Documents/workspace_brackets/a1_BME_Project_Ohm/om/node_modules/ldapjs", | |||||
"author": { | |||||
"name": "Mark Cavage", | |||||
"email": "mcavage@gmail.com" | |||||
}, | |||||
"bugs": { | |||||
"url": "https://github.com/mcavage/node-asn1/issues" | |||||
}, | |||||
"bundleDependencies": false, | |||||
"contributors": [ | |||||
{ | |||||
"name": "David Gwynne", | |||||
"email": "loki@animata.net" | |||||
}, | |||||
{ | |||||
"name": "Yunong Xiao", | |||||
"email": "yunong@joyent.com" | |||||
}, | |||||
{ | |||||
"name": "Alex Wilson", | |||||
"email": "alex.wilson@joyent.com" | |||||
} | |||||
], | |||||
"dependencies": {}, | |||||
"deprecated": false, | |||||
"description": "Contains parsers and serializers for ASN.1 (currently BER only)", | |||||
"devDependencies": { | |||||
"tap": "0.4.8" | |||||
}, | |||||
"homepage": "https://github.com/mcavage/node-asn1#readme", | |||||
"license": "MIT", | |||||
"main": "lib/index.js", | |||||
"name": "asn1", | |||||
"repository": { | |||||
"type": "git", | |||||
"url": "git://github.com/mcavage/node-asn1.git" | |||||
}, | |||||
"scripts": { | |||||
"test": "tap ./tst" | |||||
}, | |||||
"version": "0.2.3" | |||||
} |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
var test = require('tap').test; | |||||
///--- Globals | |||||
var BerReader; | |||||
///--- Tests | |||||
test('load library', function(t) { | |||||
BerReader = require('../../lib/index').BerReader; | |||||
t.ok(BerReader); | |||||
try { | |||||
new BerReader(); | |||||
t.fail('Should have thrown'); | |||||
} catch (e) { | |||||
t.ok(e instanceof TypeError, 'Should have been a type error'); | |||||
} | |||||
t.end(); | |||||
}); | |||||
test('read byte', function(t) { | |||||
var reader = new BerReader(new Buffer([0xde])); | |||||
t.ok(reader); | |||||
t.equal(reader.readByte(), 0xde, 'wrong value'); | |||||
t.end(); | |||||
}); | |||||
test('read 1 byte int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x01, 0x03])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), 0x03, 'wrong value'); | |||||
t.equal(reader.length, 0x01, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read 2 byte int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x02, 0x7e, 0xde])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), 0x7ede, 'wrong value'); | |||||
t.equal(reader.length, 0x02, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read 3 byte int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x03, 0x7e, 0xde, 0x03])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), 0x7ede03, 'wrong value'); | |||||
t.equal(reader.length, 0x03, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read 4 byte int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x04, 0x7e, 0xde, 0x03, 0x01])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), 0x7ede0301, 'wrong value'); | |||||
t.equal(reader.length, 0x04, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read 1 byte negative int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x01, 0xdc])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), -36, 'wrong value'); | |||||
t.equal(reader.length, 0x01, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read 2 byte negative int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x02, 0xc0, 0x4e])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), -16306, 'wrong value'); | |||||
t.equal(reader.length, 0x02, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read 3 byte negative int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x03, 0xff, 0x00, 0x19])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), -65511, 'wrong value'); | |||||
t.equal(reader.length, 0x03, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read 4 byte negative int', function(t) { | |||||
var reader = new BerReader(new Buffer([0x02, 0x04, 0x91, 0x7c, 0x22, 0x1f])); | |||||
t.ok(reader); | |||||
t.equal(reader.readInt(), -1854135777, 'wrong value'); | |||||
t.equal(reader.length, 0x04, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read boolean true', function(t) { | |||||
var reader = new BerReader(new Buffer([0x01, 0x01, 0xff])); | |||||
t.ok(reader); | |||||
t.equal(reader.readBoolean(), true, 'wrong value'); | |||||
t.equal(reader.length, 0x01, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read boolean false', function(t) { | |||||
var reader = new BerReader(new Buffer([0x01, 0x01, 0x00])); | |||||
t.ok(reader); | |||||
t.equal(reader.readBoolean(), false, 'wrong value'); | |||||
t.equal(reader.length, 0x01, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read enumeration', function(t) { | |||||
var reader = new BerReader(new Buffer([0x0a, 0x01, 0x20])); | |||||
t.ok(reader); | |||||
t.equal(reader.readEnumeration(), 0x20, 'wrong value'); | |||||
t.equal(reader.length, 0x01, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read string', function(t) { | |||||
var dn = 'cn=foo,ou=unit,o=test'; | |||||
var buf = new Buffer(dn.length + 2); | |||||
buf[0] = 0x04; | |||||
buf[1] = Buffer.byteLength(dn); | |||||
buf.write(dn, 2); | |||||
var reader = new BerReader(buf); | |||||
t.ok(reader); | |||||
t.equal(reader.readString(), dn, 'wrong value'); | |||||
t.equal(reader.length, dn.length, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('read sequence', function(t) { | |||||
var reader = new BerReader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff])); | |||||
t.ok(reader); | |||||
t.equal(reader.readSequence(), 0x30, 'wrong value'); | |||||
t.equal(reader.length, 0x03, 'wrong length'); | |||||
t.equal(reader.readBoolean(), true, 'wrong value'); | |||||
t.equal(reader.length, 0x01, 'wrong length'); | |||||
t.end(); | |||||
}); | |||||
test('anonymous LDAPv3 bind', function(t) { | |||||
var BIND = new Buffer(14); | |||||
BIND[0] = 0x30; // Sequence | |||||
BIND[1] = 12; // len | |||||
BIND[2] = 0x02; // ASN.1 Integer | |||||
BIND[3] = 1; // len | |||||
BIND[4] = 0x04; // msgid (make up 4) | |||||
BIND[5] = 0x60; // Bind Request | |||||
BIND[6] = 7; // len | |||||
BIND[7] = 0x02; // ASN.1 Integer | |||||
BIND[8] = 1; // len | |||||
BIND[9] = 0x03; // v3 | |||||
BIND[10] = 0x04; // String (bind dn) | |||||
BIND[11] = 0; // len | |||||
BIND[12] = 0x80; // ContextSpecific (choice) | |||||
BIND[13] = 0; // simple bind | |||||
// Start testing ^^ | |||||
var ber = new BerReader(BIND); | |||||
t.equal(ber.readSequence(), 48, 'Not an ASN.1 Sequence'); | |||||
t.equal(ber.length, 12, 'Message length should be 12'); | |||||
t.equal(ber.readInt(), 4, 'Message id should have been 4'); | |||||
t.equal(ber.readSequence(), 96, 'Bind Request should have been 96'); | |||||
t.equal(ber.length, 7, 'Bind length should have been 7'); | |||||
t.equal(ber.readInt(), 3, 'LDAP version should have been 3'); | |||||
t.equal(ber.readString(), '', 'Bind DN should have been empty'); | |||||
t.equal(ber.length, 0, 'string length should have been 0'); | |||||
t.equal(ber.readByte(), 0x80, 'Should have been ContextSpecific (choice)'); | |||||
t.equal(ber.readByte(), 0, 'Should have been simple bind'); | |||||
t.equal(null, ber.readByte(), 'Should be out of data'); | |||||
t.end(); | |||||
}); | |||||
test('long string', function(t) { | |||||
var buf = new Buffer(256); | |||||
var o; | |||||
var s = | |||||
'2;649;CN=Red Hat CS 71GA Demo,O=Red Hat CS 71GA Demo,C=US;' + | |||||
'CN=RHCS Agent - admin01,UID=admin01,O=redhat,C=US [1] This is ' + | |||||
'Teena Vradmin\'s description.'; | |||||
buf[0] = 0x04; | |||||
buf[1] = 0x81; | |||||
buf[2] = 0x94; | |||||
buf.write(s, 3); | |||||
var ber = new BerReader(buf.slice(0, 3 + s.length)); | |||||
t.equal(ber.readString(), s); | |||||
t.end(); | |||||
}); |
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved. | |||||
var test = require('tap').test; | |||||
var sys = require('sys'); | |||||
///--- Globals | |||||
var BerWriter; | |||||
var BerReader; | |||||
///--- Tests | |||||
test('load library', function(t) { | |||||
BerWriter = require('../../lib/index').BerWriter; | |||||
t.ok(BerWriter); | |||||
t.ok(new BerWriter()); | |||||
t.end(); | |||||
}); | |||||
test('write byte', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeByte(0xC2); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 1, 'Wrong length'); | |||||
t.equal(ber[0], 0xC2, 'value wrong'); | |||||
t.end(); | |||||
}); | |||||
test('write 1 byte int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(0x7f); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 3, 'Wrong length for an int: ' + ber.length); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong (2) -> ' + ber[0]); | |||||
t.equal(ber[1], 0x01, 'length wrong(1) -> ' + ber[1]); | |||||
t.equal(ber[2], 0x7f, 'value wrong(3) -> ' + ber[2]); | |||||
t.end(); | |||||
}); | |||||
test('write 2 byte int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(0x7ffe); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 4, 'Wrong length for an int'); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong'); | |||||
t.equal(ber[1], 0x02, 'length wrong'); | |||||
t.equal(ber[2], 0x7f, 'value wrong (byte 1)'); | |||||
t.equal(ber[3], 0xfe, 'value wrong (byte 2)'); | |||||
t.end(); | |||||
}); | |||||
test('write 3 byte int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(0x7ffffe); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 5, 'Wrong length for an int'); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong'); | |||||
t.equal(ber[1], 0x03, 'length wrong'); | |||||
t.equal(ber[2], 0x7f, 'value wrong (byte 1)'); | |||||
t.equal(ber[3], 0xff, 'value wrong (byte 2)'); | |||||
t.equal(ber[4], 0xfe, 'value wrong (byte 3)'); | |||||
t.end(); | |||||
}); | |||||
test('write 4 byte int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(0x7ffffffe); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 6, 'Wrong length for an int'); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong'); | |||||
t.equal(ber[1], 0x04, 'length wrong'); | |||||
t.equal(ber[2], 0x7f, 'value wrong (byte 1)'); | |||||
t.equal(ber[3], 0xff, 'value wrong (byte 2)'); | |||||
t.equal(ber[4], 0xff, 'value wrong (byte 3)'); | |||||
t.equal(ber[5], 0xfe, 'value wrong (byte 4)'); | |||||
t.end(); | |||||
}); | |||||
test('write 1 byte negative int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(-128); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 3, 'Wrong length for an int'); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong'); | |||||
t.equal(ber[1], 0x01, 'length wrong'); | |||||
t.equal(ber[2], 0x80, 'value wrong (byte 1)'); | |||||
t.end(); | |||||
}); | |||||
test('write 2 byte negative int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(-22400); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 4, 'Wrong length for an int'); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong'); | |||||
t.equal(ber[1], 0x02, 'length wrong'); | |||||
t.equal(ber[2], 0xa8, 'value wrong (byte 1)'); | |||||
t.equal(ber[3], 0x80, 'value wrong (byte 2)'); | |||||
t.end(); | |||||
}); | |||||
test('write 3 byte negative int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(-481653); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 5, 'Wrong length for an int'); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong'); | |||||
t.equal(ber[1], 0x03, 'length wrong'); | |||||
t.equal(ber[2], 0xf8, 'value wrong (byte 1)'); | |||||
t.equal(ber[3], 0xa6, 'value wrong (byte 2)'); | |||||
t.equal(ber[4], 0x8b, 'value wrong (byte 3)'); | |||||
t.end(); | |||||
}); | |||||
test('write 4 byte negative int', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeInt(-1522904131); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 6, 'Wrong length for an int'); | |||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong'); | |||||
t.equal(ber[1], 0x04, 'length wrong'); | |||||
t.equal(ber[2], 0xa5, 'value wrong (byte 1)'); | |||||
t.equal(ber[3], 0x3a, 'value wrong (byte 2)'); | |||||
t.equal(ber[4], 0x53, 'value wrong (byte 3)'); | |||||
t.equal(ber[5], 0xbd, 'value wrong (byte 4)'); | |||||
t.end(); | |||||
}); | |||||
test('write boolean', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeBoolean(true); | |||||
writer.writeBoolean(false); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 6, 'Wrong length'); | |||||
t.equal(ber[0], 0x01, 'tag wrong'); | |||||
t.equal(ber[1], 0x01, 'length wrong'); | |||||
t.equal(ber[2], 0xff, 'value wrong'); | |||||
t.equal(ber[3], 0x01, 'tag wrong'); | |||||
t.equal(ber[4], 0x01, 'length wrong'); | |||||
t.equal(ber[5], 0x00, 'value wrong'); | |||||
t.end(); | |||||
}); | |||||
test('write string', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeString('hello world'); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 13, 'wrong length'); | |||||
t.equal(ber[0], 0x04, 'wrong tag'); | |||||
t.equal(ber[1], 11, 'wrong length'); | |||||
t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value'); | |||||
t.end(); | |||||
}); | |||||
test('write buffer', function(t) { | |||||
var writer = new BerWriter(); | |||||
// write some stuff to start with | |||||
writer.writeString('hello world'); | |||||
var ber = writer.buffer; | |||||
var buf = new Buffer([0x04, 0x0b, 0x30, 0x09, 0x02, 0x01, 0x0f, 0x01, 0x01, | |||||
0xff, 0x01, 0x01, 0xff]); | |||||
writer.writeBuffer(buf.slice(2, buf.length), 0x04); | |||||
ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 26, 'wrong length'); | |||||
t.equal(ber[0], 0x04, 'wrong tag'); | |||||
t.equal(ber[1], 11, 'wrong length'); | |||||
t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value'); | |||||
t.equal(ber[13], buf[0], 'wrong tag'); | |||||
t.equal(ber[14], buf[1], 'wrong length'); | |||||
for (var i = 13, j = 0; i < ber.length && j < buf.length; i++, j++) { | |||||
t.equal(ber[i], buf[j], 'buffer contents not identical'); | |||||
} | |||||
t.end(); | |||||
}); | |||||
test('write string array', function(t) { | |||||
var writer = new BerWriter(); | |||||
writer.writeStringArray(['hello world', 'fubar!']); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 21, 'wrong length'); | |||||
t.equal(ber[0], 0x04, 'wrong tag'); | |||||
t.equal(ber[1], 11, 'wrong length'); | |||||
t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value'); | |||||
t.equal(ber[13], 0x04, 'wrong tag'); | |||||
t.equal(ber[14], 6, 'wrong length'); | |||||
t.equal(ber.slice(15).toString('utf8'), 'fubar!', 'wrong value'); | |||||
t.end(); | |||||
}); | |||||
test('resize internal buffer', function(t) { | |||||
var writer = new BerWriter({size: 2}); | |||||
writer.writeString('hello world'); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 13, 'wrong length'); | |||||
t.equal(ber[0], 0x04, 'wrong tag'); | |||||
t.equal(ber[1], 11, 'wrong length'); | |||||
t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value'); | |||||
t.end(); | |||||
}); | |||||
test('sequence', function(t) { | |||||
var writer = new BerWriter({size: 25}); | |||||
writer.startSequence(); | |||||
writer.writeString('hello world'); | |||||
writer.endSequence(); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
console.log(ber); | |||||
t.equal(ber.length, 15, 'wrong length'); | |||||
t.equal(ber[0], 0x30, 'wrong tag'); | |||||
t.equal(ber[1], 13, 'wrong length'); | |||||
t.equal(ber[2], 0x04, 'wrong tag'); | |||||
t.equal(ber[3], 11, 'wrong length'); | |||||
t.equal(ber.slice(4).toString('utf8'), 'hello world', 'wrong value'); | |||||
t.end(); | |||||
}); | |||||
test('nested sequence', function(t) { | |||||
var writer = new BerWriter({size: 25}); | |||||
writer.startSequence(); | |||||
writer.writeString('hello world'); | |||||
writer.startSequence(); | |||||
writer.writeString('hello world'); | |||||
writer.endSequence(); | |||||
writer.endSequence(); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 30, 'wrong length'); | |||||
t.equal(ber[0], 0x30, 'wrong tag'); | |||||
t.equal(ber[1], 28, 'wrong length'); | |||||
t.equal(ber[2], 0x04, 'wrong tag'); | |||||
t.equal(ber[3], 11, 'wrong length'); | |||||
t.equal(ber.slice(4, 15).toString('utf8'), 'hello world', 'wrong value'); | |||||
t.equal(ber[15], 0x30, 'wrong tag'); | |||||
t.equal(ber[16], 13, 'wrong length'); | |||||
t.equal(ber[17], 0x04, 'wrong tag'); | |||||
t.equal(ber[18], 11, 'wrong length'); | |||||
t.equal(ber.slice(19, 30).toString('utf8'), 'hello world', 'wrong value'); | |||||
t.end(); | |||||
}); | |||||
test('LDAP bind message', function(t) { | |||||
var dn = 'cn=foo,ou=unit,o=test'; | |||||
var writer = new BerWriter(); | |||||
writer.startSequence(); | |||||
writer.writeInt(3); // msgid = 3 | |||||
writer.startSequence(0x60); // ldap bind | |||||
writer.writeInt(3); // ldap v3 | |||||
writer.writeString(dn); | |||||
writer.writeByte(0x80); | |||||
writer.writeByte(0x00); | |||||
writer.endSequence(); | |||||
writer.endSequence(); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
t.equal(ber.length, 35, 'wrong length (buffer)'); | |||||
t.equal(ber[0], 0x30, 'wrong tag'); | |||||
t.equal(ber[1], 33, 'wrong length'); | |||||
t.equal(ber[2], 0x02, 'wrong tag'); | |||||
t.equal(ber[3], 1, 'wrong length'); | |||||
t.equal(ber[4], 0x03, 'wrong value'); | |||||
t.equal(ber[5], 0x60, 'wrong tag'); | |||||
t.equal(ber[6], 28, 'wrong length'); | |||||
t.equal(ber[7], 0x02, 'wrong tag'); | |||||
t.equal(ber[8], 1, 'wrong length'); | |||||
t.equal(ber[9], 0x03, 'wrong value'); | |||||
t.equal(ber[10], 0x04, 'wrong tag'); | |||||
t.equal(ber[11], dn.length, 'wrong length'); | |||||
t.equal(ber.slice(12, 33).toString('utf8'), dn, 'wrong value'); | |||||
t.equal(ber[33], 0x80, 'wrong tag'); | |||||
t.equal(ber[34], 0x00, 'wrong len'); | |||||
t.end(); | |||||
}); | |||||
test('Write OID', function(t) { | |||||
var oid = '1.2.840.113549.1.1.1'; | |||||
var writer = new BerWriter(); | |||||
writer.writeOID(oid); | |||||
var ber = writer.buffer; | |||||
t.ok(ber); | |||||
console.log(require('util').inspect(ber)); | |||||
console.log(require('util').inspect(new Buffer([0x06, 0x09, 0x2a, 0x86, | |||||
0x48, 0x86, 0xf7, 0x0d, | |||||
0x01, 0x01, 0x01]))); | |||||
t.end(); | |||||
}); |
Dave Eddy <dave@daveeddy.com> | |||||
Fred Kuo <fred.kuo@joyent.com> | |||||
Lars-Magnus Skog <ralphtheninja@riseup.net> | |||||
Mark Cavage <mcavage@gmail.com> | |||||
Patrick Mooney <pmooney@pfmooney.com> | |||||
Rob Gulewich <robert.gulewich@joyent.com> |
# assert-plus Changelog | |||||
## 1.0.0 | |||||
- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input | |||||
- Add assert.finite check. Previous assert.number callers should use this if | |||||
they expect Infinity inputs to throw. | |||||
## 0.2.0 | |||||
- Fix `assert.object(null)` so it throws | |||||
- Fix optional/arrayOf exports for non-type-of asserts | |||||
- Add optiona/arrayOf exports for Stream/Date/Regex/uuid | |||||
- Add basic unit test coverage |
# assert-plus | |||||
This library is a super small wrapper over node's assert module that has two | |||||
things: (1) the ability to disable assertions with the environment variable | |||||
NODE\_NDEBUG, and (2) some API wrappers for argument testing. Like | |||||
`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks | |||||
like this: | |||||
```javascript | |||||
var assert = require('assert-plus'); | |||||
function fooAccount(options, callback) { | |||||
assert.object(options, 'options'); | |||||
assert.number(options.id, 'options.id'); | |||||
assert.bool(options.isManager, 'options.isManager'); | |||||
assert.string(options.name, 'options.name'); | |||||
assert.arrayOfString(options.email, 'options.email'); | |||||
assert.func(callback, 'callback'); | |||||
// Do stuff | |||||
callback(null, {}); | |||||
} | |||||
``` | |||||
# API | |||||
All methods that *aren't* part of node's core assert API are simply assumed to | |||||
take an argument, and then a string 'name' that's not a message; `AssertionError` | |||||
will be thrown if the assertion fails with a message like: | |||||
AssertionError: foo (string) is required | |||||
at test (/home/mark/work/foo/foo.js:3:9) | |||||
at Object.<anonymous> (/home/mark/work/foo/foo.js:15:1) | |||||
at Module._compile (module.js:446:26) | |||||
at Object..js (module.js:464:10) | |||||
at Module.load (module.js:353:31) | |||||
at Function._load (module.js:311:12) | |||||
at Array.0 (module.js:484:10) | |||||
at EventEmitter._tickCallback (node.js:190:38) | |||||
from: | |||||
```javascript | |||||
function test(foo) { | |||||
assert.string(foo, 'foo'); | |||||
} | |||||
``` | |||||
There you go. You can check that arrays are of a homogeneous type with `Arrayof$Type`: | |||||
```javascript | |||||
function test(foo) { | |||||
assert.arrayOfString(foo, 'foo'); | |||||
} | |||||
``` | |||||
You can assert IFF an argument is not `undefined` (i.e., an optional arg): | |||||
```javascript | |||||
assert.optionalString(foo, 'foo'); | |||||
``` | |||||
Lastly, you can opt-out of assertion checking altogether by setting the | |||||
environment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have | |||||
lots of assertions, and don't want to pay `typeof ()` taxes to v8 in | |||||
production. Be advised: The standard functions re-exported from `assert` are | |||||
also disabled in assert-plus if NDEBUG is specified. Using them directly from | |||||
the `assert` module avoids this behavior. | |||||
The complete list of APIs is: | |||||
* assert.array | |||||
* assert.bool | |||||
* assert.buffer | |||||
* assert.func | |||||
* assert.number | |||||
* assert.finite | |||||
* assert.object | |||||
* assert.string | |||||
* assert.stream | |||||
* assert.date | |||||
* assert.regexp | |||||
* assert.uuid | |||||
* assert.arrayOfArray | |||||
* assert.arrayOfBool | |||||
* assert.arrayOfBuffer | |||||
* assert.arrayOfFunc | |||||
* assert.arrayOfNumber | |||||
* assert.arrayOfFinite | |||||
* assert.arrayOfObject | |||||
* assert.arrayOfString | |||||
* assert.arrayOfStream | |||||
* assert.arrayOfDate | |||||
* assert.arrayOfRegexp | |||||
* assert.arrayOfUuid | |||||
* assert.optionalArray | |||||
* assert.optionalBool | |||||
* assert.optionalBuffer | |||||
* assert.optionalFunc | |||||
* assert.optionalNumber | |||||
* assert.optionalFinite | |||||
* assert.optionalObject | |||||
* assert.optionalString | |||||
* assert.optionalStream | |||||
* assert.optionalDate | |||||
* assert.optionalRegexp | |||||
* assert.optionalUuid | |||||
* assert.optionalArrayOfArray | |||||
* assert.optionalArrayOfBool | |||||
* assert.optionalArrayOfBuffer | |||||
* assert.optionalArrayOfFunc | |||||
* assert.optionalArrayOfNumber | |||||
* assert.optionalArrayOfFinite | |||||
* assert.optionalArrayOfObject | |||||
* assert.optionalArrayOfString | |||||
* assert.optionalArrayOfStream | |||||
* assert.optionalArrayOfDate | |||||
* assert.optionalArrayOfRegexp | |||||
* assert.optionalArrayOfUuid | |||||
* assert.AssertionError | |||||
* assert.fail | |||||
* assert.ok | |||||
* assert.equal | |||||
* assert.notEqual | |||||
* assert.deepEqual | |||||
* assert.notDeepEqual | |||||
* assert.strictEqual | |||||
* assert.notStrictEqual | |||||
* assert.throws | |||||
* assert.doesNotThrow | |||||
* assert.ifError | |||||
# Installation | |||||
npm install assert-plus | |||||
## License | |||||
The MIT License (MIT) | |||||
Copyright (c) 2012 Mark Cavage | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy of | |||||
this software and associated documentation files (the "Software"), to deal in | |||||
the Software without restriction, including without limitation the rights to | |||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |||||
the Software, and to permit persons to whom the Software is furnished to do so, | |||||
subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in all | |||||
copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||||
SOFTWARE. | |||||
## Bugs | |||||
See <https://github.com/mcavage/node-assert-plus/issues>. |
// Copyright (c) 2012, Mark Cavage. All rights reserved. | |||||
// Copyright 2015 Joyent, Inc. | |||||
var assert = require('assert'); | |||||
var Stream = require('stream').Stream; | |||||
var util = require('util'); | |||||
///--- Globals | |||||
/* JSSTYLED */ | |||||
var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; | |||||
///--- Internal | |||||
function _capitalize(str) { | |||||
return (str.charAt(0).toUpperCase() + str.slice(1)); | |||||
} | |||||
function _toss(name, expected, oper, arg, actual) { | |||||
throw new assert.AssertionError({ | |||||
message: util.format('%s (%s) is required', name, expected), | |||||
actual: (actual === undefined) ? typeof (arg) : actual(arg), | |||||
expected: expected, | |||||
operator: oper || '===', | |||||
stackStartFunction: _toss.caller | |||||
}); | |||||
} | |||||
function _getClass(arg) { | |||||
return (Object.prototype.toString.call(arg).slice(8, -1)); | |||||
} | |||||
function noop() { | |||||
// Why even bother with asserts? | |||||
} | |||||
///--- Exports | |||||
var types = { | |||||
bool: { | |||||
check: function (arg) { return typeof (arg) === 'boolean'; } | |||||
}, | |||||
func: { | |||||
check: function (arg) { return typeof (arg) === 'function'; } | |||||
}, | |||||
string: { | |||||
check: function (arg) { return typeof (arg) === 'string'; } | |||||
}, | |||||
object: { | |||||
check: function (arg) { | |||||
return typeof (arg) === 'object' && arg !== null; | |||||
} | |||||
}, | |||||
number: { | |||||
check: function (arg) { | |||||
return typeof (arg) === 'number' && !isNaN(arg); | |||||
} | |||||
}, | |||||
finite: { | |||||
check: function (arg) { | |||||
return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); | |||||
} | |||||
}, | |||||
buffer: { | |||||
check: function (arg) { return Buffer.isBuffer(arg); }, | |||||
operator: 'Buffer.isBuffer' | |||||
}, | |||||
array: { | |||||
check: function (arg) { return Array.isArray(arg); }, | |||||
operator: 'Array.isArray' | |||||
}, | |||||
stream: { | |||||
check: function (arg) { return arg instanceof Stream; }, | |||||
operator: 'instanceof', | |||||
actual: _getClass | |||||
}, | |||||
date: { | |||||
check: function (arg) { return arg instanceof Date; }, | |||||
operator: 'instanceof', | |||||
actual: _getClass | |||||
}, | |||||
regexp: { | |||||
check: function (arg) { return arg instanceof RegExp; }, | |||||
operator: 'instanceof', | |||||
actual: _getClass | |||||
}, | |||||
uuid: { | |||||
check: function (arg) { | |||||
return typeof (arg) === 'string' && UUID_REGEXP.test(arg); | |||||
}, | |||||
operator: 'isUUID' | |||||
} | |||||
}; | |||||
function _setExports(ndebug) { | |||||
var keys = Object.keys(types); | |||||
var out; | |||||
/* re-export standard assert */ | |||||
if (process.env.NODE_NDEBUG) { | |||||
out = noop; | |||||
} else { | |||||
out = function (arg, msg) { | |||||
if (!arg) { | |||||
_toss(msg, 'true', arg); | |||||
} | |||||
}; | |||||
} | |||||
/* standard checks */ | |||||
keys.forEach(function (k) { | |||||
if (ndebug) { | |||||
out[k] = noop; | |||||
return; | |||||
} | |||||
var type = types[k]; | |||||
out[k] = function (arg, msg) { | |||||
if (!type.check(arg)) { | |||||
_toss(msg, k, type.operator, arg, type.actual); | |||||
} | |||||
}; | |||||
}); | |||||
/* optional checks */ | |||||
keys.forEach(function (k) { | |||||
var name = 'optional' + _capitalize(k); | |||||
if (ndebug) { | |||||
out[name] = noop; | |||||
return; | |||||
} | |||||
var type = types[k]; | |||||
out[name] = function (arg, msg) { | |||||
if (arg === undefined || arg === null) { | |||||
return; | |||||
} | |||||
if (!type.check(arg)) { | |||||
_toss(msg, k, type.operator, arg, type.actual); | |||||
} | |||||
}; | |||||
}); | |||||
/* arrayOf checks */ | |||||
keys.forEach(function (k) { | |||||
var name = 'arrayOf' + _capitalize(k); | |||||
if (ndebug) { | |||||
out[name] = noop; | |||||
return; | |||||
} | |||||
var type = types[k]; | |||||
var expected = '[' + k + ']'; | |||||
out[name] = function (arg, msg) { | |||||
if (!Array.isArray(arg)) { | |||||
_toss(msg, expected, type.operator, arg, type.actual); | |||||
} | |||||
var i; | |||||
for (i = 0; i < arg.length; i++) { | |||||
if (!type.check(arg[i])) { | |||||
_toss(msg, expected, type.operator, arg, type.actual); | |||||
} | |||||
} | |||||
}; | |||||
}); | |||||
/* optionalArrayOf checks */ | |||||
keys.forEach(function (k) { | |||||
var name = 'optionalArrayOf' + _capitalize(k); | |||||
if (ndebug) { | |||||
out[name] = noop; | |||||
return; | |||||
} | |||||
var type = types[k]; | |||||
var expected = '[' + k + ']'; | |||||
out[name] = function (arg, msg) { | |||||
if (arg === undefined || arg === null) { | |||||
return; | |||||
} | |||||
if (!Array.isArray(arg)) { | |||||
_toss(msg, expected, type.operator, arg, type.actual); | |||||
} | |||||
var i; | |||||
for (i = 0; i < arg.length; i++) { | |||||
if (!type.check(arg[i])) { | |||||
_toss(msg, expected, type.operator, arg, type.actual); | |||||
} | |||||
} | |||||
}; | |||||
}); | |||||
/* re-export built-in assertions */ | |||||
Object.keys(assert).forEach(function (k) { | |||||
if (k === 'AssertionError') { | |||||
out[k] = assert[k]; | |||||
return; | |||||
} | |||||
if (ndebug) { | |||||
out[k] = noop; | |||||
return; | |||||
} | |||||
out[k] = assert[k]; | |||||
}); | |||||
/* export ourselves (for unit tests _only_) */ | |||||
out._setExports = _setExports; | |||||
return out; | |||||
} | |||||
module.exports = _setExports(process.env.NODE_NDEBUG); |
{ | |||||
"_from": "assert-plus@^1.0.0", | |||||
"_id": "assert-plus@1.0.0", | |||||
"_inBundle": false, | |||||
"_integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", | |||||
"_location": "/assert-plus", | |||||
"_phantomChildren": {}, | |||||
"_requested": { | |||||
"type": "range", | |||||
"registry": true, | |||||
"raw": "assert-plus@^1.0.0", | |||||
"name": "assert-plus", | |||||
"escapedName": "assert-plus", | |||||
"rawSpec": "^1.0.0", | |||||
"saveSpec": null, | |||||
"fetchSpec": "^1.0.0" | |||||
}, | |||||
"_requiredBy": [ | |||||
"/dashdash", | |||||
"/ldapjs", | |||||
"/verror" | |||||
], | |||||
"_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", | |||||
"_shasum": "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525", | |||||
"_spec": "assert-plus@^1.0.0", | |||||
"_where": "/home/erik/Documents/workspace_brackets/a1_BME_Project_Ohm/om/node_modules/ldapjs", | |||||
"author": { | |||||
"name": "Mark Cavage", | |||||
"email": "mcavage@gmail.com" | |||||
}, | |||||
"bugs": { | |||||
"url": "https://github.com/mcavage/node-assert-plus/issues" | |||||
}, | |||||
"bundleDependencies": false, | |||||
"contributors": [ | |||||
{ | |||||
"name": "Dave Eddy", | |||||
"email": "dave@daveeddy.com" | |||||
}, | |||||
{ | |||||
"name": "Fred Kuo", | |||||
"email": "fred.kuo@joyent.com" | |||||
}, | |||||
{ | |||||
"name": "Lars-Magnus Skog", | |||||
"email": "ralphtheninja@riseup.net" | |||||
}, | |||||
{ | |||||
"name": "Mark Cavage", | |||||
"email": "mcavage@gmail.com" | |||||
}, | |||||
{ | |||||
"name": "Patrick Mooney", | |||||
"email": "pmooney@pfmooney.com" | |||||
}, | |||||
{ | |||||
"name": "Rob Gulewich", | |||||
"email": "robert.gulewich@joyent.com" | |||||
} | |||||
], | |||||
"dependencies": {}, | |||||
"deprecated": false, | |||||
"description": "Extra assertions on top of node's assert module", | |||||
"devDependencies": { | |||||
"faucet": "0.0.1", | |||||
"tape": "4.2.2" | |||||
}, | |||||
"engines": { | |||||
"node": ">=0.8" | |||||
}, | |||||
"homepage": "https://github.com/mcavage/node-assert-plus#readme", | |||||
"license": "MIT", | |||||
"main": "./assert.js", | |||||
"name": "assert-plus", | |||||
"optionalDependencies": {}, | |||||
"repository": { | |||||
"type": "git", | |||||
"url": "git+https://github.com/mcavage/node-assert-plus.git" | |||||
}, | |||||
"scripts": { | |||||
"test": "tape tests/*.js | ./node_modules/.bin/faucet" | |||||
}, | |||||
"version": "1.0.0" | |||||
} |
#v2.6.2 | |||||
- Updated lodash to squelch a security warning (#1620) | |||||
# v2.6.1 | # v2.6.1 | ||||
- Updated lodash to prevent `npm audit` warnings. (#1532, #1533) | - Updated lodash to prevent `npm audit` warnings. (#1532, #1533) | ||||
- Made `async-es` more optimized for webpack users (#1517) | - Made `async-es` more optimized for webpack users (#1517) |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* depending on the values of the async tests. Invoked with (err, result). | * depending on the values of the async tests. Invoked with (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* depending on the values of the async tests. Invoked with (err, result). | * depending on the values of the async tests. Invoked with (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_everyLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_everyLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doParallel2.default)((0, _createTester2.default)(Boolean, _identity2.default)); | exports.default = (0, _doParallel2.default)((0, _createTester2.default)(Boolean, _identity2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* tests. Invoked with (err, result). | * tests. Invoked with (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(Boolean, _identity2.default)); | exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(Boolean, _identity2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* tests. Invoked with (err, result). | * tests. Invoked with (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_someLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_someLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* two | * two | ||||
* three | * three | ||||
*/ | */ | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* ); | * ); | ||||
*/ | */ | ||||
exports.default = (0, _applyEach2.default)(_map2.default); | exports.default = (0, _applyEach2.default)(_map2.default); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* function call. | * function call. | ||||
*/ | */ | ||||
exports.default = (0, _applyEach2.default)(_mapSeries2.default); | exports.default = (0, _applyEach2.default)(_mapSeries2.default); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function rethrow(error) { | function rethrow(error) { | ||||
throw error; | throw error; | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* console.log('err = ', err); | * console.log('err = ', err); | ||||
* console.log('results = ', results); | * console.log('results = ', results); | ||||
* }); | * }); | ||||
*/ | |||||
*/ |
(0, _auto2.default)(newTasks, callback); | (0, _auto2.default)(newTasks, callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function cargo(worker, payload) { | function cargo(worker, payload) { | ||||
return (0, _queue2.default)(worker, 1, payload); | return (0, _queue2.default)(worker, 1, payload); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* // result now equals 15 | * // result now equals 15 | ||||
* }); | * }); | ||||
*/ | */ | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_concatLimit2.default, Infinity); | exports.default = (0, _doLimit2.default)(_concatLimit2.default, Infinity); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* containing the concatenated results of the `iteratee` function. Invoked with | * containing the concatenated results of the `iteratee` function. Invoked with | ||||
* (err, results). | * (err, results). | ||||
*/ | */ | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* (err, results). | * (err, results). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_concatLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_concatLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* //... | * //... | ||||
* }, callback); | * }, callback); | ||||
*/ | */ | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* (err, result). | * (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* (err, result). | * (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_detectLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_detectLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* {hello: 'world'} | * {hello: 'world'} | ||||
*/ | */ | ||||
exports.default = (0, _consoleFunc2.default)('dir'); | exports.default = (0, _consoleFunc2.default)('dir'); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
check(null, true); | check(null, true); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
return !test.apply(this, arguments); | return !test.apply(this, arguments); | ||||
}, callback); | }, callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
}; | }; | ||||
_iteratee(next); | _iteratee(next); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
_test(check); | _test(check); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function eachLimit(coll, iteratee, callback) { | function eachLimit(coll, iteratee, callback) { | ||||
(0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function eachLimit(coll, limit, iteratee, callback) { | function eachLimit(coll, limit, iteratee, callback) { | ||||
(0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* doSomethingWith(configs); | * doSomethingWith(configs); | ||||
* }); | * }); | ||||
*/ | */ | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function eachOfLimit(coll, limit, iteratee, callback) { | function eachOfLimit(coll, limit, iteratee, callback) { | ||||
(0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); | (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* functions have finished, or an error occurs. Invoked with (err). | * functions have finished, or an error occurs. Invoked with (err). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_eachOfLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_eachOfLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* `iteratee` functions have finished, or an error occurs. Invoked with (err). | * `iteratee` functions have finished, or an error occurs. Invoked with (err). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_eachLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_eachLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
sync = false; | sync = false; | ||||
}); | }); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* depending on the values of the async tests. Invoked with (err, result). | * depending on the values of the async tests. Invoked with (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_notId2.default, _notId2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* depending on the values of the async tests. Invoked with (err, result). | * depending on the values of the async tests. Invoked with (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_everyLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_everyLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doParallel2.default)(_filter2.default); | exports.default = (0, _doParallel2.default)(_filter2.default); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* `iteratee` functions have finished. Invoked with (err, results). | * `iteratee` functions have finished. Invoked with (err, results). | ||||
*/ | */ | ||||
exports.default = (0, _doParallelLimit2.default)(_filter2.default); | exports.default = (0, _doParallelLimit2.default)(_filter2.default); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* `iteratee` functions have finished. Invoked with (err, results) | * `iteratee` functions have finished. Invoked with (err, results) | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_filterLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_filterLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | exports.default = (0, _doParallel2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* (err, result). | * (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | exports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default)); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* (err, result). | * (err, result). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_detectLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_detectLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
callback(err, memo); | callback(err, memo); | ||||
}); | }); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
var reversed = (0, _slice2.default)(array).reverse(); | var reversed = (0, _slice2.default)(array).reverse(); | ||||
(0, _reduce2.default)(reversed, memo, iteratee, callback); | (0, _reduce2.default)(reversed, memo, iteratee, callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function eachLimit(coll, iteratee, callback) { | function eachLimit(coll, iteratee, callback) { | ||||
(0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function eachLimit(coll, limit, iteratee, callback) { | function eachLimit(coll, limit, iteratee, callback) { | ||||
(0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* doSomethingWith(configs); | * doSomethingWith(configs); | ||||
* }); | * }); | ||||
*/ | */ | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function eachOfLimit(coll, limit, iteratee, callback) { | function eachOfLimit(coll, limit, iteratee, callback) { | ||||
(0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); | (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* functions have finished, or an error occurs. Invoked with (err). | * functions have finished, or an error occurs. Invoked with (err). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_eachOfLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_eachOfLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* `iteratee` functions have finished, or an error occurs. Invoked with (err). | * `iteratee` functions have finished, or an error occurs. Invoked with (err). | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_eachLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_eachLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
} | } | ||||
next(); | next(); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* }); | * }); | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_groupByLimit2.default, Infinity); | exports.default = (0, _doLimit2.default)(_groupByLimit2.default, Infinity); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* functions have finished, or an error occurs. Result is an `Object` whoses | * functions have finished, or an error occurs. Result is an `Object` whoses | ||||
* properties are arrays of values which returned the corresponding key. | * properties are arrays of values which returned the corresponding key. | ||||
*/ | */ | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
* properties are arrays of values which returned the corresponding key. | * properties are arrays of values which returned the corresponding key. | ||||
*/ | */ | ||||
exports.default = (0, _doLimit2.default)(_groupByLimit2.default, 1); | exports.default = (0, _doLimit2.default)(_groupByLimit2.default, 1); | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
exports.select = _filter2.default; | exports.select = _filter2.default; | ||||
exports.selectLimit = _filterLimit2.default; | exports.selectLimit = _filterLimit2.default; | ||||
exports.selectSeries = _filterSeries2.default; | exports.selectSeries = _filterSeries2.default; | ||||
exports.wrapSync = _asyncify2.default; | |||||
exports.wrapSync = _asyncify2.default; |
callback(err, memo); | callback(err, memo); | ||||
}); | }); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
} | } | ||||
return this; | return this; | ||||
}; | }; | ||||
module.exports = exports["default"]; | |||||
module.exports = exports["default"]; |
} | } | ||||
}; | }; | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
// A temporary value used to identify if the loop should be broken. | // A temporary value used to identify if the loop should be broken. | ||||
// See #1064, #1293 | // See #1064, #1293 | ||||
exports.default = {}; | exports.default = {}; | ||||
module.exports = exports["default"]; | |||||
module.exports = exports["default"]; |
(0, _wrapAsync2.default)(fn).apply(null, args); | (0, _wrapAsync2.default)(fn).apply(null, args); | ||||
}; | }; | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
}); | }); | ||||
}; | }; | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
return fn(iterable, limit, iteratee, callback); | return fn(iterable, limit, iteratee, callback); | ||||
}; | }; | ||||
} | } | ||||
module.exports = exports["default"]; | |||||
module.exports = exports["default"]; |
return fn(_eachOf2.default, obj, (0, _wrapAsync2.default)(iteratee), callback); | return fn(_eachOf2.default, obj, (0, _wrapAsync2.default)(iteratee), callback); | ||||
}; | }; | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
return fn((0, _eachOfLimit2.default)(limit), obj, (0, _wrapAsync2.default)(iteratee), callback); | return fn((0, _eachOfLimit2.default)(limit), obj, (0, _wrapAsync2.default)(iteratee), callback); | ||||
}; | }; | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
replenish(); | replenish(); | ||||
}; | }; | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
var filter = (0, _isArrayLike2.default)(coll) ? filterArray : filterGeneric; | var filter = (0, _isArrayLike2.default)(coll) ? filterArray : filterGeneric; | ||||
filter(eachfn, coll, (0, _wrapAsync2.default)(iteratee), callback || _noop2.default); | filter(eachfn, coll, (0, _wrapAsync2.default)(iteratee), callback || _noop2.default); | ||||
} | } | ||||
module.exports = exports['default']; | |||||
module.exports = exports['default']; |
function _findGetResult(v, x) { | function _findGetResult(v, x) { | ||||
return x; | return x; | ||||
} | } | ||||
module.exports = exports["default"]; | |||||
module.exports = exports["default"]; |