From a15fcadc21128af870d319369df4ab5ec85756c7 Mon Sep 17 00:00:00 2001 From: Dieter De Paepe Date: Tue, 29 Nov 2016 11:09:07 +0100 Subject: [PATCH] Ignore ttl.js. --- .gitignore | 1 + public/js/ttl.js | 8323 ++++++++++++++++++++++++++-------------------- 2 files changed, 4685 insertions(+), 3639 deletions(-) diff --git a/.gitignore b/.gitignore index 3c3629e..4e63016 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +public/js/ttl.js diff --git a/public/js/ttl.js b/public/js/ttl.js index c1de71a..eda3328 100644 --- a/public/js/ttl.js +++ b/public/js/ttl.js @@ -1,1933 +1,252 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o\\"\{\}\|\^\`]/; - -// ## Constructor -function N3Lexer(options) { - if (!(this instanceof N3Lexer)) - return new N3Lexer(options); - - // In line mode (N-Triples or N-Quads), only simple features may be parsed - if (options && options.lineMode) { - // Don't tokenize special literals - this._tripleQuotedString = this._number = this._boolean = /$0^/; - // Swap the tokenize method for a restricted version - var self = this; - this._tokenize = this.tokenize; - this.tokenize = function (input, callback) { - this._tokenize(input, function (error, token) { - if (!error && /IRI|prefixed|literal|langcode|type|\.|eof/.test(token.type)) - callback && callback(error, token); - else - callback && callback(error || self._syntaxError(token.type, callback = null)); - }); - }; +function placeHoldersCount (b64) { + var len = b64.length + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 } -N3Lexer.prototype = { - // ## Regular expressions - // It's slightly faster to have these as properties than as in-scope variables. - - _iri: /^<((?:[^>\\]|\\[uU])+)>/, // IRI with escape sequences; needs sanity check after unescaping - _unescapedIri: /^<([^\x00-\x20<>\\"\{\}\|\^\`]*)>/, // IRI without escape sequences; no unescaping - _unescapedString: /^"[^"\\]+"(?=[^"\\])/, // non-empty string without escape sequences - _singleQuotedString: /^"[^"\\]*(?:\\.[^"\\]*)*"(?=[^"\\])|^'[^'\\]*(?:\\.[^'\\]*)*'(?=[^'\\])/, - _tripleQuotedString: /^""("[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*")""|^''('[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*')''/, - _langcode: /^@([a-z]+(?:-[a-z0-9]+)*)(?=[^a-z0-9\-])/i, - _prefix: /^((?:[A-Za-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])(?:\.?[\-0-9A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])*)?:(?=[#\s<])/, - _prefixed: /^((?:[A-Za-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])(?:\.?[\-0-9A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])*)?:((?:(?:[0-:A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff]|%[0-9a-fA-F]{2}|\\[!#-\/;=?\-@_~])(?:(?:[\.\-0-:A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff]|%[0-9a-fA-F]{2}|\\[!#-\/;=?\-@_~])*(?:[\-0-:A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff]|%[0-9a-fA-F]{2}|\\[!#-\/;=?\-@_~]))?)?)(?=\.?[,;\s#()\[\]\{\}"'<])/, - _blank: /^_:((?:[0-9A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])(?:\.?[\-0-9A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])*)(?=\.?[,;:\s#()\[\]\{\}"'<])/, - _number: /^[\-+]?(?:\d+\.?\d*([eE](?:[\-\+])?\d+)|\d*\.?\d+)(?=[.,;:\s#()\[\]\{\}"'<])/, - _boolean: /^(?:true|false)(?=[.,;:\s#()\[\]\{\}"'<])/, - _keyword: /^@[a-z]+(?=[\s#<:])/, - _sparqlKeyword: /^(?:PREFIX|BASE|GRAPH)(?=[\s#<:])/i, - _shortPredicates: /^a(?=\s+|<)/, - _newline: /^[ \t]*(?:#[^\n\r]*)?(?:\r\n|\n|\r)[ \t]*/, - _whitespace: /^[ \t]+/, - _endOfFile: /^(?:#[^\n\r]*)?$/, - - // ## Private methods - - // ### `_tokenizeToEnd` tokenizes as for as possible, emitting tokens through the callback. - _tokenizeToEnd: function (callback, inputFinished) { - // Continue parsing as far as possible; the loop will return eventually. - var input = this._input; - while (true) { - // Count and skip whitespace lines. - var whiteSpaceMatch; - while (whiteSpaceMatch = this._newline.exec(input)) - input = input.substr(whiteSpaceMatch[0].length, input.length), this._line++; - // Skip whitespace on current line. - if (whiteSpaceMatch = this._whitespace.exec(input)) - input = input.substr(whiteSpaceMatch[0].length, input.length); - - // Stop for now if we're at the end. - if (this._endOfFile.test(input)) { - // If the input is finished, emit EOF. - if (inputFinished) - callback(input = null, { line: this._line, type: 'eof', value: '', prefix: '' }); - return this._input = input; - } - - // Look for specific token types based on the first character. - var line = this._line, type = '', value = '', prefix = '', - firstChar = input[0], match = null, matchLength = 0, unescaped, inconclusive = false; - switch (firstChar) { - case '^': - // Try to match a type. - if (input.length === 1) break; - else if (input[1] !== '^') return reportSyntaxError(this); - this._prevTokenType = '^'; - // Move to type IRI or prefixed name. - input = input.substr(2); - if (input[0] !== '<') { - inconclusive = true; - break; - } - // Fall through in case the type is an IRI. - - case '<': - // Try to find a full IRI without escape sequences. - if (match = this._unescapedIri.exec(input)) { - type = 'IRI'; - value = match[1]; - } - // Try to find a full IRI with escape sequences. - else if (match = this._iri.exec(input)) { - unescaped = this._unescape(match[1]); - if (unescaped === null || illegalIriChars.test(unescaped)) - return reportSyntaxError(this); - type = 'IRI'; - value = unescaped; - } - break; - - case '_': - // Try to find a blank node. Since it can contain (but not end with) a dot, - // we always need a non-dot character before deciding it is a prefixed name. - // Therefore, try inserting a space if we're at the end of the input. - if ((match = this._blank.exec(input)) || - inputFinished && (match = this._blank.exec(input + ' '))) { - type = 'prefixed'; - prefix = '_'; - value = match[1]; - } - break; - - case '"': - case "'": - // Try to find a non-empty double-quoted literal without escape sequences. - if (match = this._unescapedString.exec(input)) { - type = 'literal'; - value = match[0]; - } - // Try to find any other literal wrapped in a pair of single or double quotes. - else if (match = this._singleQuotedString.exec(input)) { - unescaped = this._unescape(match[0]); - if (unescaped === null) - return reportSyntaxError(this); - type = 'literal'; - value = unescaped.replace(/^'|'$/g, '"'); - } - // Try to find a literal wrapped in three pairs of single or double quotes. - else if (match = this._tripleQuotedString.exec(input)) { - unescaped = match[1] || match[2]; - // Count the newlines and advance line counter. - this._line += unescaped.split(/\r\n|\r|\n/).length - 1; - unescaped = this._unescape(unescaped); - if (unescaped === null) - return reportSyntaxError(this); - type = 'literal'; - value = unescaped.replace(/^'|'$/g, '"'); - } - break; - - case '@': - // Try to find a language code. - if (this._prevTokenType === 'literal' && (match = this._langcode.exec(input))) { - type = 'langcode'; - value = match[1]; - } - // Try to find a keyword. - else if (match = this._keyword.exec(input)) { - type = match[0]; - } - break; - - case '.': - // Try to find a dot as punctuation. - if (input.length === 1 ? inputFinished : (input[1] < '0' || input[1] > '9')) { - type = '.'; - matchLength = 1; - break; - } - // Fall through to numerical case (could be a decimal dot). - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '+': - case '-': - // Try to find a number. - if (match = this._number.exec(input)) { - type = 'literal'; - value = '"' + match[0] + '"^^http://www.w3.org/2001/XMLSchema#' + - (match[1] ? 'double' : (/^[+\-]?\d+$/.test(match[0]) ? 'integer' : 'decimal')); - } - break; - - case 'B': - case 'b': - case 'p': - case 'P': - case 'G': - case 'g': - // Try to find a SPARQL-style keyword. - if (match = this._sparqlKeyword.exec(input)) - type = match[0].toUpperCase(); - else - inconclusive = true; - break; - - case 'f': - case 't': - // Try to match a boolean. - if (match = this._boolean.exec(input)) { - type = 'literal'; - value = '"' + match[0] + '"^^http://www.w3.org/2001/XMLSchema#boolean'; - } - else - inconclusive = true; - break; - - case 'a': - // Try to find an abbreviated predicate. - if (match = this._shortPredicates.exec(input)) { - type = 'abbreviation'; - value = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'; - } - else - inconclusive = true; - break; - - case ',': - case ';': - case '[': - case ']': - case '(': - case ')': - case '{': - case '}': - // The next token is punctuation - matchLength = 1; - type = firstChar; - break; - - default: - inconclusive = true; - } - - // Some first characters do not allow an immediate decision, so inspect more. - if (inconclusive) { - // Try to find a prefix. - if ((this._prevTokenType === '@prefix' || this._prevTokenType === 'PREFIX') && - (match = this._prefix.exec(input))) { - type = 'prefix'; - value = match[1] || ''; - } - // Try to find a prefixed name. Since it can contain (but not end with) a dot, - // we always need a non-dot character before deciding it is a prefixed name. - // Therefore, try inserting a space if we're at the end of the input. - else if ((match = this._prefixed.exec(input)) || - inputFinished && (match = this._prefixed.exec(input + ' '))) { - type = 'prefixed'; - prefix = match[1] || ''; - value = this._unescape(match[2]); - } - } - - // A type token is special: it can only be emitted after an IRI or prefixed name is read. - if (this._prevTokenType === '^') - type = (type === 'IRI' || type === 'prefixed') ? 'type' : ''; - - // What if nothing of the above was found? - if (!type) { - // We could be in streaming mode, and then we just wait for more input to arrive. - // Otherwise, a syntax error has occurred in the input. - // One exception: error on an unaccounted linebreak (= not inside a triple-quoted literal). - if (inputFinished || (!/^'''|^"""/.test(input) && /\n|\r/.test(input))) - return reportSyntaxError(this); - else - return this._input = input; - } - - // Emit the parsed token. - callback(null, { line: line, type: type, value: value, prefix: prefix }); - this._prevTokenType = type; - - // Advance to next part to tokenize. - input = input.substr(matchLength || match[0].length, input.length); - } - - // Signals the syntax error through the callback - function reportSyntaxError(self) { callback(self._syntaxError(/^\S*/.exec(input)[0])); } - }, - - // ### `_unescape` replaces N3 escape codes by their corresponding characters. - _unescape: function (item) { - try { - return item.replace(escapeSequence, function (sequence, unicode4, unicode8, escapedChar) { - var charCode; - if (unicode4) { - charCode = parseInt(unicode4, 16); - if (isNaN(charCode)) throw new Error(); // can never happen (regex), but helps performance - return fromCharCode(charCode); - } - else if (unicode8) { - charCode = parseInt(unicode8, 16); - if (isNaN(charCode)) throw new Error(); // can never happen (regex), but helps performance - if (charCode <= 0xFFFF) return fromCharCode(charCode); - return fromCharCode(0xD800 + ((charCode -= 0x10000) / 0x400), 0xDC00 + (charCode & 0x3FF)); - } - else { - var replacement = escapeReplacements[escapedChar]; - if (!replacement) - throw new Error(); - return replacement; - } - }); - } - catch (error) { return null; } - }, - - // ### `_syntaxError` creates a syntax error for the given issue - _syntaxError: function (issue) { - this._input = null; - return new Error('Syntax error: unexpected "' + issue + '" on line ' + this._line + '.'); - }, - - - // ## Public methods - - // ### `tokenize` starts the transformation of an N3 document into an array of tokens. - // The input can be a string or a stream. - tokenize: function (input, callback) { - var self = this; - this._line = 1; - - // If the input is a string, continuously emit tokens through the callback until the end. - if (typeof input === 'string') { - this._input = input; - immediately(function () { self._tokenizeToEnd(callback, true); }); - } - // Otherwise, the input will be streamed. - else { - this._input = ''; - - // If no input was given, it will be streamed through `addChunk` and ended with `end` - if (!input || typeof input === 'function') { - this.addChunk = addChunk; - this.end = end; - if (!callback) - callback = input; - } - // Otherwise, the input itself must be a stream - else { - if (typeof input.setEncoding === 'function') - input.setEncoding('utf8'); - input.on('data', addChunk); - input.on('end', end); - } - } - - // Adds the data chunk to the buffer and parses as far as possible - function addChunk(data) { - if (self._input !== null) { - self._input += data; - self._tokenizeToEnd(callback, false); - } - } - - // Parses until the end - function end() { - if (self._input !== null) { - self._tokenizeToEnd(callback, true); - } - } - }, -}; - -// ## Exports - -// Export the `N3Lexer` class as a whole. -module.exports = N3Lexer; - -},{}],4:[function(require,module,exports){ -// **N3Parser** parses N3 documents. -var N3Lexer = require('./N3Lexer'); - -var RDF_PREFIX = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', - RDF_NIL = RDF_PREFIX + 'nil', - RDF_FIRST = RDF_PREFIX + 'first', - RDF_REST = RDF_PREFIX + 'rest'; - -var absoluteIRI = /:/, - documentPart = /[^\/]*$/, - rootIRI = /^(?:[^:]+:\/*)?[^\/]*/; - -// The next ID for new blank nodes -var blankNodePrefix = 0, blankNodeCount = 0; - -// ## Constructor -function N3Parser(options) { - if (!(this instanceof N3Parser)) - return new N3Parser(options); - this._tripleStack = []; - this._graph = null; - - // Set the document IRI. - options = options || {}; - if (!options.documentIRI) { - this._baseIRI = null; - this._baseIRIPath = null; - } - else { - if (options.documentIRI.indexOf('#') > 0) - throw new Error('Invalid document IRI'); - this._baseIRI = options.documentIRI; - this._baseIRIPath = this._baseIRI.replace(documentPart, ''); - this._baseIRIRoot = this._baseIRI.match(rootIRI)[0]; - } - - // Set supported features depending on the format. - var format = (typeof options.format === 'string') && options.format.match(/\w*$/)[0].toLowerCase(), - isTurtle = format === 'turtle', isTriG = format === 'trig', - isNTriples = /triple/.test(format), isNQuads = /quad/.test(format), - isLineMode = isNTriples || isNQuads; - if (!(this._supportsNamedGraphs = !isTurtle)) - this._readPredicateOrNamedGraph = this._readPredicate; - this._supportsQuads = !(isTurtle || isTriG || isNTriples); - // Disable relative IRIs in N-Triples or N-Quads mode - if (isLineMode) { - this._baseIRI = ''; - this._resolveIRI = function (token) { - this._error('Disallowed relative IRI', token); - return this._callback = noop, this._subject = null; - }; - } - this._blankNodePrefix = typeof options.blankNodePrefix !== 'string' ? '' : - '_:' + options.blankNodePrefix.replace(/^_:/, ''); - this._lexer = options.lexer || new N3Lexer({ lineMode: isLineMode }); +function byteLength (b64) { + // base64 is 4/3 + up to two characters of the original data + return b64.length * 3 / 4 - placeHoldersCount(b64) } -// ## Private class methods +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + placeHolders = placeHoldersCount(b64) -// ### `_resetBlankNodeIds` restarts blank node identification. -N3Parser._resetBlankNodeIds = function () { - blankNodePrefix = blankNodeCount = 0; -}; + arr = new Arr(len * 3 / 4 - placeHolders) -N3Parser.prototype = { - // ## Private methods + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len - // ### `_readInTopContext` reads a token when in the top context. - _readInTopContext: function (token) { - switch (token.type) { - // If an EOF token arrives in the top context, signal that we're done. - case 'eof': - if (this._graph !== null) - return this._error('Unclosed graph', token); - delete this._prefixes._; - return this._callback(null, null, this._prefixes); - // It could be a prefix declaration. - case '@prefix': - this._sparqlStyle = false; - return this._readPrefix; - case 'PREFIX': - this._sparqlStyle = true; - return this._readPrefix; - // It could be a base declaration. - case '@base': - this._sparqlStyle = false; - return this._readBaseIRI; - case 'BASE': - this._sparqlStyle = true; - return this._readBaseIRI; - // It could be a graph. - case '{': - if (this._supportsNamedGraphs) { - this._graph = ''; - this._subject = null; - return this._readSubject; - } - case 'GRAPH': - if (this._supportsNamedGraphs) { - return this._readNamedGraphLabel; - } - // Otherwise, the next token must be a subject. - default: - return this._readSubject(token); - } - }, + var L = 0 - // ### `_readSubject` reads a triple's subject. - _readSubject: function (token) { - this._predicate = null; - switch (token.type) { - case 'IRI': - if (this._baseIRI === null || absoluteIRI.test(token.value)) - this._subject = token.value; - else - this._subject = this._resolveIRI(token); - break; - case 'prefixed': - var prefix = this._prefixes[token.prefix]; - if (prefix === undefined) - return this._error('Undefined prefix "' + token.prefix + ':"', token); - this._subject = prefix + token.value; - break; - case '[': - // Start a new triple with a new blank node as subject. - this._subject = '_:b' + blankNodeCount++; - this._tripleStack.push({ subject: this._subject, predicate: null, object: null, type: 'blank' }); - return this._readBlankNodeHead; - case '(': - // Start a new list - this._tripleStack.push({ subject: RDF_NIL, predicate: null, object: null, type: 'list' }); - this._subject = null; - return this._readListItem; - case '}': - return this._readPunctuation(token); - default: - return this._error('Expected subject but got ' + token.type, token); - } - // The next token must be a predicate, - // or, if the subject was actually a graph IRI, a named graph. - return this._readPredicateOrNamedGraph; - }, - - // ### `_readPredicate` reads a triple's predicate. - _readPredicate: function (token) { - var type = token.type; - switch (type) { - case 'IRI': - case 'abbreviation': - if (this._baseIRI === null || absoluteIRI.test(token.value)) - this._predicate = token.value; - else - this._predicate = this._resolveIRI(token); - break; - case 'prefixed': - if (token.prefix === '_') { - return this._error('Disallowed blank node as predicate', token); - } - else { - var prefix = this._prefixes[token.prefix]; - if (prefix === undefined) - return this._error('Undefined prefix "' + token.prefix + ':"', token); - this._predicate = prefix + token.value; - } - break; - case '.': - case ']': - case '}': - // Expected predicate didn't come, must have been trailing semicolon. - if (this._predicate === null) - return this._error('Unexpected ' + type, token); - this._subject = null; - return type === ']' ? this._readBlankNodeTail(token) : this._readPunctuation(token); - case ';': - // Extra semicolons can be safely ignored - return this._readPredicate; - default: - return this._error('Expected predicate to follow "' + this._subject + '"', token); - } - // The next token must be an object. - return this._readObject; - }, - - // ### `_readObject` reads a triple's object. - _readObject: function (token) { - switch (token.type) { - case 'IRI': - if (this._baseIRI === null || absoluteIRI.test(token.value)) - this._object = token.value; - else - this._object = this._resolveIRI(token); - break; - case 'prefixed': - var prefix = this._prefixes[token.prefix]; - if (prefix === undefined) - return this._error('Undefined prefix "' + token.prefix + ':"', token); - this._object = prefix + token.value; - break; - case 'literal': - this._object = token.value; - return this._readDataTypeOrLang; - case '[': - // Start a new triple with a new blank node as subject. - var blank = '_:b' + blankNodeCount++; - this._tripleStack.push({ subject: this._subject, predicate: this._predicate, object: blank, type: 'blank' }); - this._subject = blank; - return this._readBlankNodeHead; - case '(': - // Start a new list - this._tripleStack.push({ subject: this._subject, predicate: this._predicate, object: RDF_NIL, type: 'list' }); - this._subject = null; - return this._readListItem; - default: - return this._error('Expected object to follow "' + this._predicate + '"', token); - } - return this._getTripleEndReader(); - }, - - // ### `_readPredicateOrNamedGraph` reads a triple's predicate, or a named graph. - _readPredicateOrNamedGraph: function (token) { - return token.type === '{' ? this._readGraph(token) : this._readPredicate(token); - }, - - // ### `_readGraph` reads a graph. - _readGraph: function (token) { - if (token.type !== '{') - return this._error('Expected graph but got ' + token.type, token); - // The "subject" we read is actually the GRAPH's label - this._graph = this._subject, this._subject = null; - return this._readSubject; - }, - - // ### `_readBlankNodeHead` reads the head of a blank node. - _readBlankNodeHead: function (token) { - if (token.type === ']') { - this._subject = null; - return this._readBlankNodeTail(token); - } - this._predicate = null; - return this._readPredicate(token); - }, - - // ### `_readBlankNodeTail` reads the end of a blank node. - _readBlankNodeTail: function (token) { - if (token.type !== ']') - return this._readBlankNodePunctuation(token); - - // Store blank node triple. - if (this._subject !== null) - this._callback(null, { subject: this._subject, - predicate: this._predicate, - object: this._object, - graph: this._graph || '' }); - - // Restore parent triple that contains the blank node. - var triple = this._tripleStack.pop(); - this._subject = triple.subject; - // Was the blank node the object? - if (triple.object !== null) { - // Restore predicate and object as well, and continue by reading punctuation. - this._predicate = triple.predicate; - this._object = triple.object; - return this._getTripleEndReader(); - } - // The blank node was the subject, so continue reading the predicate. - // If the blank node didn't contain any predicates, it could also be the label of a named graph. - return this._predicate !== null ? this._readPredicate : this._readPredicateOrNamedGraph; - }, - - // ### `_readDataTypeOrLang` reads an _optional_ data type or language. - _readDataTypeOrLang: function (token) { - switch (token.type) { - case 'type': - var value; - if (token.prefix === '') { - if (this._baseIRI === null || absoluteIRI.test(token.value)) - value = token.value; - else - value = this._resolveIRI(token); - } - else { - var prefix = this._prefixes[token.prefix]; - if (prefix === undefined) - return this._error('Undefined prefix "' + token.prefix + ':"', token); - value = prefix + token.value; - } - this._object += '^^' + value; - return this._getTripleEndReader(); - case 'langcode': - this._object += '@' + token.value.toLowerCase(); - return this._getTripleEndReader(); - default: - return this._getTripleEndReader().call(this, token); - } - }, - - // ### `_readListItem` reads items from a list. - _readListItem: function (token) { - var item = null, // The actual list item. - itemHead = null, // The head of the rdf:first predicate. - prevItemHead = this._subject, // The head of the previous rdf:first predicate. - stack = this._tripleStack, // The stack of triples part of recursion (lists, blanks, etc.). - parentTriple = stack[stack.length - 1], // The triple containing the current list. - next = this._readListItem; // The next function to execute. - - switch (token.type) { - case 'IRI': - item = token.value; - break; - case 'prefixed': - var prefix = this._prefixes[token.prefix]; - if (prefix === undefined) - return this._error('Undefined prefix "' + token.prefix + ':"', token); - item = prefix + token.value; - break; - case 'literal': - item = token.value; - next = this._readDataTypeOrLang; - break; - case '[': - // Stack the current list triple and start a new triple with a blank node as subject. - itemHead = '_:b' + blankNodeCount++; - item = '_:b' + blankNodeCount++; - stack.push({ subject: itemHead, predicate: RDF_FIRST, object: item, type: 'blank' }); - this._subject = item; - next = this._readBlankNodeHead; - break; - case '(': - // Stack the current list triple and start a new list - itemHead = '_:b' + blankNodeCount++; - stack.push({ subject: itemHead, predicate: RDF_FIRST, object: RDF_NIL, type: 'list' }); - this._subject = null; - next = this._readListItem; - break; - case ')': - // Restore the parent triple. - stack.pop(); - // If this list is contained within a parent list, return the membership triple here. - // This will be ` rdf:first .`. - if (stack.length !== 0 && stack[stack.length - 1].type === 'list') - this._callback(null, { subject: parentTriple.subject, - predicate: parentTriple.predicate, - object: parentTriple.object, - graph: this._graph || '' }); - // Restore the parent triple's subject. - this._subject = parentTriple.subject; - // Was this list in the parent triple's subject? - if (parentTriple.predicate === null) { - // The next token is the predicate. - next = this._readPredicate; - // Skip writing the list tail if this was an empty list. - if (parentTriple.subject === RDF_NIL) - return next; - } - // The list was in the parent triple's object. - else { - // Restore the parent triple's predicate and object as well. - this._predicate = parentTriple.predicate; - this._object = parentTriple.object; - next = this._getTripleEndReader(); - // Skip writing the list tail if this was an empty list. - if (parentTriple.object === RDF_NIL) - return next; - } - // Close the list by making the item head nil. - itemHead = RDF_NIL; - break; - default: - return this._error('Expected list item instead of "' + token.type + '"', token); - } - - // Create a new blank node if no item head was assigned yet. - if (itemHead === null) - this._subject = itemHead = '_:b' + blankNodeCount++; - - // Is this the first element of the list? - if (prevItemHead === null) { - // This list is either the object or the subject. - if (parentTriple.object === RDF_NIL) - parentTriple.object = itemHead; - else - parentTriple.subject = itemHead; - } - else { - // The rest of the list is in the current head. - this._callback(null, { subject: prevItemHead, - predicate: RDF_REST, - object: itemHead, - graph: this._graph || '' }); - } - // Add the item's value. - if (item !== null) - this._callback(null, { subject: itemHead, - predicate: RDF_FIRST, - object: item, - graph: this._graph || '' }); - return next; - }, - - // ### `_readPunctuation` reads punctuation between triples or triple parts. - _readPunctuation: function (token) { - var next, subject = this._subject, graph = this._graph; - switch (token.type) { - // A closing brace ends a graph - case '}': - if (this._graph === null) - return this._error('Unexpected graph closing', token); - this._graph = null; - // A dot just ends the statement, without sharing anything with the next. - case '.': - this._subject = null; - next = this._readInTopContext; - break; - // Semicolon means the subject is shared; predicate and object are different. - case ';': - next = this._readPredicate; - break; - // Comma means both the subject and predicate are shared; the object is different. - case ',': - next = this._readObject; - break; - // An IRI means this is a quad (only allowed if not already inside a graph). - case 'IRI': - if (this._supportsQuads && this._graph === null) { - if (this._baseIRI === null || absoluteIRI.test(token.value)) - graph = token.value; - else - graph = this._resolveIRI(token); - subject = this._subject; - next = this._readQuadPunctuation; - break; - } - // An prefixed name means this is a quad (only allowed if not already inside a graph). - case 'prefixed': - if (this._supportsQuads && this._graph === null) { - var prefix = this._prefixes[token.prefix]; - if (prefix === undefined) - return this._error('Undefined prefix "' + token.prefix + ':"', token); - graph = prefix + token.value; - next = this._readQuadPunctuation; - break; - } - default: - return this._error('Expected punctuation to follow "' + this._object + '"', token); - } - // A triple has been completed now, so return it. - if (subject !== null) - this._callback(null, { subject: subject, - predicate: this._predicate, - object: this._object, - graph: graph || '' }); - return next; - }, - - // ### `_readBlankNodePunctuation` reads punctuation in a blank node - _readBlankNodePunctuation: function (token) { - var next; - switch (token.type) { - // Semicolon means the subject is shared; predicate and object are different. - case ';': - next = this._readPredicate; - break; - // Comma means both the subject and predicate are shared; the object is different. - case ',': - next = this._readObject; - break; - default: - return this._error('Expected punctuation to follow "' + this._object + '"', token); - } - // A triple has been completed now, so return it. - this._callback(null, { subject: this._subject, - predicate: this._predicate, - object: this._object, - graph: this._graph || '' }); - return next; - }, - - // ### `_readQuadPunctuation` reads punctuation after a quad. - _readQuadPunctuation: function (token) { - if (token.type !== '.') - return this._error('Expected dot to follow quad', token); - return this._readInTopContext; - }, - - // ### `_readPrefix` reads the prefix of a prefix declaration. - _readPrefix: function (token) { - if (token.type !== 'prefix') - return this._error('Expected prefix to follow @prefix', token); - this._prefix = token.value; - return this._readPrefixIRI; - }, - - // ### `_readPrefixIRI` reads the IRI of a prefix declaration. - _readPrefixIRI: function (token) { - if (token.type !== 'IRI') - return this._error('Expected IRI to follow prefix "' + this._prefix + ':"', token); - var prefixIRI; - if (this._baseIRI === null || absoluteIRI.test(token.value)) - prefixIRI = token.value; - else - prefixIRI = this._resolveIRI(token); - this._prefixes[this._prefix] = prefixIRI; - this._prefixCallback(this._prefix, prefixIRI); - return this._readDeclarationPunctuation; - }, - - // ### `_readBaseIRI` reads the IRI of a base declaration. - _readBaseIRI: function (token) { - if (token.type !== 'IRI') - return this._error('Expected IRI to follow base declaration', token); - if (token.value.indexOf('#') > 0) - return this._error('Invalid base IRI', token); - if (this._baseIRI === null || absoluteIRI.test(token.value)) - this._baseIRI = token.value; - else - this._baseIRI = this._resolveIRI(token); - this._baseIRIPath = this._baseIRI.replace(documentPart, ''); - this._baseIRIRoot = this._baseIRI.match(rootIRI)[0]; - return this._readDeclarationPunctuation; - }, - - // ### `_readNamedGraphLabel` reads the label of a named graph. - _readNamedGraphLabel: function (token) { - switch (token.type) { - case 'IRI': - case 'prefixed': - return this._readSubject(token), this._readGraph; - case '[': - return this._readNamedGraphBlankLabel; - default: - return this._error('Invalid graph label', token); - } - }, - - // ### `_readNamedGraphLabel` reads a blank node label of a named graph. - _readNamedGraphBlankLabel: function (token) { - if (token.type !== ']') - return this._error('Invalid graph label', token); - this._subject = '_:b' + blankNodeCount++; - return this._readGraph; - }, - - // ### `_readDeclarationPunctuation` reads the punctuation of a declaration. - _readDeclarationPunctuation: function (token) { - // SPARQL-style declarations don't have punctuation. - if (this._sparqlStyle) - return this._readInTopContext(token); - - if (token.type !== '.') - return this._error('Expected declaration to end with a dot', token); - return this._readInTopContext; - }, - - // ### `_getTripleEndReader` gets the next reader function at the end of a triple. - _getTripleEndReader: function () { - var stack = this._tripleStack; - if (stack.length === 0) - return this._readPunctuation; - - switch (stack[stack.length - 1].type) { - case 'blank': - return this._readBlankNodeTail; - case 'list': - return this._readListItem; - } - }, - - // ### `_error` emits an error message through the callback. - _error: function (message, token) { - this._callback(new Error(message + ' at line ' + token.line + '.')); - }, - - // ### `_resolveIRI` resolves an IRI token against the base path - _resolveIRI: function (token) { - var iri = token.value; - switch (iri[0]) { - // An empty relative IRI indicates the base IRI - case undefined: - return this._baseIRI; - // Resolve relative fragment IRIs against the base IRI - case '#': - return this._baseIRI + iri; - // Resolve relative query string IRIs by replacing the query string - case '?': - return this._baseIRI.replace(/(?:\?.*)?$/, iri); - // Resolve root relative IRIs at the root of the base IRI - case '/': - return this._baseIRIRoot + iri; - // Resolve all other IRIs at the base IRI's path - default: - return this._baseIRIPath + iri; - } - }, - - // ## Public methods - - // ### `parse` parses the N3 input and emits each parsed triple through the callback. - parse: function (input, tripleCallback, prefixCallback) { - // The read callback is the next function to be executed when a token arrives. - // We start reading in the top context. - this._readCallback = this._readInTopContext; - this._prefixes = Object.create(null); - this._prefixes._ = this._blankNodePrefix || '_:b' + blankNodePrefix++ + '_'; - - // If the input argument is not given, shift parameters - if (typeof input === 'function') - prefixCallback = tripleCallback, tripleCallback = input, input = null; - - // Set the triple and prefix callbacks. - this._callback = tripleCallback || noop; - this._prefixCallback = prefixCallback || noop; - - // Execute the read callback when a token arrives. - var self = this; - this._lexer.tokenize(input, function (error, token) { - if (error !== null) - self._callback(error), self._callback = noop; - else if (self._readCallback !== undefined) - self._readCallback = self._readCallback(token); - }); - - // If no input was given, it can be added with `addChunk` and ended with `end` - if (!input) { - this.addChunk = this._lexer.addChunk; - this.end = this._lexer.end; - } - } -}; - -// The empty function -function noop() {} - -// ## Exports - -// Export the `N3Parser` class as a whole. -module.exports = N3Parser; - -},{"./N3Lexer":3}],5:[function(require,module,exports){ -// **N3Store** objects store N3 triples by graph in memory. - -var expandPrefixedName = require('./N3Util').expandPrefixedName; - -// ## Constructor -function N3Store(triples, options) { - if (!(this instanceof N3Store)) - return new N3Store(triples, options); - - // The number of triples is initially zero. - this._size = 0; - // `_graphs` contains subject, predicate, and object indexes per graph. - this._graphs = Object.create(null); - // `_entities` maps entities such as `http://xmlns.com/foaf/0.1/name` to numbers. - // This saves memory, since only the numbers have to be stored in `_graphs`. - this._entities = Object.create(null); - this._entities['><'] = 0; // Dummy entry, so the first actual key is non-zero - this._entityCount = 0; - // `_blankNodeIndex` is the index of the last created blank node that was automatically named - this._blankNodeIndex = 0; - - // Shift parameters if `triples` is not given - if (!options && triples && !triples[0]) - options = triples, triples = null; - - // Add triples and prefixes if passed - this._prefixes = Object.create(null); - if (options && options.prefixes) - this.addPrefixes(options.prefixes); - if (triples) - this.addTriples(triples); -} - -N3Store.prototype = { - // ## Public properties - - // ### `size` returns the number of triples in the store. - get size() { - // Return the triple count if if was cached. - var size = this._size; - if (size !== null) - return size; - - // Calculate the number of triples by counting to the deepest level. - var graphs = this._graphs, subjects, subject; - for (var graphKey in graphs) - for (var subjectKey in (subjects = graphs[graphKey].subjects)) - for (var predicateKey in (subject = subjects[subjectKey])) - size += Object.keys(subject[predicateKey]).length; - return this._size = size; - }, - - // ## Private methods - - // ### `_addToIndex` adds a triple to a three-layered index. - _addToIndex: function (index0, key0, key1, key2) { - // Create layers as necessary. - var index1 = index0[key0] || (index0[key0] = {}); - var index2 = index1[key1] || (index1[key1] = {}); - // Setting the key to _any_ value signalizes the presence of the triple. - index2[key2] = null; - }, - - // ### `_removeFromIndex` removes a triple from a three-layered index. - _removeFromIndex: function (index0, key0, key1, key2) { - // Remove the triple from the index. - var index1 = index0[key0], index2 = index1[key1], key; - delete index2[key2]; - - // Remove intermediary index layers if they are empty. - for (key in index2) return; - delete index1[key1]; - for (key in index1) return; - delete index0[key0]; - }, - - // ### `_findInIndex` finds a set of triples in a three-layered index. - // The index base is `index0` and the keys at each level are `key0`, `key1`, and `key2`. - // Any of these keys can be `null`, which is interpreted as a wildcard. - // `name0`, `name1`, and `name2` are the names of the keys at each level, - // used when reconstructing the resulting triple - // (for instance: _subject_, _predicate_, and _object_). - // Finally, `graph` will be the graph of the created triples. - _findInIndex: function (index0, key0, key1, key2, name0, name1, name2, graph) { - var results = [], entityKeys = Object.keys(this._entities), tmp, index1, index2; - - // If a key is specified, use only that part of index 0. - if (key0) (tmp = index0, index0 = {})[key0] = tmp[key0]; - for (var value0 in index0) { - var entity0 = entityKeys[value0]; - - if (index1 = index0[value0]) { - // If a key is specified, use only that part of index 1. - if (key1) (tmp = index1, index1 = {})[key1] = tmp[key1]; - for (var value1 in index1) { - var entity1 = entityKeys[value1]; - - if (index2 = index1[value1]) { - // If a key is specified, use only that part of index 2, if it exists. - var values = key2 ? (key2 in index2 ? [key2] : []) : Object.keys(index2); - // Create triples for all items found in index 2. - for (var l = values.length - 1; l >= 0; l--) { - var result = { subject: '', predicate: '', object: '', graph: graph }; - result[name0] = entity0; - result[name1] = entity1; - result[name2] = entityKeys[values[l]]; - results.push(result); - } - } - } - } - } - return results; - }, - - // ### `_countInIndex` counts matching triples in a three-layered index. - // The index base is `index0` and the keys at each level are `key0`, `key1`, and `key2`. - // Any of these keys can be `null`, which is interpreted as a wildcard. - _countInIndex: function (index0, key0, key1, key2) { - var count = 0, tmp, index1, index2; - - // If a key is specified, count only that part of index 0. - if (key0) (tmp = index0, index0 = {})[key0] = tmp[key0]; - for (var value0 in index0) { - if (index1 = index0[value0]) { - // If a key is specified, count only that part of index 1. - if (key1) (tmp = index1, index1 = {})[key1] = tmp[key1]; - for (var value1 in index1) { - if (index2 = index1[value1]) { - // If a key is specified, count the triple if it exists. - if (key2) (key2 in index2) && count++; - // Otherwise, count all triples. - else count += Object.keys(index2).length; - } - } - } - } - return count; - }, - - // ## Public methods - - // ### `addTriple` adds a new N3 triple to the store. - addTriple: function (subject, predicate, object, graph) { - // Shift arguments if a triple object is given instead of components - if (!predicate) - graph = subject.graph, object = subject.object, - predicate = subject.predicate, subject = subject.subject; - - // Find the graph that will contain the triple. - graph = graph || ''; - var graphItem = this._graphs[graph]; - // Create the graph if it doesn't exist yet. - if (!graphItem) { - graphItem = this._graphs[graph] = { - subjects: {}, - predicates: {}, - objects: {} - }; - // Freezing a graph helps subsequent `add` performance, - // and properties will never be modified anyway. - Object.freeze(graphItem); - } - - // Since entities can often be long IRIs, we avoid storing them in every index. - // Instead, we have a separate index that maps entities to numbers, - // which are then used as keys in the other indexes. - var entities = this._entities; - subject = entities[subject] || (entities[subject] = ++this._entityCount); - predicate = entities[predicate] || (entities[predicate] = ++this._entityCount); - object = entities[object] || (entities[object] = ++this._entityCount); - - this._addToIndex(graphItem.subjects, subject, predicate, object); - this._addToIndex(graphItem.predicates, predicate, object, subject); - this._addToIndex(graphItem.objects, object, subject, predicate); - - // The cached triple count is now invalid. - this._size = null; - }, - - // ### `addTriples` adds multiple N3 triples to the store. - addTriples: function (triples) { - for (var i = triples.length - 1; i >= 0; i--) - this.addTriple(triples[i]); - }, - - // ### `addPrefix` adds support for querying with the given prefix - addPrefix: function (prefix, iri) { - this._prefixes[prefix] = iri; - }, - - // ### `addPrefixes` adds support for querying with the given prefixes - addPrefixes: function (prefixes) { - for (var prefix in prefixes) - this.addPrefix(prefix, prefixes[prefix]); - }, - - // ### `removeTriple` removes an N3 triple from the store if it exists. - removeTriple: function (subject, predicate, object, graph) { - // Shift arguments if a triple object is given instead of components. - if (!predicate) - graph = subject.graph, object = subject.object, - predicate = subject.predicate, subject = subject.subject; - graph = graph || ''; - - // Find internal identifiers for all components. - var graphItem, entities = this._entities, graphs = this._graphs; - if (!(subject = entities[subject])) return; - if (!(predicate = entities[predicate])) return; - if (!(object = entities[object])) return; - if (!(graphItem = graphs[graph])) return; - - // Verify that the triple exists. - var subjects, predicates; - if (!(subjects = graphItem.subjects[subject])) return; - if (!(predicates = subjects[predicate])) return; - if (!(object in predicates)) return; - - // Remove it from all indexes. - this._removeFromIndex(graphItem.subjects, subject, predicate, object); - this._removeFromIndex(graphItem.predicates, predicate, object, subject); - this._removeFromIndex(graphItem.objects, object, subject, predicate); - if (this._size !== null) this._size--; - - // Remove the graph if it is empty. - for (subject in graphItem.subjects) return; - delete graphs[graph]; - }, - - // ### `removeTriples` removes multiple N3 triples from the store. - removeTriples: function (triples) { - for (var i = triples.length - 1; i >= 0; i--) - this.removeTriple(triples[i]); - }, - - // ### `find` finds a set of triples matching a pattern, expanding prefixes as necessary. - // Setting `subject`, `predicate`, or `object` to `null` means an _anything_ wildcard. - // Setting `graph` to `null` means the default graph. - find: function (subject, predicate, object, graph) { - var prefixes = this._prefixes; - return this.findByIRI( - expandPrefixedName(subject, prefixes), - expandPrefixedName(predicate, prefixes), - expandPrefixedName(object, prefixes), - expandPrefixedName(graph, prefixes) - ); - }, - - // ### `findByIRI` finds a set of triples matching a pattern. - // Setting `subject`, `predicate`, or `object` to a falsy value means an _anything_ wildcard. - // Setting `graph` to a falsy value means the default graph. - findByIRI: function (subject, predicate, object, graph) { - graph = graph || ''; - var graphItem = this._graphs[graph], entities = this._entities; - - // If the specified graph contain no triples, there are no results. - if (!graphItem) return []; - - // Translate IRIs to internal index keys. - // Optimization: if the entity doesn't exist, no triples with it exist. - if (subject && !(subject = entities[subject])) return []; - if (predicate && !(predicate = entities[predicate])) return []; - if (object && !(object = entities[object])) return []; - - // Choose the optimal index, based on what fields are present - if (subject) { - if (object) - // If subject and object are given, the object index will be the fastest. - return this._findInIndex(graphItem.objects, object, subject, predicate, - 'object', 'subject', 'predicate', graph); - else - // If only subject and possibly predicate are given, the subject index will be the fastest. - return this._findInIndex(graphItem.subjects, subject, predicate, null, - 'subject', 'predicate', 'object', graph); - } - else if (predicate) - // If only predicate and possibly object are given, the predicate index will be the fastest. - return this._findInIndex(graphItem.predicates, predicate, object, null, - 'predicate', 'object', 'subject', graph); - else if (object) - // If only object is given, the object index will be the fastest. - return this._findInIndex(graphItem.objects, object, null, null, - 'object', 'subject', 'predicate', graph); - else - // If nothing is given, iterate subjects and predicates first - return this._findInIndex(graphItem.subjects, null, null, null, - 'subject', 'predicate', 'object', graph); - }, - - // ### `count` returns the number of triples matching a pattern, expanding prefixes as necessary. - // Setting `subject`, `predicate`, or `object` to `null` means an _anything_ wildcard. - // Setting `graph` to `null` means the default graph. - count: function (subject, predicate, object, graph) { - var prefixes = this._prefixes; - return this.countByIRI( - expandPrefixedName(subject, prefixes), - expandPrefixedName(predicate, prefixes), - expandPrefixedName(object, prefixes), - expandPrefixedName(graph, prefixes) - ); - }, - - // ### `countByIRI` returns the number of triples matching a pattern. - // Setting `subject`, `predicate`, or `object` to `null` means an _anything_ wildcard. - // Setting `graph` to `null` means the default graph. - countByIRI: function (subject, predicate, object, graph) { - graph = graph || ''; - var graphItem = this._graphs[graph], entities = this._entities; - - // If the specified graph contain no triples, there are no results. - if (!graphItem) return 0; - - // Translate IRIs to internal index keys. - // Optimization: if the entity doesn't exist, no triples with it exist. - if (subject && !(subject = entities[subject])) return 0; - if (predicate && !(predicate = entities[predicate])) return 0; - if (object && !(object = entities[object])) return 0; - - // Choose the optimal index, based on what fields are present - if (subject) { - if (object) - // If subject and object are given, the object index will be the fastest. - return this._countInIndex(graphItem.objects, object, subject, predicate); - else - // If only subject and possibly predicate are given, the subject index will be the fastest. - return this._countInIndex(graphItem.subjects, subject, predicate, object); - } - else if (predicate) { - // If only predicate and possibly object are given, the predicate index will be the fastest. - return this._countInIndex(graphItem.predicates, predicate, object, subject); - } - else { - // If only object is possibly given, the object index will be the fastest. - return this._countInIndex(graphItem.objects, object, subject, predicate); - } - }, - - // ### `createBlankNode` creates a new blank node, returning its name. - createBlankNode: function (suggestedName) { - var name; - if (suggestedName) { - name = suggestedName = '_:' + suggestedName; - var index = 1; - while (this._entities[name]) - name = suggestedName + index++; - } - else { - do { name = '_:b' + this._blankNodeIndex++; } - while (this._entities[name]); - } - this._entities[name] = this._entityCount++; - return name; - }, -}; - -// ## Exports - -// Export the `N3Store` class as a whole. -module.exports = N3Store; - -},{"./N3Util":8}],6:[function(require,module,exports){ -// **N3StreamParser** parses an N3 stream into a triple stream -var Transform = require('stream').Transform, - util = require('util'), - N3Parser = require('./N3Parser.js'); - -// ## Constructor -function N3StreamParser(options) { - if (!(this instanceof N3StreamParser)) - return new N3StreamParser(options); - - // Initialize Transform base class - Transform.call(this, { decodeStrings: true }); - this._readableState.objectMode = true; - - // Set up parser - var self = this, parser = new N3Parser(options); - parser.parse( - // Handle triples by pushing them down the pipeline - function (error, triple) { - triple && self.push(triple) || - error && self.emit('error', error); - }, - // Emit prefixes through the `prefix` event - this.emit.bind(this, 'prefix')); - - // Implement Transform methods on top of parser - this._transform = function (chunk, encoding, done) { parser.addChunk(chunk); done(); }; - this._flush = function (done) { parser.end(); done(); }; -} -util.inherits(N3StreamParser, Transform); - -// ## Exports -// Export the `N3StreamParser` class as a whole. -module.exports = N3StreamParser; - -},{"./N3Parser.js":4,"stream":29,"util":32}],7:[function(require,module,exports){ -// **N3StreamWriter** serializes a triple stream into an N3 stream -var Transform = require('stream').Transform, - util = require('util'), - N3Writer = require('./N3Writer.js'); - -// ## Constructor -function N3StreamWriter(options) { - if (!(this instanceof N3StreamWriter)) - return new N3StreamWriter(options); - - // Initialize Transform base class - Transform.call(this, { encoding: 'utf8' }); - this._writableState.objectMode = true; - - // Set up writer with a dummy stream object - var self = this; - var writer = new N3Writer({ - write: function (chunk, encoding, callback) { self.push(chunk); callback && callback(); }, - end: function (callback) { self.push(null); callback && callback(); }, - }, options); - - // Implement Transform methods on top of writer - this._transform = function (triple, encoding, done) { writer.addTriple(triple, done); }; - this._flush = function (done) { writer.end(done); }; -} -util.inherits(N3StreamWriter, Transform); - -// ## Exports -// Export the `N3StreamWriter` class as a whole. -module.exports = N3StreamWriter; - -},{"./N3Writer.js":9,"stream":29,"util":32}],8:[function(require,module,exports){ -// **N3Util** provides N3 utility functions - -var Xsd = 'http://www.w3.org/2001/XMLSchema#'; -var XsdString = Xsd + 'string'; -var XsdInteger = Xsd + 'integer'; -var XsdDecimal = Xsd + 'decimal'; -var XsdBoolean = Xsd + 'boolean'; -var RdfLangString = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString'; - -var N3Util = { - // Tests whether the given entity (triple object) represents an IRI in the N3 library - isIRI: function (entity) { - if (!entity) - return entity; - var firstChar = entity[0]; - return firstChar !== '"' && firstChar !== '_'; - }, - - // Tests whether the given entity (triple object) represents a literal in the N3 library - isLiteral: function (entity) { - return entity && entity[0] === '"'; - }, - - // Tests whether the given entity (triple object) represents a blank node in the N3 library - isBlank: function (entity) { - return entity && entity.substr(0, 2) === '_:'; - }, - - // Gets the string value of a literal in the N3 library - getLiteralValue: function (literal) { - var match = /^"([^]*)"/.exec(literal); - if (!match) - throw new Error(literal + ' is not a literal'); - return match[1]; - }, - - // Gets the type of a literal in the N3 library - getLiteralType: function (literal) { - var match = /^"[^]*"(?:\^\^([^"]+)|(@)[^@"]+)?$/.exec(literal); - if (!match) - throw new Error(literal + ' is not a literal'); - return match[1] || (match[2] ? RdfLangString : XsdString); - }, - - // Gets the language of a literal in the N3 library - getLiteralLanguage: function (literal) { - var match = /^"[^]*"(?:@([^@"]+)|\^\^[^"]+)?$/.exec(literal); - if (!match) - throw new Error(literal + ' is not a literal'); - return match[1] ? match[1].toLowerCase() : ''; - }, - - // Tests whether the given entity (triple object) represents a prefixed name - isPrefixedName: function (entity) { - return entity && /^[^:\/"']*:[^:\/"']+$/.test(entity); - }, - - // Expands the prefixed name to a full IRI (also when it occurs as a literal's type) - expandPrefixedName: function (prefixedName, prefixes) { - var match = /(?:^|"\^\^)([^:\/#"'\^_]*):[^\/]*$/.exec(prefixedName), prefix, base, index; - if (match) - prefix = match[1], base = prefixes[prefix], index = match.index; - if (base === undefined) - return prefixedName; - - // The match index is non-zero when expanding a literal's type. - return index === 0 ? base + prefixedName.substr(prefix.length + 1) - : prefixedName.substr(0, index + 3) + - base + prefixedName.substr(index + prefix.length + 4); - }, - - // Creates an IRI in N3.js representation - createIRI: function (iri) { - return iri && iri[0] === '"' ? N3Util.getLiteralValue(iri) : iri; - }, - - // Creates a literal in N3.js representation - createLiteral: function (value, modifier) { - if (!modifier) { - switch (typeof value) { - case 'boolean': - modifier = XsdBoolean; - break; - case 'number': - if (isFinite(value)) { - modifier = value % 1 === 0 ? XsdInteger : XsdDecimal; - break; - } - default: - return '"' + value + '"'; - } - } - return '"' + value + - (/^[a-z]+(-[a-z0-9]+)*$/i.test(modifier) ? '"@' + modifier.toLowerCase() - : '"^^' + modifier); - }, -}; - -// Add the N3Util functions to the given object or its prototype -function AddN3Util(parent, toPrototype) { - for (var name in N3Util) - if (!toPrototype) - parent[name] = N3Util[name]; - else - parent.prototype[name] = ApplyToThis(N3Util[name]); - - return parent; -} - -// Returns a function that applies `f` to the `this` object -function ApplyToThis(f) { - return function (a) { return f(this, a); }; -} - -// Expose N3Util, attaching all functions to it -module.exports = AddN3Util(AddN3Util); - -},{}],9:[function(require,module,exports){ -// **N3Writer** writes N3 documents. - -// Matches a literal as represented in memory by the N3 library -var N3LiteralMatcher = /^"([^]*)"(?:\^\^(.+)|@([\-a-z]+))?$/i; - -// rdf:type predicate (for 'a' abbreviation) -var RDF_PREFIX = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', - RDF_TYPE = RDF_PREFIX + 'type'; - -// Characters in literals that require escaping -var escape = /["\\\t\n\r\b\f\u0000-\u0019\ud800-\udbff]/, - escapeAll = /["\\\t\n\r\b\f\u0000-\u0019]|[\ud800-\udbff][\udc00-\udfff]/g, - escapeReplacements = { '\\': '\\\\', '"': '\\"', '\t': '\\t', - '\n': '\\n', '\r': '\\r', '\b': '\\b', '\f': '\\f' }; - -// ## Constructor -function N3Writer(outputStream, options) { - if (!(this instanceof N3Writer)) - return new N3Writer(outputStream, options); - - // Shift arguments if the first argument is not a stream - if (outputStream && typeof outputStream.write !== 'function') - options = outputStream, outputStream = null; - options = options || {}; - - // If no output stream given, send the output as string through the end callback - if (!outputStream) { - var output = ''; - this._outputStream = { - write: function (chunk, encoding, done) { output += chunk; done && done(); }, - end: function (done) { done && done(null, output); }, - }; - this._endStream = true; - } - else { - this._outputStream = outputStream; - this._endStream = options.end === undefined ? true : !!options.end; + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF } - // Initialize writer, depending on the format - this._subject = null; - if (!(/triple|quad/i).test(options.format)) { - this._graph = ''; - this._prefixIRIs = Object.create(null); - options.prefixes && this.addPrefixes(options.prefixes); - } - else { - this._writeTriple = this._writeTripleLine; + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF } + + return arr } -N3Writer.prototype = { - // ## Private methods - - // ### `_write` writes the argument to the output stream - _write: function (string, callback) { - this._outputStream.write(string, 'utf8', callback); - }, - - // ### `_writeTriple` writes the triple to the output stream - _writeTriple: function (subject, predicate, object, graph, done) { - try { - // Write the graph's label if it has changed - if (this._graph !== graph) { - // Close the previous graph and start the new one - this._write((this._subject === null ? '' : (this._graph ? '\n}\n' : '.\n')) + - (graph ? this._encodeIriOrBlankNode(graph) + ' {\n' : '')); - this._graph = graph, this._subject = null; - } - // Don't repeat the subject if it's the same - if (this._subject === subject) { - // Don't repeat the predicate if it's the same - if (this._predicate === predicate) - this._write(', ' + this._encodeObject(object), done); - // Same subject, different predicate - else - this._write(';\n ' + - this._encodePredicate(this._predicate = predicate) + ' ' + - this._encodeObject(object), done); - } - // Different subject; write the whole triple - else - this._write((this._subject === null ? '' : '.\n') + - this._encodeSubject(this._subject = subject) + ' ' + - this._encodePredicate(this._predicate = predicate) + ' ' + - this._encodeObject(object), done); - } - catch (error) { done && done(error); } - }, - - // ### `_writeTripleLine` writes the triple or quad to the output stream as a single line - _writeTripleLine: function (subject, predicate, object, graph, done) { - // Don't use prefixes - delete this._prefixMatch; - // Write the triple - try { - this._write(this._encodeIriOrBlankNode(subject) + ' ' + - this._encodeIriOrBlankNode(predicate) + ' ' + - this._encodeObject(object) + - (graph ? ' ' + this._encodeIriOrBlankNode(graph) + '.\n' : '.\n'), done); - } - catch (error) { done && done(error); } - }, - - // ### `_encodeIriOrBlankNode` represents an IRI or blank node - _encodeIriOrBlankNode: function (iri) { - // A blank node is represented as-is - if (iri[0] === '_' && iri[1] === ':') return iri; - // Escape special characters - if (escape.test(iri)) - iri = iri.replace(escapeAll, characterReplacer); - // Try to represent the IRI as prefixed name - var prefixMatch = this._prefixRegex.exec(iri); - return !prefixMatch ? '<' + iri + '>' : - (!prefixMatch[1] ? iri : this._prefixIRIs[prefixMatch[1]] + prefixMatch[2]); - }, - - // ### `_encodeLiteral` represents a literal - _encodeLiteral: function (value, type, language) { - // Escape special characters - if (escape.test(value)) - value = value.replace(escapeAll, characterReplacer); - // Write the literal, possibly with type or language - if (language) - return '"' + value + '"@' + language; - else if (type) - return '"' + value + '"^^' + this._encodeIriOrBlankNode(type); - else - return '"' + value + '"'; - }, - - // ### `_encodeSubject` represents a subject - _encodeSubject: function (subject) { - if (subject[0] === '"') - throw new Error('A literal as subject is not allowed: ' + subject); - return this._encodeIriOrBlankNode(subject); - }, - - // ### `_encodePredicate` represents a predicate - _encodePredicate: function (predicate) { - if (predicate[0] === '"') - throw new Error('A literal as predicate is not allowed: ' + predicate); - return predicate === RDF_TYPE ? 'a' : this._encodeIriOrBlankNode(predicate); - }, - - // ### `_encodeObject` represents an object - _encodeObject: function (object) { - // Represent an IRI or blank node - if (object[0] !== '"') - return this._encodeIriOrBlankNode(object); - // Represent a literal - var match = N3LiteralMatcher.exec(object); - if (!match) throw new Error('Invalid literal: ' + object); - return this._encodeLiteral(match[1], match[2], match[3]); - }, - - // ### `_blockedWrite` replaces `_write` after the writer has been closed - _blockedWrite: function () { - throw new Error('Cannot write because the writer has been closed.'); - }, - - // ### `addTriple` adds the triple to the output stream - addTriple: function (subject, predicate, object, graph, done) { - // The triple was given as a triple object, so shift parameters - if (typeof object !== 'string') - this._writeTriple(subject.subject, subject.predicate, subject.object, - subject.graph || '', predicate); - // The optional `graph` parameter was not provided - else if (typeof graph !== 'string') - this._writeTriple(subject, predicate, object, '', graph); - // The `graph` parameter was provided - else - this._writeTriple(subject, predicate, object, graph, done); - }, - - // ### `addTriples` adds the triples to the output stream - addTriples: function (triples) { - for (var i = 0; i < triples.length; i++) - this.addTriple(triples[i]); - }, - - // ### `addPrefix` adds the prefix to the output stream - addPrefix: function (prefix, iri, done) { - var prefixes = {}; - prefixes[prefix] = iri; - this.addPrefixes(prefixes, done); - }, - - // ### `addPrefixes` adds the prefixes to the output stream - addPrefixes: function (prefixes, done) { - // Add all useful prefixes - var prefixIRIs = this._prefixIRIs, hasPrefixes = false; - for (var prefix in prefixes) { - // Verify whether the prefix can be used and does not exist yet - var iri = prefixes[prefix]; - if (/[#\/]$/.test(iri) && prefixIRIs[iri] !== (prefix += ':')) { - hasPrefixes = true; - prefixIRIs[iri] = prefix; - // Finish a possible pending triple - if (this._subject !== null) { - this._write(this._graph ? '\n}\n' : '.\n'); - this._subject = null, this._graph = ''; - } - // Write prefix - this._write('@prefix ' + prefix + ' <' + iri + '>.\n'); - } - } - // Recreate the prefix matcher - if (hasPrefixes) { - var IRIlist = '', prefixList = ''; - for (var prefixIRI in prefixIRIs) { - IRIlist += IRIlist ? '|' + prefixIRI : prefixIRI; - prefixList += (prefixList ? '|' : '') + prefixIRIs[prefixIRI]; - } - IRIlist = IRIlist.replace(/[\]\/\(\)\*\+\?\.\\\$]/g, '\\$&'); - this._prefixRegex = new RegExp('^(?:' + prefixList + ')[^\/]*$|' + - '^(' + IRIlist + ')([a-zA-Z][\\-_a-zA-Z0-9]*)$'); - } - // End a prefix block with a newline - this._write(hasPrefixes ? '\n' : '', done); - }, - - // ### `_prefixRegex` matches a prefixed name or IRI that begins with one of the added prefixes - _prefixRegex: /$0^/, - - // ### `end` signals the end of the output stream - end: function (done) { - // Finish a possible pending triple - if (this._subject !== null) { - this._write(this._graph ? '\n}\n' : '.\n'); - this._subject = null; - } - // Disallow further writing - this._write = this._blockedWrite; - - // Try to end the underlying stream, ensuring done is called exactly one time - var singleDone = done && function (error, result) { singleDone = null, done(error, result); }; - if (this._endStream) { - try { return this._outputStream.end(singleDone); } - catch (error) { /* error closing stream */ } - } - singleDone && singleDone(); - }, -}; - -// Replaces a character by its escaped version -function characterReplacer(character) { - // Replace a single character by its escaped version - var result = escapeReplacements[character]; - if (result === undefined) { - // Replace a single character with its 4-bit unicode escape sequence - if (character.length === 1) { - result = character.charCodeAt(0).toString(16); - result = '\\u0000'.substr(0, 6 - result.length) + result; - } - // Replace a surrogate pair with its 8-bit unicode escape sequence - else { - result = ((character.charCodeAt(0) - 0xD800) * 0x400 + - character.charCodeAt(1) + 0x2400).toString(16); - result = '\\U00000000'.substr(0, 10 - result.length) + result; - } - } - return result; +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } -// ## Exports +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} -// Export the `N3Writer` class as a whole. -module.exports = N3Writer; +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 -},{}],10:[function(require,module,exports){ + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} + +},{}],2:[function(require,module,exports){ + +},{}],3:[function(require,module,exports){ +(function (global){ +'use strict'; + +var buffer = require('buffer'); +var Buffer = buffer.Buffer; +var SlowBuffer = buffer.SlowBuffer; +var MAX_LEN = buffer.kMaxLength || 2147483647; +exports.alloc = function alloc(size, fill, encoding) { + if (typeof Buffer.alloc === 'function') { + return Buffer.alloc(size, fill, encoding); + } + if (typeof encoding === 'number') { + throw new TypeError('encoding must not be number'); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + var enc = encoding; + var _fill = fill; + if (_fill === undefined) { + enc = undefined; + _fill = 0; + } + var buf = new Buffer(size); + if (typeof _fill === 'string') { + var fillBuf = new Buffer(_fill, enc); + var flen = fillBuf.length; + var i = -1; + while (++i < size) { + buf[i] = fillBuf[i % flen]; + } + } else { + buf.fill(_fill); + } + return buf; +} +exports.allocUnsafe = function allocUnsafe(size) { + if (typeof Buffer.allocUnsafe === 'function') { + return Buffer.allocUnsafe(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + return new Buffer(size); +} +exports.from = function from(value, encodingOrOffset, length) { + if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { + return Buffer.from(value, encodingOrOffset, length); + } + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number'); + } + if (typeof value === 'string') { + return new Buffer(value, encodingOrOffset); + } + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + var offset = encodingOrOffset; + if (arguments.length === 1) { + return new Buffer(value); + } + if (typeof offset === 'undefined') { + offset = 0; + } + var len = length; + if (typeof len === 'undefined') { + len = value.byteLength - offset; + } + if (offset >= value.byteLength) { + throw new RangeError('\'offset\' is out of bounds'); + } + if (len > value.byteLength - offset) { + throw new RangeError('\'length\' is out of bounds'); + } + return new Buffer(value.slice(offset, offset + len)); + } + if (Buffer.isBuffer(value)) { + var out = new Buffer(value.length); + value.copy(out, 0, 0, value.length); + return out; + } + if (value) { + if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { + return new Buffer(value); + } + if (value.type === 'Buffer' && Array.isArray(value.data)) { + return new Buffer(value.data); + } + } + + throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); +} +exports.allocUnsafeSlow = function allocUnsafeSlow(size) { + if (typeof Buffer.allocUnsafeSlow === 'function') { + return Buffer.allocUnsafeSlow(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size >= MAX_LEN) { + throw new RangeError('size is too large'); + } + return new SlowBuffer(size); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"buffer":4}],4:[function(require,module,exports){ +(function (global){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ +/* eslint-disable no-proto */ + +'use strict' var base64 = require('base64-js') var ieee754 = require('ieee754') -var isArray = require('is-array') +var isArray = require('isarray') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 -Buffer.poolSize = 8192 // not used by this implementation - -var kMaxLength = 0x3fffffff -var rootParent = {} /** * If `Buffer.TYPED_ARRAY_SUPPORT`: @@ -1937,144 +256,346 @@ var rootParent = {} * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * * Note: * - * - Implementation must support adding new properties to `Uint8Array` instances. - * Firefox 4-29 lacked support, fixed in Firefox 30+. - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - * - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will - * get the Object implementation, which is slower but will work correctly. + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. */ -Buffer.TYPED_ARRAY_SUPPORT = (function () { +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +/* + * Export kMaxLength after typed array support is determined. + */ +exports.kMaxLength = kMaxLength() + +function typedArraySupport () { try { - var buf = new ArrayBuffer(0) - var arr = new Uint8Array(buf) - arr.foo = function () { return 42 } - return 42 === arr.foo() && // typed array instances can be augmented + var arr = new Uint8Array(1) + arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} + return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } -})() +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer(length) + } + that.length = length + } + + return that +} /** - * Class: Buffer - * ============= + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. * - * The Buffer constructor returns instances of `Uint8Array` that are augmented - * with function properties for all the node `Buffer` API functions. We use - * `Uint8Array` so that square bracket notation works as expected -- it returns - * a single octet. - * - * By augmenting the instances, we can avoid modifying the `Uint8Array` - * prototype. + * The `Uint8Array` prototype remains unmodified. */ -function Buffer (subject, encoding, noZero) { - if (!(this instanceof Buffer)) - return new Buffer(subject, encoding, noZero) - var type = typeof subject +function Buffer (arg, encodingOrOffset, length) { + if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { + return new Buffer(arg, encodingOrOffset, length) + } - // Find the length - var length - if (type === 'number') - length = subject > 0 ? subject >>> 0 : 0 - else if (type === 'string') { - length = Buffer.byteLength(subject, encoding) - } else if (type === 'object' && subject !== null) { // assume object is array-like - if (subject.type === 'Buffer' && isArray(subject.data)) - subject = subject.data - length = +subject.length > 0 ? Math.floor(+subject.length) : 0 - } else - throw new TypeError('must start with number, buffer, array or string') + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) + } + return allocUnsafe(this, arg) + } + return from(this, arg, encodingOrOffset, length) +} - if (length > kMaxLength) - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength.toString(16) + ' bytes') +Buffer.poolSize = 8192 // not used by this implementation - var buf - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Preferred: Return an augmented `Uint8Array` instance for best performance - buf = Buffer._augment(new Uint8Array(length)) +// TODO: Legacy, not needed anymore. Remove in next major version. +Buffer._augment = function (arr) { + arr.__proto__ = Buffer.prototype + return arr +} + +function from (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer(that, value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(that, value, encodingOrOffset) + } + + return fromObject(that, value) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(null, value, encodingOrOffset, length) +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array + if (typeof Symbol !== 'undefined' && Symbol.species && + Buffer[Symbol.species] === Buffer) { + // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true + }) + } +} + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } +} + +function alloc (that, size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(that, size).fill(fill, encoding) + : createBuffer(that, size).fill(fill) + } + return createBuffer(that, size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(null, size, fill, encoding) +} + +function allocUnsafe (that, size) { + assertSize(size) + that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0 + } + } + return that +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(null, size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(null, size) +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength(string, encoding) | 0 + that = createBuffer(that, length) + + var actual = that.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual) + } + + return that +} + +function fromArrayLike (that, array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + that = createBuffer(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array, byteOffset, length) { + array.byteLength // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array) + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset) } else { - // Fallback: Return THIS instance of Buffer (created by `new`) - buf = this - buf.length = length - buf._isBuffer = true + array = new Uint8Array(array, byteOffset, length) } - var i - if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') { - // Speed optimization -- use set if we're copying from a typed array - buf._set(subject) - } else if (isArrayish(subject)) { - // Treat array-ish objects as a byte array - if (Buffer.isBuffer(subject)) { - for (i = 0; i < length; i++) - buf[i] = subject.readUInt8(i) - } else { - for (i = 0; i < length; i++) - buf[i] = ((subject[i] % 256) + 256) % 256 + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike(that, array) + } + return that +} + +function fromObject (that, obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + that = createBuffer(that, len) + + if (that.length === 0) { + return that } - } else if (type === 'string') { - buf.write(subject, 0, encoding) - } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) { - for (i = 0; i < length; i++) { - buf[i] = 0 + + obj.copy(that, 0, 0, len) + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan(obj.length)) { + return createBuffer(that, 0) + } + return fromArrayLike(that, obj) + } + + if (obj.type === 'Buffer' && isArray(obj.data)) { + return fromArrayLike(that, obj.data) } } - if (length > 0 && length <= Buffer.poolSize) - buf.parent = rootParent - - return buf + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } -function SlowBuffer(subject, encoding, noZero) { - if (!(this instanceof SlowBuffer)) - return new SlowBuffer(subject, encoding, noZero) - - var buf = new Buffer(subject, encoding, noZero) - delete buf.parent - return buf +function checked (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 } -Buffer.isBuffer = function (b) { +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { return !!(b != null && b._isBuffer) } -Buffer.compare = function (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 var x = a.length var y = b.length - for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {} - if (i !== len) { - x = a[i] - y = b[i] + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } } + if (x < y) return -1 if (y < x) return 1 return 0 } -Buffer.isEncoding = function (encoding) { +Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': + case 'latin1': case 'binary': case 'base64': - case 'raw': case 'ucs2': case 'ucs-2': case 'utf16le': @@ -2085,79 +606,117 @@ Buffer.isEncoding = function (encoding) { } } -Buffer.concat = function (list, totalLength) { - if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])') +Buffer.concat = function concat (list, length) { + if (!isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } if (list.length === 0) { - return new Buffer(0) - } else if (list.length === 1) { - return list[0] + return Buffer.alloc(0) } var i - if (totalLength === undefined) { - totalLength = 0 - for (i = 0; i < list.length; i++) { - totalLength += list[i].length + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length } } - var buf = new Buffer(totalLength) + var buffer = Buffer.allocUnsafe(length) var pos = 0 - for (i = 0; i < list.length; i++) { - var item = list[i] - item.copy(buf, pos) - pos += item.length + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length } - return buf + return buffer } -Buffer.byteLength = function (str, encoding) { - var ret - str = str + '' - switch (encoding || 'utf8') { - case 'ascii': - case 'binary': - case 'raw': - ret = str.length - break - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - ret = str.length * 2 - break - case 'hex': - ret = str.length >>> 1 - break - case 'utf8': - case 'utf-8': - ret = utf8ToBytes(str).length - break - case 'base64': - ret = base64ToBytes(str).length - break - default: - ret = str.length +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string + } + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } } - return ret } +Buffer.byteLength = byteLength -// pre-set for values that may exist in the future -Buffer.prototype.length = undefined -Buffer.prototype.parent = undefined - -// toString(encoding, start=0, end=buffer.length) -Buffer.prototype.toString = function (encoding, start, end) { +function slowToString (encoding, start, end) { var loweredCase = false - start = start >>> 0 - end = end === undefined || end === Infinity ? this.length : end >>> 0 + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } if (!encoding) encoding = 'utf8' - if (start < 0) start = 0 - if (end > this.length) end = this.length - if (end <= start) return '' while (true) { switch (encoding) { @@ -2171,8 +730,9 @@ Buffer.prototype.toString = function (encoding, start, end) { case 'ascii': return asciiSlice(this, start, end) + case 'latin1': case 'binary': - return binarySlice(this, start, end) + return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) @@ -2184,45 +744,274 @@ Buffer.prototype.toString = function (encoding, start, end) { return utf16leSlice(this, start, end) default: - if (loweredCase) - throw new TypeError('Unknown encoding: ' + encoding) + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } -Buffer.prototype.equals = function (b) { +// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect +// Buffer instances. +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true return Buffer.compare(this, b) === 0 } -Buffer.prototype.inspect = function () { +Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) - str += ' ... ' + if (this.length > max) str += ' ... ' } return '' } -Buffer.prototype.compare = function (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - return Buffer.compare(this, b) +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!Buffer.isBuffer(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 } -// `get` will be removed in Node 0.13+ -Buffer.prototype.get = function (offset) { - console.log('.get() is deprecated. Access using array indexes instead.') - return this.readUInt8(offset) +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (Buffer.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') } -// `set` will be removed in Node 0.13+ -Buffer.prototype.set = function (v, offset) { - console.log('.set() is deprecated. Access using array indexes instead.') - return this.writeUInt8(v, offset) +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite (buf, string, offset, length) { @@ -2239,105 +1028,112 @@ function hexWrite (buf, string, offset, length) { // must be an even number of digits var strLen = string.length - if (strLen % 2 !== 0) throw new Error('Invalid hex string') + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } - for (var i = 0; i < length; i++) { - var byte = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(byte)) throw new Error('Invalid hex string') - buf[offset + i] = byte + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) return i + buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { - var charsWritten = blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) - return charsWritten + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { - var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length) - return charsWritten + return blitBuffer(asciiToBytes(string), buf, offset, length) } -function binaryWrite (buf, string, offset, length) { +function latin1Write (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { - var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length) - return charsWritten + return blitBuffer(base64ToBytes(string), buf, offset, length) } -function utf16leWrite (buf, string, offset, length) { - var charsWritten = blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length, 2) - return charsWritten +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } -Buffer.prototype.write = function (string, offset, length, encoding) { - // Support both (string, offset, length, encoding) - // and the legacy (string, encoding, offset, length) - if (isFinite(offset)) { - if (!isFinite(length)) { +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { encoding = length length = undefined } - } else { // legacy - var swap = encoding - encoding = offset - offset = length - length = swap + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) } - offset = Number(offset) || 0 - - if (length < 0 || offset < 0 || offset > this.length) - throw new RangeError('attempt to write outside buffer bounds'); - var remaining = this.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true } } - encoding = String(encoding || 'utf8').toLowerCase() - - var ret - switch (encoding) { - case 'hex': - ret = hexWrite(this, string, offset, length) - break - case 'utf8': - case 'utf-8': - ret = utf8Write(this, string, offset, length) - break - case 'ascii': - ret = asciiWrite(this, string, offset, length) - break - case 'binary': - ret = binaryWrite(this, string, offset, length) - break - case 'base64': - ret = base64Write(this, string, offset, length) - break - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - ret = utf16leWrite(this, string, offset, length) - break - default: - throw new TypeError('Unknown encoding: ' + encoding) - } - return ret } -Buffer.prototype.toJSON = function () { +Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) @@ -2353,37 +1149,116 @@ function base64Slice (buf, start, end) { } function utf8Slice (buf, start, end) { - var res = '' - var tmp = '' end = Math.min(buf.length, end) + var res = [] - for (var i = start; i < end; i++) { - if (buf[i] <= 0x7F) { - res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i]) - tmp = '' - } else { - tmp += '%' + buf[i].toString(16) + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence } - return res + decodeUtf8Char(tmp) + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res } function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) - for (var i = start; i < end; i++) { + for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } -function binarySlice (buf, start, end) { +function latin1Slice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) - for (var i = start; i < end; i++) { + for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret @@ -2396,7 +1271,7 @@ function hexSlice (buf, start, end) { if (!end || end < 0 || end > len) end = len var out = '' - for (var i = start; i < end; i++) { + for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out @@ -2411,44 +1286,39 @@ function utf16leSlice (buf, start, end) { return res } -Buffer.prototype.slice = function (start, end) { +Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { - start += len; - if (start < 0) - start = 0 + start += len + if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len - if (end < 0) - end = 0 + if (end < 0) end = 0 } else if (end > len) { end = len } - if (end < start) - end = start + if (end < start) end = start var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = Buffer._augment(this.subarray(start, end)) + newBuf = this.subarray(start, end) + newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined, true) - for (var i = 0; i < sliceLen; i++) { + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; ++i) { newBuf[i] = this[i + start] } } - if (newBuf.length) - newBuf.parent = this.parent || this - return newBuf } @@ -2456,62 +1326,58 @@ Buffer.prototype.slice = function (start, end) { * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) - throw new RangeError('offset is not uint') - if (offset + ext > length) - throw new RangeError('Trying to access beyond buffer length') + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } -Buffer.prototype.readUIntLE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkOffset(offset, byteLength, this.length) +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 - while (++i < byteLength && (mul *= 0x100)) + while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul + } return val } -Buffer.prototype.readUIntBE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { checkOffset(offset, byteLength, this.length) + } var val = this[offset + --byteLength] var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) - val += this[offset + --byteLength] * mul; + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } return val } -Buffer.prototype.readUInt8 = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 1, this.length) +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } -Buffer.prototype.readUInt16LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } -Buffer.prototype.readUInt16BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } -Buffer.prototype.readUInt32LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | @@ -2519,541 +1385,497 @@ Buffer.prototype.readUInt32LE = function (offset, noAssert) { (this[offset + 3] * 0x1000000) } -Buffer.prototype.readUInt32BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) } -Buffer.prototype.readIntLE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkOffset(offset, byteLength, this.length) +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 - while (++i < byteLength && (mul *= 0x100)) + while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul + } mul *= 0x80 - if (val >= mul) - val -= Math.pow(2, 8 * byteLength) + if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } -Buffer.prototype.readIntBE = function (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkOffset(offset, byteLength, this.length) +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) + while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul + } mul *= 0x80 - if (val >= mul) - val -= Math.pow(2, 8 * byteLength) + if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } -Buffer.prototype.readInt8 = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) - return (this[offset]) +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } -Buffer.prototype.readInt16LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } -Buffer.prototype.readInt16BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 2, this.length) +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } -Buffer.prototype.readInt32LE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) } -Buffer.prototype.readInt32BE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) } -Buffer.prototype.readFloatLE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } -Buffer.prototype.readFloatBE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 4, this.length) +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } -Buffer.prototype.readDoubleLE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 8, this.length) +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } -Buffer.prototype.readDoubleBE = function (offset, noAssert) { - if (!noAssert) - checkOffset(offset, 8, this.length) +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') } -Buffer.prototype.writeUIntLE = function (value, offset, byteLength, noAssert) { +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } var mul = 1 var i = 0 this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) - this[offset + i] = (value / mul) >>> 0 & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } return offset + byteLength } -Buffer.prototype.writeUIntBE = function (value, offset, byteLength, noAssert) { +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) - checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) - this[offset + i] = (value / mul) >>> 0 & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } return offset + byteLength } -Buffer.prototype.writeUInt8 = function (value, offset, noAssert) { +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 1, 0xff, 0) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = value + this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } -Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) { +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0xffff, 0) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) - } else objectWriteUInt16(this, value, offset, true) + } else { + objectWriteUInt16(this, value, offset, true) + } return offset + 2 } -Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) { +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0xffff, 0) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) - this[offset + 1] = value - } else objectWriteUInt16(this, value, offset, false) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } -Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) { +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0xffffffff, 0) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) - this[offset] = value - } else objectWriteUInt32(this, value, offset, true) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } return offset + 4 } -Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) { +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0xffffffff, 0) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else objectWriteUInt32(this, value, offset, false) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } return offset + 4 } -Buffer.prototype.writeIntLE = function (value, offset, byteLength, noAssert) { +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value - offset = offset >>> 0 + offset = offset | 0 if (!noAssert) { - checkInt(this, - value, - offset, - byteLength, - Math.pow(2, 8 * byteLength - 1) - 1, - -Math.pow(2, 8 * byteLength - 1)) + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 - var sub = value < 0 ? 1 : 0 + var sub = 0 this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } return offset + byteLength } -Buffer.prototype.writeIntBE = function (value, offset, byteLength, noAssert) { +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value - offset = offset >>> 0 + offset = offset | 0 if (!noAssert) { - checkInt(this, - value, - offset, - byteLength, - Math.pow(2, 8 * byteLength - 1) - 1, - -Math.pow(2, 8 * byteLength - 1)) + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 - var sub = value < 0 ? 1 : 0 + var sub = 0 this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } return offset + byteLength } -Buffer.prototype.writeInt8 = function (value, offset, noAssert) { +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 1, 0x7f, -0x80) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 - this[offset] = value + this[offset] = (value & 0xff) return offset + 1 } -Buffer.prototype.writeInt16LE = function (value, offset, noAssert) { +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0x7fff, -0x8000) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) - } else objectWriteUInt16(this, value, offset, true) + } else { + objectWriteUInt16(this, value, offset, true) + } return offset + 2 } -Buffer.prototype.writeInt16BE = function (value, offset, noAssert) { +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 2, 0x7fff, -0x8000) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) - this[offset + 1] = value - } else objectWriteUInt16(this, value, offset, false) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } return offset + 2 } -Buffer.prototype.writeInt32LE = function (value, offset, noAssert) { +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) - } else objectWriteUInt32(this, value, offset, true) + } else { + objectWriteUInt32(this, value, offset, true) + } return offset + 4 } -Buffer.prototype.writeInt32BE = function (value, offset, noAssert) { +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value - offset = offset >>> 0 - if (!noAssert) - checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else objectWriteUInt32(this, value, offset, false) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - if (offset < 0) throw new RangeError('index out of range') + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) + if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } -Buffer.prototype.writeFloatLE = function (value, offset, noAssert) { +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } -Buffer.prototype.writeFloatBE = function (value, offset, noAssert) { +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) + if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } -Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) { +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } -Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) { +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function (target, target_start, start, end) { - var source = this - +Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!start) start = 0 if (!end && end !== 0) end = this.length - if (target_start >= target.length) target_start = target.length - if (!target_start) target_start = 0 + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 - if (target.length === 0 || source.length === 0) return 0 + if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions - if (target_start < 0) + if (targetStart < 0) { throw new RangeError('targetStart out of bounds') - if (start < 0 || start >= source.length) throw new RangeError('sourceStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? - if (end > this.length) - end = this.length - if (target.length - target_start < end - start) - end = target.length - target_start + start + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } var len = end - start + var i - if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < len; i++) { - target[i + target_start] = this[i + start] + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start] } } else { - target._set(this.subarray(start, start + len), target_start) + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ) } return len } -// fill(value, start=0, end=buffer.length) -Buffer.prototype.fill = function (value, start, end) { - if (!value) value = 0 - if (!start) start = 0 - if (!end) end = this.length +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if (code < 256) { + val = code + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255 + } - if (end < start) throw new RangeError('end < start') + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } - // Fill 0 bytes; we're done - if (end === start) return - if (this.length === 0) return + if (end <= start) { + return this + } - if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') - if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 var i - if (typeof value === 'number') { - for (i = start; i < end; i++) { - this[i] = value + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val } } else { - var bytes = utf8ToBytes(value.toString()) + var bytes = Buffer.isBuffer(val) + ? val + : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length - for (i = start; i < end; i++) { - this[i] = bytes[i % len] + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] } } return this } -/** - * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. - * Added in Node 0.12. Only available in browsers that support ArrayBuffer. - */ -Buffer.prototype.toArrayBuffer = function () { - if (typeof Uint8Array !== 'undefined') { - if (Buffer.TYPED_ARRAY_SUPPORT) { - return (new Buffer(this)).buffer - } else { - var buf = new Uint8Array(this.length) - for (var i = 0, len = buf.length; i < len; i += 1) { - buf[i] = this[i] - } - return buf.buffer - } - } else { - throw new TypeError('Buffer.toArrayBuffer not supported in this browser') - } -} - // HELPER FUNCTIONS // ================ -var BP = Buffer.prototype - -/** - * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods - */ -Buffer._augment = function (arr) { - arr.constructor = Buffer - arr._isBuffer = true - - // save reference to original Uint8Array get/set methods before overwriting - arr._get = arr.get - arr._set = arr.set - - // deprecated, will be removed in node 0.13+ - arr.get = BP.get - arr.set = BP.set - - arr.write = BP.write - arr.toString = BP.toString - arr.toLocaleString = BP.toString - arr.toJSON = BP.toJSON - arr.equals = BP.equals - arr.compare = BP.compare - arr.copy = BP.copy - arr.slice = BP.slice - arr.readUIntLE = BP.readUIntLE - arr.readUIntBE = BP.readUIntBE - arr.readUInt8 = BP.readUInt8 - arr.readUInt16LE = BP.readUInt16LE - arr.readUInt16BE = BP.readUInt16BE - arr.readUInt32LE = BP.readUInt32LE - arr.readUInt32BE = BP.readUInt32BE - arr.readIntLE = BP.readIntLE - arr.readIntBE = BP.readIntBE - arr.readInt8 = BP.readInt8 - arr.readInt16LE = BP.readInt16LE - arr.readInt16BE = BP.readInt16BE - arr.readInt32LE = BP.readInt32LE - arr.readInt32BE = BP.readInt32BE - arr.readFloatLE = BP.readFloatLE - arr.readFloatBE = BP.readFloatBE - arr.readDoubleLE = BP.readDoubleLE - arr.readDoubleBE = BP.readDoubleBE - arr.writeUInt8 = BP.writeUInt8 - arr.writeUIntLE = BP.writeUIntLE - arr.writeUIntBE = BP.writeUIntBE - arr.writeUInt16LE = BP.writeUInt16LE - arr.writeUInt16BE = BP.writeUInt16BE - arr.writeUInt32LE = BP.writeUInt32LE - arr.writeUInt32BE = BP.writeUInt32BE - arr.writeIntLE = BP.writeIntLE - arr.writeIntBE = BP.writeIntBE - arr.writeInt8 = BP.writeInt8 - arr.writeInt16LE = BP.writeInt16LE - arr.writeInt16BE = BP.writeInt16BE - arr.writeInt32LE = BP.writeInt32LE - arr.writeInt32BE = BP.writeInt32BE - arr.writeFloatLE = BP.writeFloatLE - arr.writeFloatBE = BP.writeFloatBE - arr.writeDoubleLE = BP.writeDoubleLE - arr.writeDoubleBE = BP.writeDoubleBE - arr.fill = BP.fill - arr.inspect = BP.inspect - arr.toArrayBuffer = BP.toArrayBuffer - - return arr -} - -var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not @@ -3072,106 +1894,84 @@ function stringtrim (str) { return str.replace(/^\s+|\s+$/g, '') } -function isArrayish (subject) { - return isArray(subject) || Buffer.isBuffer(subject) || - subject && typeof subject === 'object' && - typeof subject.length === 'number' -} - function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } -function utf8ToBytes(string, units) { - var codePoint, length = string.length - var leadSurrogate = null +function utf8ToBytes (string, units) { units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null var bytes = [] - var i = 0 - for (; i 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (leadSurrogate) { - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } - - // valid surrogate pair - else { - codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 - leadSurrogate = null - } - } - - // no lead yet - else { - - // unexpected trail + if (!leadSurrogate) { + // no lead yet if (codePoint > 0xDBFF) { + // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue - } - - // unpaired lead - else if (i + 1 === length) { + } else if (i + 1 === length) { + // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead - else { - leadSurrogate = codePoint - continue - } + leadSurrogate = codePoint + + continue } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } - // valid bmp char, but last char was a lead - else if (leadSurrogate) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = null - } + leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) - } - else if (codePoint < 0x800) { + } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 - ); - } - else if (codePoint < 0x10000) { + ) + } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 - ); - } - else if (codePoint < 0x200000) { + ) + } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 - ); - } - else { + ) + } else { throw new Error('Invalid code point') } } @@ -3181,7 +1981,7 @@ function utf8ToBytes(string, units) { function asciiToBytes (str) { var byteArray = [] - for (var i = 0; i < str.length; i++) { + for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } @@ -3191,8 +1991,7 @@ function asciiToBytes (str) { function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] - for (var i = 0; i < str.length; i++) { - + for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) @@ -3209,272 +2008,131 @@ function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } -function blitBuffer (src, dst, offset, length, unitSize) { - if (unitSize) length -= length % unitSize; - for (var i = 0; i < length; i++) { - if ((i + offset >= dst.length) || (i >= src.length)) - break +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } -function decodeUtf8Char (str) { - try { - return decodeURIComponent(str) - } catch (err) { - return String.fromCharCode(0xFFFD) // UTF 8 invalid char - } +function isnan (val) { + return val !== val // eslint-disable-line no-self-compare } -},{"base64-js":11,"ieee754":12,"is-array":13}],11:[function(require,module,exports){ -var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":1,"ieee754":7,"isarray":10}],5:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. -;(function (exports) { - 'use strict'; +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. - var Arr = (typeof Uint8Array !== 'undefined') - ? Uint8Array - : Array - - var PLUS = '+'.charCodeAt(0) - var SLASH = '/'.charCodeAt(0) - var NUMBER = '0'.charCodeAt(0) - var LOWER = 'a'.charCodeAt(0) - var UPPER = 'A'.charCodeAt(0) - var PLUS_URL_SAFE = '-'.charCodeAt(0) - var SLASH_URL_SAFE = '_'.charCodeAt(0) - - function decode (elt) { - var code = elt.charCodeAt(0) - if (code === PLUS || - code === PLUS_URL_SAFE) - return 62 // '+' - if (code === SLASH || - code === SLASH_URL_SAFE) - return 63 // '/' - if (code < NUMBER) - return -1 //no match - if (code < NUMBER + 10) - return code - NUMBER + 26 + 26 - if (code < UPPER + 26) - return code - UPPER - if (code < LOWER + 26) - return code - LOWER + 26 - } - - function b64ToByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - - if (b64.length % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - var len = b64.length - placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(b64.length * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? b64.length - 4 : b64.length - - var L = 0 - - function push (v) { - arr[L++] = v - } - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) - push((tmp & 0xFF0000) >> 16) - push((tmp & 0xFF00) >> 8) - push(tmp & 0xFF) - } - - if (placeHolders === 2) { - tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) - push(tmp & 0xFF) - } else if (placeHolders === 1) { - tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) - push((tmp >> 8) & 0xFF) - push(tmp & 0xFF) - } - - return arr - } - - function uint8ToBase64 (uint8) { - var i, - extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes - output = "", - temp, length - - function encode (num) { - return lookup.charAt(num) - } - - function tripletToBase64 (num) { - return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) - } - - // go through the array every three bytes, we'll deal with trailing stuff later - for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { - temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output += tripletToBase64(temp) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - switch (extraBytes) { - case 1: - temp = uint8[uint8.length - 1] - output += encode(temp >> 2) - output += encode((temp << 4) & 0x3F) - output += '==' - break - case 2: - temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) - output += encode(temp >> 10) - output += encode((temp >> 4) & 0x3F) - output += encode((temp << 2) & 0x3F) - output += '=' - break - } - - return output - } - - exports.toByteArray = b64ToByteArray - exports.fromByteArray = uint8ToBase64 -}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) - -},{}],12:[function(require,module,exports){ -exports.read = function(buffer, offset, isLE, mLen, nBytes) { - var e, m, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - nBits = -7, - i = isLE ? (nBytes - 1) : 0, - d = isLE ? -1 : 1, - s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8); - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8); - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity); - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); -}; + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; -exports.write = function(buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), - i = isLE ? 0 : (nBytes - 1), - d = isLE ? 1 : -1, - s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; - value = Math.abs(value); +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8); +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8); +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; - buffer[offset + i - d] |= s * 128; -}; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; -},{}],13:[function(require,module,exports){ +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; -/** - * isArray - */ +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; -var isArray = Array.isArray; +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; -/** - * toString - */ +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; -var str = Object.prototype.toString; +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; -/** - * Whether or not the given `val` - * is an array. - * - * example: - * - * isArray([]); - * // > true - * isArray(arguments); - * // > false - * isArray(''); - * // > false - * - * @param {mixed} val - * @return {bool} - */ +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; -module.exports = isArray || function (val) { - return !! val && '[object Array]' == str.call(val); -}; +exports.isBuffer = Buffer.isBuffer; -},{}],14:[function(require,module,exports){ +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":9}],6:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -3534,8 +2192,12 @@ EventEmitter.prototype.emit = function(type) { er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; } - throw TypeError('Uncaught, unspecified "error" event.'); } } @@ -3558,18 +2220,11 @@ EventEmitter.prototype.emit = function(type) { break; // slower default: - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; + args = Array.prototype.slice.call(arguments, 1); handler.apply(this, args); } } else if (isObject(handler)) { - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - + args = Array.prototype.slice.call(arguments, 1); listeners = handler.slice(); len = listeners.length; for (i = 0; i < len; i++) @@ -3607,7 +2262,6 @@ EventEmitter.prototype.addListener = function(type, listener) { // Check for listener leak if (isObject(this._events[type]) && !this._events[type].warned) { - var m; if (!isUndefined(this._maxListeners)) { m = this._maxListeners; } else { @@ -3729,7 +2383,7 @@ EventEmitter.prototype.removeAllListeners = function(type) { if (isFunction(listeners)) { this.removeListener(type, listeners); - } else { + } else if (listeners) { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); @@ -3750,15 +2404,20 @@ EventEmitter.prototype.listeners = function(type) { return ret; }; +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; + + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; + EventEmitter.listenerCount = function(emitter, type) { - var ret; - if (!emitter._events || !emitter._events[type]) - ret = 0; - else if (isFunction(emitter._events[type])) - ret = 1; - else - ret = emitter._events[type].length; - return ret; + return emitter.listenerCount(type); }; function isFunction(arg) { @@ -3777,7 +2436,93 @@ function isUndefined(arg) { return arg === void 0; } -},{}],15:[function(require,module,exports){ +},{}],7:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],8:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { @@ -3802,48 +2547,244 @@ if (typeof Object.create === 'function') { } } -},{}],16:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + +},{}],10:[function(require,module,exports){ +var toString = {}.toString; + module.exports = Array.isArray || function (arr) { - return Object.prototype.toString.call(arr) == '[object Array]'; + return toString.call(arr) == '[object Array]'; }; -},{}],17:[function(require,module,exports){ -// shim for using process in browser +},{}],11:[function(require,module,exports){ +(function (process){ +'use strict'; +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + +}).call(this,require('_process')) +},{"_process":12}],12:[function(require,module,exports){ +// shim for using process in browser var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} var queue = []; var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} function drainQueue() { if (draining) { return; } + var timeout = runTimeout(cleanUpNextTick); draining = true; - var currentQueue; + var len = queue.length; while(len) { currentQueue = queue; queue = []; - var i = -1; - while (++i < len) { - currentQueue[i](); + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } } + queueIndex = -1; len = queue.length; } + currentQueue = null; draining = false; + runClearTimeout(timeout); } + process.nextTick = function (fun) { - queue.push(fun); - if (!draining) { - setTimeout(drainQueue, 0); + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); } }; +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues +process.versions = {}; function noop() {} @@ -3859,55 +2800,39 @@ process.binding = function (name) { throw new Error('process.binding is not supported'); }; -// TODO(shtylman) process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; -},{}],18:[function(require,module,exports){ +},{}],13:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":19}],19:[function(require,module,exports){ -(function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - +},{"./lib/_stream_duplex.js":14}],14:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. +'use strict'; + +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + module.exports = Duplex; /**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) keys.push(key); - return keys; -} +var processNextTick = require('process-nextick-args'); /**/ - /**/ var util = require('core-util-is'); util.inherits = require('inherits'); @@ -3918,27 +2843,24 @@ var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); -forEach(objectKeys(Writable.prototype), function(method) { - if (!Duplex.prototype[method]) - Duplex.prototype[method] = Writable.prototype[method]; -}); +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; +} function Duplex(options) { - if (!(this instanceof Duplex)) - return new Duplex(options); + if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); - if (options && options.readable === false) - this.readable = false; + if (options && options.readable === false) this.readable = false; - if (options && options.writable === false) - this.writable = false; + if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) - this.allowHalfOpen = false; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } @@ -3947,47 +2869,29 @@ function Duplex(options) { function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) - return; + if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. - process.nextTick(this.end.bind(this)); + processNextTick(onEndNT, this); } -function forEach (xs, f) { +function onEndNT(self) { + self.end(); +} + +function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } - -}).call(this,require('_process')) -},{"./_stream_readable":21,"./_stream_writable":23,"_process":17,"core-util-is":24,"inherits":15}],20:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - +},{"./_stream_readable":16,"./_stream_writable":18,"core-util-is":5,"inherits":8,"process-nextick-args":11}],15:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. +'use strict'; + module.exports = PassThrough; var Transform = require('./_stream_transform'); @@ -4000,99 +2904,126 @@ util.inherits = require('inherits'); util.inherits(PassThrough, Transform); function PassThrough(options) { - if (!(this instanceof PassThrough)) - return new PassThrough(options); + if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } -PassThrough.prototype._transform = function(chunk, encoding, cb) { +PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; - -},{"./_stream_transform":22,"core-util-is":24,"inherits":15}],21:[function(require,module,exports){ +},{"./_stream_transform":17,"core-util-is":5,"inherits":8}],16:[function(require,module,exports){ (function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. +'use strict'; module.exports = Readable; +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + /**/ var isArray = require('isarray'); /**/ - /**/ -var Buffer = require('buffer').Buffer; +var Duplex; /**/ Readable.ReadableState = ReadableState; +/**/ var EE = require('events').EventEmitter; -/**/ -if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { +var EElistenerCount = function (emitter, type) { return emitter.listeners(type).length; }; /**/ -var Stream = require('stream'); +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ + +var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); var StringDecoder; util.inherits(Readable, Stream); +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + } +} + function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; - this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. - this.highWaterMark = ~~this.highWaterMark; + this.highWaterMark = ~ ~this.highWaterMark; - this.buffer = []; + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); this.length = 0; this.pipes = null; this.pipesCount = 0; - this.flowing = false; + this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; - // In streams that never have any data, and do push(null) right away, - // the consumer can miss the 'end' event if they do some I/O before - // consuming the stream. So, we don't emit('end') until some reading - // happens. - this.calledRead = false; - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, becuase any + // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; @@ -4102,11 +3033,7 @@ function ReadableState(options, stream) { this.needReadable = false; this.emittedReadable = false; this.readableListening = false; - - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; + this.resumeScheduled = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. @@ -4126,22 +3053,24 @@ function ReadableState(options, stream) { this.decoder = null; this.encoding = null; if (options.encoding) { - if (!StringDecoder) - StringDecoder = require('string_decoder/').StringDecoder; + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { - if (!(this instanceof Readable)) - return new Readable(options); + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; + if (options && typeof options.read === 'function') this._read = options.read; + Stream.call(this); } @@ -4149,13 +3078,13 @@ function Readable(options) { // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. -Readable.prototype.push = function(chunk, encoding) { +Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; - if (typeof chunk === 'string' && !state.objectMode) { + if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { - chunk = new Buffer(chunk, encoding); + chunk = bufferShim.from(chunk, encoding); encoding = ''; } } @@ -4164,41 +3093,53 @@ Readable.prototype.push = function(chunk, encoding) { }; // Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function(chunk) { +Readable.prototype.unshift = function (chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); - } else if (chunk === null || chunk === undefined) { + } else if (chunk === null) { state.reading = false; - if (!state.ended) - onEofChunk(stream, state); + onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { - var e = new Error('stream.unshift() after end event'); - stream.emit('error', e); + var _e = new Error('stream.unshift() after end event'); + stream.emit('error', _e); } else { - if (state.decoder && !addToFront && !encoding) + var skipAdd; + if (state.decoder && !addToFront && !encoding) { chunk = state.decoder.write(chunk); - - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) { - state.buffer.unshift(chunk); - } else { - state.reading = false; - state.buffer.push(chunk); + skipAdd = !state.objectMode && chunk.length === 0; } - if (state.needReadable) - emitReadable(stream); + if (!addToFront) state.reading = false; + + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + } maybeReadMore(stream, state); } @@ -4209,8 +3150,6 @@ function readableAddChunk(stream, state, chunk, encoding, addToFront) { return needMoreData(state); } - - // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, @@ -4219,88 +3158,71 @@ function readableAddChunk(stream, state, chunk, encoding, addToFront) { // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { - return !state.ended && - (state.needReadable || - state.length < state.highWaterMark || - state.length === 0); + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. -Readable.prototype.setEncoding = function(enc) { - if (!StringDecoder) - StringDecoder = require('string_decoder/').StringDecoder; +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; + return this; }; -// Don't raise the hwm > 128MB +// Don't raise the hwm > 8MB var MAX_HWM = 0x800000; -function roundUpToNextPowerOf2(n) { +function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { - // Get the next highest power of 2 + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts n--; - for (var p = 1; p < 32; p <<= 1) n |= n >> p; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; n++; } return n; } +// This function is designed to be inlinable, so please take care when making +// changes to the function body. function howMuchToRead(n, state) { - if (state.length === 0 && state.ended) - return 0; - - if (state.objectMode) - return n === 0 ? 0 : 1; - - if (n === null || isNaN(n)) { - // only flow one buffer at a time - if (state.flowing && state.buffer.length) - return state.buffer[0].length; - else - return state.length; + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; } - - if (n <= 0) + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; return 0; - - // If we're asking for more than the target buffer level, - // then raise the water mark. Bump up to the next highest - // power of 2, to prevent increasing it excessively in tiny - // amounts. - if (n > state.highWaterMark) - state.highWaterMark = roundUpToNextPowerOf2(n); - - // don't have that much. return null, unless we've ended. - if (n > state.length) { - if (!state.ended) { - state.needReadable = true; - return 0; - } else - return state.length; } - - return n; + return state.length; } // you can override either this method, or the async _read(n) below. -Readable.prototype.read = function(n) { +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); var state = this._readableState; - state.calledRead = true; var nOrig = n; - var ret; - if (typeof n !== 'number' || n > 0) - state.emittedReadable = false; + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. - if (n === 0 && - state.needReadable && - (state.length >= state.highWaterMark || state.ended)) { - emitReadable(this); + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } @@ -4308,28 +3230,8 @@ Readable.prototype.read = function(n) { // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { - ret = null; - - // In cases where the decoder did not receive enough data - // to produce a full chunk, then immediately received an - // EOF, state.buffer will contain [, ]. - // howMuchToRead will see this and coerce the amount to - // read to zero (because it's looking at the length of the - // first in state.buffer), and we'll end up here. - // - // This can only happen via state.decoder -- no other venue - // exists for pushing a zero-length chunk into state.buffer - // and triggering this behavior. In this case, we return our - // remaining data and end the stream, if appropriate. - if (state.length > 0 && state.decoder) { - ret = fromList(n, state); - state.length -= ret.length; - } - - if (state.length === 0) - endReadable(this); - - return ret; + if (state.length === 0) endReadable(this); + return null; } // All the actual chunk generation logic needs to be @@ -4356,74 +3258,68 @@ Readable.prototype.read = function(n) { // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some - if (state.length - n <= state.highWaterMark) + if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; + debug('length less than watermark', doRead); + } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. - if (state.ended || state.reading) + if (state.ended || state.reading) { doRead = false; - - if (doRead) { + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) - state.needReadable = true; + if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); } - // If _read called its callback synchronously, then `reading` - // will be false, and we need to re-evaluate how much data we - // can return to the user. - if (doRead && !state.reading) - n = howMuchToRead(nOrig, state); - - if (n > 0) - ret = fromList(n, state); - else - ret = null; + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { state.needReadable = true; n = 0; + } else { + state.length -= n; } - state.length -= n; + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (state.length === 0 && !state.ended) - state.needReadable = true; + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } - // If we happened to read() exactly the remaining amount in the - // buffer, and the EOF has been seen at this point, then make sure - // that we emit 'end' on the very next tick. - if (state.ended && !state.endEmitted && state.length === 0) - endReadable(this); + if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; - if (!Buffer.isBuffer(chunk) && - 'string' !== typeof chunk && - chunk !== null && - chunk !== undefined && - !state.objectMode) { + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } - function onEofChunk(stream, state) { - if (state.decoder && !state.ended) { + if (state.ended) return; + if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); @@ -4432,12 +3328,8 @@ function onEofChunk(stream, state) { } state.ended = true; - // if we've ended and we have some data left, then emit - // 'readable' now to make sure it gets picked up. - if (state.length > 0) - emitReadable(stream); - else - endReadable(stream); + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger @@ -4446,23 +3338,19 @@ function onEofChunk(stream, state) { function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; - if (state.emittedReadable) - return; - - state.emittedReadable = true; - if (state.sync) - process.nextTick(function() { - emitReadable_(stream); - }); - else - emitReadable_(stream); + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); + } } function emitReadable_(stream) { + debug('emit readable'); stream.emit('readable'); + flow(stream); } - // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if @@ -4472,22 +3360,18 @@ function emitReadable_(stream) { function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; - process.nextTick(function() { - maybeReadMore_(stream, state); - }); + processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; - while (!state.reading && !state.flowing && !state.ended && - state.length < state.highWaterMark) { + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. - break; - else - len = state.length; + break;else len = state.length; } state.readingMore = false; } @@ -4496,11 +3380,11 @@ function maybeReadMore_(stream, state) { // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function(n) { - this.emit('error', new Error('not implemented')); +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); }; -Readable.prototype.pipe = function(dest, pipeOpts) { +Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; @@ -4516,24 +3400,23 @@ Readable.prototype.pipe = function(dest, pipeOpts) { break; } state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - var doEnd = (!pipeOpts || pipeOpts.end !== false) && - dest !== process.stdout && - dest !== process.stderr; + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) - process.nextTick(endFn); - else - src.once('end', endFn); + if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable) { - if (readable !== src) return; - cleanup(); + debug('onunpipe'); + if (readable === src) { + cleanup(); + } } function onend() { + debug('onend'); dest.end(); } @@ -4544,7 +3427,9 @@ Readable.prototype.pipe = function(dest, pipeOpts) { var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); + var cleanedUp = false; function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); @@ -4553,34 +3438,53 @@ Readable.prototype.pipe = function(dest, pipeOpts) { dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. - if (!dest._writableState || dest._writableState.needDrain) - ondrain(); + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { + debug('onerror', er); unpipe(); dest.removeListener('error', onerror); - if (EE.listenerCount(dest, 'error') === 0) - dest.emit('error', er); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); } - // This is a brutally ugly hack to make sure that our error handler - // is attached before any userland ones. NEVER DO THIS. - if (!dest._events || !dest._events.error) - dest.on('error', onerror); - else if (isArray(dest._events.error)) - dest._events.error.unshift(onerror); - else - dest._events.error = [onerror, dest._events.error]; - + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. function onclose() { @@ -4589,12 +3493,14 @@ Readable.prototype.pipe = function(dest, pipeOpts) { } dest.once('close', onclose); function onfinish() { + debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { + debug('unpipe'); src.unpipe(dest); } @@ -4603,106 +3509,43 @@ Readable.prototype.pipe = function(dest, pipeOpts) { // start the flow if it hasn't been started already. if (!state.flowing) { - // the handler that waits for readable events after all - // the data gets sucked out in flow. - // This would be easier to follow with a .once() handler - // in flow(), but that is too slow. - this.on('readable', pipeOnReadable); - - state.flowing = true; - process.nextTick(function() { - flow(src); - }); + debug('pipe resume'); + src.resume(); } return dest; }; function pipeOnDrain(src) { - return function() { - var dest = this; + return function () { var state = src._readableState; - state.awaitDrain--; - if (state.awaitDrain === 0) + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; flow(src); + } }; } -function flow(src) { - var state = src._readableState; - var chunk; - state.awaitDrain = 0; - - function write(dest, i, list) { - var written = dest.write(chunk); - if (false === written) { - state.awaitDrain++; - } - } - - while (state.pipesCount && null !== (chunk = src.read())) { - - if (state.pipesCount === 1) - write(state.pipes, 0, null); - else - forEach(state.pipes, write); - - src.emit('data', chunk); - - // if anyone needs a drain, then we have to wait for that. - if (state.awaitDrain > 0) - return; - } - - // if every destination was unpiped, either before entering this - // function, or in the while loop, then stop flowing. - // - // NB: This is a pretty rare edge case. - if (state.pipesCount === 0) { - state.flowing = false; - - // if there were data event listeners added, then switch to old mode. - if (EE.listenerCount(src, 'data') > 0) - emitDataEvents(src); - return; - } - - // at this point, no one needed a drain, so we just ran out of data - // on the next readable event, start it over again. - state.ranOut = true; -} - -function pipeOnReadable() { - if (this._readableState.ranOut) { - this._readableState.ranOut = false; - flow(this); - } -} - - -Readable.prototype.unpipe = function(dest) { +Readable.prototype.unpipe = function (dest) { var state = this._readableState; // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) - return this; + if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) - return this; + if (dest && dest !== state.pipes) return this; - if (!dest) - dest = state.pipes; + if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; - this.removeListener('readable', pipeOnReadable); state.flowing = false; - if (dest) - dest.emit('unpipe', this); + if (dest) dest.emit('unpipe', this); return this; } @@ -4714,23 +3557,20 @@ Readable.prototype.unpipe = function(dest) { var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; - this.removeListener('readable', pipeOnReadable); state.flowing = false; - for (var i = 0; i < len; i++) + for (var i = 0; i < len; i++) { dests[i].emit('unpipe', this); - return this; + }return this; } // try to find the right one. - var i = indexOf(state.pipes, dest); - if (i === -1) - return this; + var index = indexOf(state.pipes, dest); + if (index === -1) return this; - state.pipes.splice(i, 1); + state.pipes.splice(index, 1); state.pipesCount -= 1; - if (state.pipesCount === 1) - state.pipes = state.pipes[0]; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this); @@ -4739,20 +3579,19 @@ Readable.prototype.unpipe = function(dest) { // set up data events if they are asked for // Ensure readable listeners eventually get something -Readable.prototype.on = function(ev, fn) { +Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); - if (ev === 'data' && !this._readableState.flowing) - emitDataEvents(this); - - if (ev === 'readable' && this.readable) { + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { var state = this._readableState; - if (!state.readableListening) { - state.readableListening = true; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; state.emittedReadable = false; - state.needReadable = true; if (!state.reading) { - this.read(0); + processNextTick(nReadingNextTick, this); } else if (state.length) { emitReadable(this, state); } @@ -4763,96 +3602,83 @@ Readable.prototype.on = function(ev, fn) { }; Readable.prototype.addListener = Readable.prototype.on; +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. -Readable.prototype.resume = function() { - emitDataEvents(this); - this.read(0); - this.emit('resume'); +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; }; -Readable.prototype.pause = function() { - emitDataEvents(this, true); - this.emit('pause'); -}; +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + processNextTick(resume_, stream, state); + } +} -function emitDataEvents(stream, startPaused) { - var state = stream._readableState; - - if (state.flowing) { - // https://github.com/isaacs/readable-stream/issues/16 - throw new Error('Cannot switch to old mode now.'); +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); } - var paused = startPaused || false; - var readable = false; + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} - // convert to an old-style stream. - stream.readable = true; - stream.pipe = Stream.prototype.pipe; - stream.on = stream.addListener = Stream.prototype.on; - - stream.on('readable', function() { - readable = true; - - var c; - while (!paused && (null !== (c = stream.read()))) - stream.emit('data', c); - - if (c === null) { - readable = false; - stream._readableState.needReadable = true; - } - }); - - stream.pause = function() { - paused = true; +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; this.emit('pause'); - }; + } + return this; +}; - stream.resume = function() { - paused = false; - if (readable) - process.nextTick(function() { - stream.emit('readable'); - }); - else - this.read(0); - this.emit('resume'); - }; - - // now make it start, just in case it hadn't already. - stream.emit('readable'); +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function(stream) { +Readable.prototype.wrap = function (stream) { var state = this._readableState; var paused = false; var self = this; - stream.on('end', function() { + stream.on('end', function () { + debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); - if (chunk && chunk.length) - self.push(chunk); + if (chunk && chunk.length) self.push(chunk); } self.push(null); }); - stream.on('data', function(chunk) { - if (state.decoder) - chunk = state.decoder.write(chunk); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode - //if (state.objectMode && util.isNullOrUndefined(chunk)) - if (state.objectMode && (chunk === null || chunk === undefined)) - return; - else if (!state.objectMode && (!chunk || !chunk.length)) - return; + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = self.push(chunk); if (!ret) { @@ -4864,23 +3690,25 @@ Readable.prototype.wrap = function(stream) { // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { - if (typeof stream[i] === 'function' && - typeof this[i] === 'undefined') { - this[i] = function(method) { return function() { - return stream[method].apply(stream, arguments); - }}(i); + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); } } // proxy certain important events. var events = ['error', 'close', 'destroy', 'pause', 'resume']; - forEach(events, function(ev) { + forEach(events, function (ev) { stream.on(ev, self.emit.bind(self, ev)); }); // when we try to consume some more bytes, simply unpause the // underlying stream. - self._read = function(n) { + self._read = function (n) { + debug('wrapped _read', n); if (paused) { paused = false; stream.resume(); @@ -4890,135 +3718,145 @@ Readable.prototype.wrap = function(stream) { return self; }; - - // exposed for testing purposes only. Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. function fromList(n, state) { - var list = state.buffer; - var length = state.length; - var stringMode = !!state.decoder; - var objectMode = !!state.objectMode; + // nothing buffered + if (state.length === 0) return null; + var ret; - - // nothing in the list, definitely empty. - if (list.length === 0) - return null; - - if (length === 0) - ret = null; - else if (objectMode) - ret = list.shift(); - else if (!n || n >= length) { - // read it all, truncate the array. - if (stringMode) - ret = list.join(''); - else - ret = Buffer.concat(list, length); - list.length = 0; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); } else { - // read just some of it. - if (n < list[0].length) { - // just take a part of the first list item. - // slice is the same for buffers and strings. - var buf = list[0]; - ret = buf.slice(0, n); - list[0] = buf.slice(n); - } else if (n === list[0].length) { - // first list is a perfect match - ret = list.shift(); - } else { - // complex case. - // we have enough to cover it, but it spans past the first buffer. - if (stringMode) - ret = ''; - else - ret = new Buffer(n); - - var c = 0; - for (var i = 0, l = list.length; i < l && c < n; i++) { - var buf = list[0]; - var cpy = Math.min(n - c, buf.length); - - if (stringMode) - ret += buf.slice(0, cpy); - else - buf.copy(ret, c, 0, cpy); - - if (cpy < buf.length) - list[0] = buf.slice(cpy); - else - list.shift(); - - c += cpy; - } - } + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); } return ret; } +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = bufferShim.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. - if (state.length > 0) - throw new Error('endReadable called on non-empty stream'); + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - if (!state.endEmitted && state.calledRead) { + if (!state.endEmitted) { state.ended = true; - process.nextTick(function() { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } - }); + processNextTick(endReadableNT, state, stream); } } -function forEach (xs, f) { +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } -function indexOf (xs, x) { +function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } - }).call(this,require('_process')) -},{"_process":17,"buffer":10,"core-util-is":24,"events":14,"inherits":15,"isarray":16,"stream":29,"string_decoder/":30}],22:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - - +},{"./_stream_duplex":14,"./internal/streams/BufferList":19,"_process":12,"buffer":4,"buffer-shims":3,"core-util-is":5,"events":6,"inherits":8,"isarray":10,"process-nextick-args":11,"string_decoder/":25,"util":2}],17:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -5061,6 +3899,8 @@ function indexOf (xs, x) { // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. +'use strict'; + module.exports = Transform; var Duplex = require('./_stream_duplex'); @@ -5072,9 +3912,8 @@ util.inherits = require('inherits'); util.inherits(Transform, Duplex); - -function TransformState(options, stream) { - this.afterTransform = function(er, data) { +function TransformState(stream) { + this.afterTransform = function (er, data) { return afterTransform(stream, er, data); }; @@ -5082,6 +3921,7 @@ function TransformState(options, stream) { this.transforming = false; this.writecb = null; this.writechunk = null; + this.writeencoding = null; } function afterTransform(stream, er, data) { @@ -5090,17 +3930,14 @@ function afterTransform(stream, er, data) { var cb = ts.writecb; - if (!cb) - return stream.emit('error', new Error('no writecb in Transform class')); + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; - if (data !== null && data !== undefined) - stream.push(data); + if (data !== null && data !== undefined) stream.push(data); - if (cb) - cb(er); + cb(er); var rs = stream._readableState; rs.reading = false; @@ -5109,16 +3946,13 @@ function afterTransform(stream, er, data) { } } - function Transform(options) { - if (!(this instanceof Transform)) - return new Transform(options); + if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); - var ts = this._transformState = new TransformState(options, this); + this._transformState = new TransformState(this); - // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. @@ -5129,17 +3963,21 @@ function Transform(options) { // sync guard flag. this._readableState.sync = false; - this.once('finish', function() { - if ('function' === typeof this._flush) - this._flush(function(er) { - done(stream, er); - }); - else - done(stream); + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er, data) { + done(stream, er, data); + });else done(stream); }); } -Transform.prototype.push = function(chunk, encoding) { +Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; @@ -5154,28 +3992,25 @@ Transform.prototype.push = function(chunk, encoding) { // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function(chunk, encoding, cb) { - throw new Error('not implemented'); +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); }; -Transform.prototype._write = function(chunk, encoding, cb) { +Transform.prototype._write = function (chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; - if (ts.needTransform || - rs.needReadable || - rs.length < rs.highWaterMark) - this._read(rs.highWaterMark); + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. -Transform.prototype._read = function(n) { +Transform.prototype._read = function (n) { var ts = this._transformState; if (ts.writechunk !== null && ts.writecb && !ts.transforming) { @@ -5188,93 +4023,106 @@ Transform.prototype._read = function(n) { } }; +function done(stream, er, data) { + if (er) return stream.emit('error', er); -function done(stream, er) { - if (er) - return stream.emit('error', er); + if (data !== null && data !== undefined) stream.push(data); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; - var rs = stream._readableState; var ts = stream._transformState; - if (ws.length) - throw new Error('calling transform done when ws.length != 0'); + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); - if (ts.transforming) - throw new Error('calling transform done when still transforming'); + if (ts.transforming) throw new Error('Calling transform done when still transforming'); return stream.push(null); } - -},{"./_stream_duplex":19,"core-util-is":24,"inherits":15}],23:[function(require,module,exports){ +},{"./_stream_duplex":14,"core-util-is":5,"inherits":8}],18:[function(require,module,exports){ (function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - // A bit simpler than readable streams. -// Implement an async ._write(chunk, cb), and it'll handle all +// Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. +'use strict'; + module.exports = Writable; /**/ -var Buffer = require('buffer').Buffer; +var processNextTick = require('process-nextick-args'); +/**/ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/**/ + +/**/ +var Duplex; /**/ Writable.WritableState = WritableState; - /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ -var Stream = require('stream'); +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ + +var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ util.inherits(Writable, Stream); +function nop() {} + function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; + this.next = null; } function WritableState(options, stream) { - options = options || {}; + Duplex = Duplex || require('./_stream_duplex'); - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + options = options || {}; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; - // cast to ints. - this.highWaterMark = ~~this.highWaterMark; + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + // drain event flag. this.needDrain = false; // at the start of calling end() this.ending = false; @@ -5302,8 +4150,11 @@ function WritableState(options, stream) { // a flag to see when we're in the middle of a write. this.writing = false; + // when true all writes will be buffered until .uncork() call + this.corked = 0; + // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, becuase any + // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; @@ -5314,7 +4165,7 @@ function WritableState(options, stream) { this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) - this.onwrite = function(er) { + this.onwrite = function (er) { onwrite(stream, er); }; @@ -5324,41 +4175,104 @@ function WritableState(options, stream) { // the amount that is being written when _write is called. this.writelen = 0; - this.buffer = []; + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; } function Writable(options) { - var Duplex = require('./_stream_duplex'); + Duplex = Duplex || require('./_stream_duplex'); - // Writable ctor is applied to Duplexes, though they're not - // instanceof Writable, they're instanceof Readable. - if (!(this instanceof Writable) && !(this instanceof Duplex)) + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { return new Writable(options); + } this._writableState = new WritableState(options, this); // legacy. this.writable = true; + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + } + Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function() { - this.emit('error', new Error('Cannot pipe. Not readable.')); +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); }; - -function writeAfterEnd(stream, state, cb) { +function writeAfterEnd(stream, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); - process.nextTick(function() { - cb(er); - }); + processNextTick(cb, er); } // If we get something that is not a buffer, string, null, or undefined, @@ -5368,22 +4282,24 @@ function writeAfterEnd(stream, state, cb) { // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; - if (!Buffer.isBuffer(chunk) && - 'string' !== typeof chunk && - chunk !== null && - chunk !== undefined && - !state.objectMode) { - var er = new TypeError('Invalid non-string/buffer chunk'); + var er = false; + // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { stream.emit('error', er); - process.nextTick(function() { - cb(er); - }); + processNextTick(cb, er); valid = false; } return valid; } -Writable.prototype.write = function(chunk, encoding, cb) { +Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; @@ -5392,27 +4308,45 @@ Writable.prototype.write = function(chunk, encoding, cb) { encoding = null; } - if (Buffer.isBuffer(chunk)) - encoding = 'buffer'; - else if (!encoding) - encoding = state.defaultEncoding; + if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - if (typeof cb !== 'function') - cb = function() {}; + if (typeof cb !== 'function') cb = nop; - if (state.ended) - writeAfterEnd(this, state, cb); - else if (validChunk(this, state, chunk, cb)) + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; ret = writeOrBuffer(this, state, chunk, encoding, cb); + } return ret; }; +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && - state.decodeStrings !== false && - typeof chunk === 'string') { - chunk = new Buffer(chunk, encoding); + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = bufferShim.from(chunk, encoding); } return chunk; } @@ -5422,41 +4356,44 @@ function decodeChunk(state, chunk, encoding) { // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); - if (Buffer.isBuffer(chunk)) - encoding = 'buffer'; + + if (Buffer.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - if (!ret) - state.needDrain = true; + if (!ret) state.needDrain = true; - if (state.writing) - state.buffer.push(new WriteReq(chunk, encoding, cb)); - else - doWrite(stream, state, len, chunk, encoding, cb); + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } return ret; } -function doWrite(stream, state, len, chunk, encoding, cb) { +function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; - stream._write(chunk, encoding, state.onwrite); + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { - if (sync) - process.nextTick(function() { - cb(er); - }); - else - cb(er); + --state.pendingcb; + if (sync) processNextTick(cb, er);else cb(er); stream._writableState.errorEmitted = true; stream.emit('error', er); @@ -5476,31 +4413,29 @@ function onwrite(stream, er) { onwriteStateUpdate(state); - if (er) - onwriteError(stream, state, sync, er, cb); - else { + if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(stream, state); + var finished = needFinish(state); - if (!finished && !state.bufferProcessing && state.buffer.length) + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); + } if (sync) { - process.nextTick(function() { - afterWrite(stream, state, finished, cb); - }); + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ } else { - afterWrite(stream, state, finished, cb); - } + afterWrite(stream, state, finished, cb); + } } } function afterWrite(stream, state, finished, cb) { - if (!finished) - onwriteDrain(stream, state); + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; cb(); - if (finished) - finishMaybe(stream, state); + finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't @@ -5513,42 +4448,71 @@ function onwriteDrain(stream, state) { } } - // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; + var entry = state.bufferedRequest; - for (var c = 0; c < state.buffer.length; c++) { - var entry = state.buffer[c]; - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; - doWrite(stream, state, len, chunk, encoding, cb); - - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - c++; - break; + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; } + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; state.bufferProcessing = false; - if (c < state.buffer.length) - state.buffer = state.buffer.slice(c); - else - state.buffer.length = 0; } -Writable.prototype._write = function(chunk, encoding, cb) { - cb(new Error('not implemented')); +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); }; -Writable.prototype.end = function(chunk, encoding, cb) { +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { @@ -5560,27 +4524,39 @@ Writable.prototype.end = function(chunk, encoding, cb) { encoding = null; } - if (typeof chunk !== 'undefined' && chunk !== null) - this.write(chunk, encoding); + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. - if (!state.ending && !state.finished) - endWritable(this, state, cb); + if (!state.ending && !state.finished) endWritable(this, state, cb); }; +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} -function needFinish(stream, state) { - return (state.ending && - state.length === 0 && - !state.finished && - !state.writing); +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } } function finishMaybe(stream, state) { - var need = needFinish(stream, state); + var need = needFinish(state); if (need) { - state.finished = true; - stream.emit('finish'); + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } } return need; } @@ -5589,145 +4565,132 @@ function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { - if (state.finished) - process.nextTick(cb); - else - stream.once('finish', cb); + if (state.finished) processNextTick(cb);else stream.once('finish', cb); } state.ended = true; + stream.writable = false; } +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; +} }).call(this,require('_process')) -},{"./_stream_duplex":19,"_process":17,"buffer":10,"core-util-is":24,"inherits":15,"stream":29}],24:[function(require,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// 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. +},{"./_stream_duplex":14,"_process":12,"buffer":4,"buffer-shims":3,"core-util-is":5,"events":6,"inherits":8,"process-nextick-args":11,"util-deprecate":26}],19:[function(require,module,exports){ +'use strict'; -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; +var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; +module.exports = BufferList; -function isNull(arg) { - return arg === null; +function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; } -exports.isNull = isNull; -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; +BufferList.prototype.push = function (v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; +}; -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; +BufferList.prototype.unshift = function (v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; +}; -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; +BufferList.prototype.shift = function () { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; +}; -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; +BufferList.prototype.clear = function () { + this.head = this.tail = null; + this.length = 0; +}; -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; +BufferList.prototype.join = function (s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; +}; -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -function isBuffer(arg) { - return Buffer.isBuffer(arg); -} -exports.isBuffer = isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} -}).call(this,require("buffer").Buffer) -},{"buffer":10}],25:[function(require,module,exports){ +BufferList.prototype.concat = function (n) { + if (this.length === 0) return bufferShim.alloc(0); + if (this.length === 1) return this.head.data; + var ret = bufferShim.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + p.data.copy(ret, i); + i += p.data.length; + p = p.next; + } + return ret; +}; +},{"buffer":4,"buffer-shims":3}],20:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":20}],26:[function(require,module,exports){ -var Stream = require('stream'); // hack to fix a circular dependency issue when used with browserify +},{"./lib/_stream_passthrough.js":15}],21:[function(require,module,exports){ +(function (process){ +var Stream = (function (){ + try { + return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = Stream; +exports.Stream = Stream || exports; exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); -},{"./lib/_stream_duplex.js":19,"./lib/_stream_passthrough.js":20,"./lib/_stream_readable.js":21,"./lib/_stream_transform.js":22,"./lib/_stream_writable.js":23,"stream":29}],27:[function(require,module,exports){ +if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; +} + +}).call(this,require('_process')) +},{"./lib/_stream_duplex.js":14,"./lib/_stream_passthrough.js":15,"./lib/_stream_readable.js":16,"./lib/_stream_transform.js":17,"./lib/_stream_writable.js":18,"_process":12}],22:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":22}],28:[function(require,module,exports){ +},{"./lib/_stream_transform.js":17}],23:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":23}],29:[function(require,module,exports){ +},{"./lib/_stream_writable.js":18}],24:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -5856,7 +4819,7 @@ Stream.prototype.pipe = function(dest, options) { return dest; }; -},{"events":14,"inherits":15,"readable-stream/duplex.js":18,"readable-stream/passthrough.js":25,"readable-stream/readable.js":26,"readable-stream/transform.js":27,"readable-stream/writable.js":28}],30:[function(require,module,exports){ +},{"events":6,"inherits":8,"readable-stream/duplex.js":13,"readable-stream/passthrough.js":20,"readable-stream/readable.js":21,"readable-stream/transform.js":22,"readable-stream/writable.js":23}],25:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -6079,14 +5042,87 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":10}],31:[function(require,module,exports){ +},{"buffer":4}],26:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],27:[function(require,module,exports){ +arguments[4][8][0].apply(exports,arguments) +},{"dup":8}],28:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],32:[function(require,module,exports){ +},{}],29:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -6676,4 +5712,2013 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":31,"_process":17,"inherits":15}]},{},[1]); +},{"./support/isBuffer":28,"_process":12,"inherits":27}],30:[function(require,module,exports){ +var N3 = require('n3'), + N3Util = N3.Util; + +var validate = function (turtleStream, callback) { + var parser = N3.Parser(); + var errorCount = 0, warningCount = 0; + var regexp = { + 'dateTime' : /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])?T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)??(Z|[+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])?$/, + 'double' : /[-+]?\d*([.]\d+)?/, + 'float' : /[-+]?\d*[.]\d+/, + 'int' : /^[-+]?(0|[1-9]\d*)$/ + }; + + var feedback = { warnings : [], errors : []}; + + parser.parse(turtleStream, function(error, triple, prefixes) { + if (error) { + feedback.errors.push(error); + } + + if (triple) { + if (N3Util.isLiteral(triple.object)) { + var value = N3Util.getLiteralValue(triple.object); + var type = N3Util.getLiteralType(triple.object); + + type = type.replace('http://www.w3.org/2001/XMLSchema#', ''); + if (regexp[type] && !regexp[type].test(value)) { + feedback.warnings.push('WARNING: xsd:', type, 'does not validate for literal. {', triple.subject, triple.predicate, triple.object, '}'); + } + } + } else { + callback(feedback); + } + }); +}; + +if (typeof window !== 'undefined') { + window.validate = validate; +} + +module.exports = validate; + +},{"n3":31}],31:[function(require,module,exports){ +// Replace local require by a lazy loader +var globalRequire = require; +require = function () {}; + +// Expose submodules +var exports = module.exports = { + Lexer: require('./lib/N3Lexer'), + Parser: require('./lib/N3Parser'), + Writer: require('./lib/N3Writer'), + Store: require('./lib/N3Store'), + StreamParser: require('./lib/N3StreamParser'), + StreamWriter: require('./lib/N3StreamWriter'), + Util: require('./lib/N3Util'), +}; + +// Load submodules on first access +Object.keys(exports).forEach(function (submodule) { + Object.defineProperty(exports, submodule, { + configurable: true, + enumerable: true, + get: function () { + delete exports[submodule]; + return exports[submodule] = globalRequire('./lib/N3' + submodule); + }, + }); +}); + +},{"./lib/N3Lexer":32,"./lib/N3Parser":33,"./lib/N3Store":34,"./lib/N3StreamParser":35,"./lib/N3StreamWriter":36,"./lib/N3Util":37,"./lib/N3Writer":38}],32:[function(require,module,exports){ +// **N3Lexer** tokenizes N3 documents. +var fromCharCode = String.fromCharCode; +var immediately = typeof setImmediate === 'function' ? setImmediate : + function setImmediate(func) { setTimeout(func, 0); }; + +// Regular expression and replacement string to escape N3 strings. +// Note how we catch invalid unicode sequences separately (they will trigger an error). +var escapeSequence = /\\u([a-fA-F0-9]{4})|\\U([a-fA-F0-9]{8})|\\[uU]|\\(.)/g; +var escapeReplacements = { '\\': '\\', "'": "'", '"': '"', + 'n': '\n', 'r': '\r', 't': '\t', 'f': '\f', 'b': '\b', + '_': '_', '~': '~', '.': '.', '-': '-', '!': '!', '$': '$', '&': '&', + '(': '(', ')': ')', '*': '*', '+': '+', ',': ',', ';': ';', '=': '=', + '/': '/', '?': '?', '#': '#', '@': '@', '%': '%' }; +var illegalIriChars = /[\x00-\x20<>\\"\{\}\|\^\`]/; + +// ## Constructor +function N3Lexer(options) { + if (!(this instanceof N3Lexer)) + return new N3Lexer(options); + + // In line mode (N-Triples or N-Quads), only simple features may be parsed + if (options && options.lineMode) { + // Don't tokenize special literals + this._tripleQuotedString = this._number = this._boolean = /$0^/; + // Swap the tokenize method for a restricted version + var self = this; + this._tokenize = this.tokenize; + this.tokenize = function (input, callback) { + this._tokenize(input, function (error, token) { + if (!error && /^(?:IRI|prefixed|literal|langcode|type|\.|eof)$/.test(token.type)) + callback && callback(error, token); + else + callback && callback(error || self._syntaxError(token.type, callback = null)); + }); + }; + } +} + +N3Lexer.prototype = { + // ## Regular expressions + // It's slightly faster to have these as properties than as in-scope variables. + + _iri: /^<((?:[^>\\]|\\[uU])+)>/, // IRI with escape sequences; needs sanity check after unescaping + _unescapedIri: /^<([^\x00-\x20<>\\"\{\}\|\^\`]*)>/, // IRI without escape sequences; no unescaping + _unescapedString: /^"[^"\\]+"(?=[^"\\])/, // non-empty string without escape sequences + _singleQuotedString: /^"[^"\\]*(?:\\.[^"\\]*)*"(?=[^"\\])|^'[^'\\]*(?:\\.[^'\\]*)*'(?=[^'\\])/, + _tripleQuotedString: /^""("[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*")""|^''('[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*')''/, + _langcode: /^@([a-z]+(?:-[a-z0-9]+)*)(?=[^a-z0-9\-])/i, + _prefix: /^((?:[A-Za-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])(?:\.?[\-0-9A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])*)?:(?=[#\s<])/, + _prefixed: /^((?:[A-Za-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])(?:\.?[\-0-9A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])*)?:((?:(?:[0-:A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff]|%[0-9a-fA-F]{2}|\\[!#-\/;=?\-@_~])(?:(?:[\.\-0-:A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff]|%[0-9a-fA-F]{2}|\\[!#-\/;=?\-@_~])*(?:[\-0-:A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff]|%[0-9a-fA-F]{2}|\\[!#-\/;=?\-@_~]))?)?)(?=\.?[,;\s#()\[\]\{\}"'<])/, + _blank: /^_:((?:[0-9A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])(?:\.?[\-0-9A-Z_a-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c\u200d\u203f\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]|[\ud800-\udb7f][\udc00-\udfff])*)(?=\.?[,;:\s#()\[\]\{\}"'<])/, + _number: /^[\-+]?(?:\d+\.?\d*([eE](?:[\-\+])?\d+)|\d*\.?\d+)(?=[.,;:\s#()\[\]\{\}"'<])/, + _boolean: /^(?:true|false)(?=[.,;:\s#()\[\]\{\}"'<])/, + _keyword: /^@[a-z]+(?=[\s#<:])/, + _sparqlKeyword: /^(?:PREFIX|BASE|GRAPH)(?=[\s#<:])/i, + _shortPredicates: /^a(?=\s+|<)/, + _newline: /^[ \t]*(?:#[^\n\r]*)?(?:\r\n|\n|\r)[ \t]*/, + _whitespace: /^[ \t]+/, + _endOfFile: /^(?:#[^\n\r]*)?$/, + + // ## Private methods + + // ### `_tokenizeToEnd` tokenizes as for as possible, emitting tokens through the callback. + _tokenizeToEnd: function (callback, inputFinished) { + // Continue parsing as far as possible; the loop will return eventually. + var input = this._input; + while (true) { + // Count and skip whitespace lines. + var whiteSpaceMatch; + while (whiteSpaceMatch = this._newline.exec(input)) + input = input.substr(whiteSpaceMatch[0].length, input.length), this._line++; + // Skip whitespace on current line. + if (whiteSpaceMatch = this._whitespace.exec(input)) + input = input.substr(whiteSpaceMatch[0].length, input.length); + + // Stop for now if we're at the end. + if (this._endOfFile.test(input)) { + // If the input is finished, emit EOF. + if (inputFinished) + callback(input = null, { line: this._line, type: 'eof', value: '', prefix: '' }); + return this._input = input; + } + + // Look for specific token types based on the first character. + var line = this._line, type = '', value = '', prefix = '', + firstChar = input[0], match = null, matchLength = 0, unescaped, inconclusive = false; + switch (firstChar) { + case '^': + // Try to match a type. + if (input.length === 1) break; + else if (input[1] !== '^') return reportSyntaxError(this); + this._prevTokenType = '^'; + // Move to type IRI or prefixed name. + input = input.substr(2); + if (input[0] !== '<') { + inconclusive = true; + break; + } + // Fall through in case the type is an IRI. + + case '<': + // Try to find a full IRI without escape sequences. + if (match = this._unescapedIri.exec(input)) + type = 'IRI', value = match[1]; + // Try to find a full IRI with escape sequences. + else if (match = this._iri.exec(input)) { + unescaped = this._unescape(match[1]); + if (unescaped === null || illegalIriChars.test(unescaped)) + return reportSyntaxError(this); + type = 'IRI', value = unescaped; + } + break; + + case '_': + // Try to find a blank node. Since it can contain (but not end with) a dot, + // we always need a non-dot character before deciding it is a prefixed name. + // Therefore, try inserting a space if we're at the end of the input. + if ((match = this._blank.exec(input)) || + inputFinished && (match = this._blank.exec(input + ' '))) + type = 'prefixed', prefix = '_', value = match[1]; + break; + + case '"': + case "'": + // Try to find a non-empty double-quoted literal without escape sequences. + if (match = this._unescapedString.exec(input)) + type = 'literal', value = match[0]; + // Try to find any other literal wrapped in a pair of single or double quotes. + else if (match = this._singleQuotedString.exec(input)) { + unescaped = this._unescape(match[0]); + if (unescaped === null) + return reportSyntaxError(this); + type = 'literal', value = unescaped.replace(/^'|'$/g, '"'); + } + // Try to find a literal wrapped in three pairs of single or double quotes. + else if (match = this._tripleQuotedString.exec(input)) { + unescaped = match[1] || match[2]; + // Count the newlines and advance line counter. + this._line += unescaped.split(/\r\n|\r|\n/).length - 1; + unescaped = this._unescape(unescaped); + if (unescaped === null) + return reportSyntaxError(this); + type = 'literal', value = unescaped.replace(/^'|'$/g, '"'); + } + break; + + case '@': + // Try to find a language code. + if (this._prevTokenType === 'literal' && (match = this._langcode.exec(input))) + type = 'langcode', value = match[1]; + // Try to find a keyword. + else if (match = this._keyword.exec(input)) + type = match[0]; + break; + + case '.': + // Try to find a dot as punctuation. + if (input.length === 1 ? inputFinished : (input[1] < '0' || input[1] > '9')) { + type = '.'; + matchLength = 1; + break; + } + // Fall through to numerical case (could be a decimal dot). + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + // Try to find a number. + if (match = this._number.exec(input)) { + type = 'literal'; + value = '"' + match[0] + '"^^http://www.w3.org/2001/XMLSchema#' + + (match[1] ? 'double' : (/^[+\-]?\d+$/.test(match[0]) ? 'integer' : 'decimal')); + } + break; + + case 'B': + case 'b': + case 'p': + case 'P': + case 'G': + case 'g': + // Try to find a SPARQL-style keyword. + if (match = this._sparqlKeyword.exec(input)) + type = match[0].toUpperCase(); + else + inconclusive = true; + break; + + case 'f': + case 't': + // Try to match a boolean. + if (match = this._boolean.exec(input)) + type = 'literal', value = '"' + match[0] + '"^^http://www.w3.org/2001/XMLSchema#boolean'; + else + inconclusive = true; + break; + + case 'a': + // Try to find an abbreviated predicate. + if (match = this._shortPredicates.exec(input)) + type = 'abbreviation', value = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'; + else + inconclusive = true; + break; + + case ',': + case ';': + case '[': + case ']': + case '(': + case ')': + case '{': + case '}': + // The next token is punctuation + matchLength = 1; + type = firstChar; + break; + + default: + inconclusive = true; + } + + // Some first characters do not allow an immediate decision, so inspect more. + if (inconclusive) { + // Try to find a prefix. + if ((this._prevTokenType === '@prefix' || this._prevTokenType === 'PREFIX') && + (match = this._prefix.exec(input))) + type = 'prefix', value = match[1] || ''; + // Try to find a prefixed name. Since it can contain (but not end with) a dot, + // we always need a non-dot character before deciding it is a prefixed name. + // Therefore, try inserting a space if we're at the end of the input. + else if ((match = this._prefixed.exec(input)) || + inputFinished && (match = this._prefixed.exec(input + ' '))) + type = 'prefixed', prefix = match[1] || '', value = this._unescape(match[2]); + } + + // A type token is special: it can only be emitted after an IRI or prefixed name is read. + if (this._prevTokenType === '^') + type = (type === 'IRI' || type === 'prefixed') ? 'type' : ''; + + // What if nothing of the above was found? + if (!type) { + // We could be in streaming mode, and then we just wait for more input to arrive. + // Otherwise, a syntax error has occurred in the input. + // One exception: error on an unaccounted linebreak (= not inside a triple-quoted literal). + if (inputFinished || (!/^'''|^"""/.test(input) && /\n|\r/.test(input))) + return reportSyntaxError(this); + else + return this._input = input; + } + + // Emit the parsed token. + callback(null, { line: line, type: type, value: value, prefix: prefix }); + this._prevTokenType = type; + + // Advance to next part to tokenize. + input = input.substr(matchLength || match[0].length, input.length); + } + + // Signals the syntax error through the callback + function reportSyntaxError(self) { callback(self._syntaxError(/^\S*/.exec(input)[0])); } + }, + + // ### `_unescape` replaces N3 escape codes by their corresponding characters. + _unescape: function (item) { + try { + return item.replace(escapeSequence, function (sequence, unicode4, unicode8, escapedChar) { + var charCode; + if (unicode4) { + charCode = parseInt(unicode4, 16); + if (isNaN(charCode)) throw new Error(); // can never happen (regex), but helps performance + return fromCharCode(charCode); + } + else if (unicode8) { + charCode = parseInt(unicode8, 16); + if (isNaN(charCode)) throw new Error(); // can never happen (regex), but helps performance + if (charCode <= 0xFFFF) return fromCharCode(charCode); + return fromCharCode(0xD800 + ((charCode -= 0x10000) / 0x400), 0xDC00 + (charCode & 0x3FF)); + } + else { + var replacement = escapeReplacements[escapedChar]; + if (!replacement) + throw new Error(); + return replacement; + } + }); + } + catch (error) { return null; } + }, + + // ### `_syntaxError` creates a syntax error for the given issue + _syntaxError: function (issue) { + this._input = null; + return new Error('Syntax error: unexpected "' + issue + '" on line ' + this._line + '.'); + }, + + + // ## Public methods + + // ### `tokenize` starts the transformation of an N3 document into an array of tokens. + // The input can be a string or a stream. + tokenize: function (input, callback) { + var self = this; + this._line = 1; + + // If the input is a string, continuously emit tokens through the callback until the end. + if (typeof input === 'string') { + this._input = input; + immediately(function () { self._tokenizeToEnd(callback, true); }); + } + // Otherwise, the input will be streamed. + else { + this._input = ''; + + // If no input was given, it will be streamed through `addChunk` and ended with `end` + if (!input || typeof input === 'function') { + this.addChunk = addChunk; + this.end = end; + if (!callback) + callback = input; + } + // Otherwise, the input itself must be a stream + else { + if (typeof input.setEncoding === 'function') + input.setEncoding('utf8'); + input.on('data', addChunk); + input.on('end', end); + } + } + + // Adds the data chunk to the buffer and parses as far as possible + function addChunk(data) { + if (self._input !== null) { + self._input += data; + self._tokenizeToEnd(callback, false); + } + } + + // Parses until the end + function end() { + if (self._input !== null) + self._tokenizeToEnd(callback, true); + } + }, +}; + +// ## Exports + +// Export the `N3Lexer` class as a whole. +module.exports = N3Lexer; + +},{}],33:[function(require,module,exports){ +// **N3Parser** parses N3 documents. +var N3Lexer = require('./N3Lexer'); + +var RDF_PREFIX = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + RDF_NIL = RDF_PREFIX + 'nil', + RDF_FIRST = RDF_PREFIX + 'first', + RDF_REST = RDF_PREFIX + 'rest'; + +var absoluteIRI = /^[a-z][a-z0-9+.-]*:/i, + schemeAuthority = /^(?:([a-z][a-z0-9+.-]*:))?(?:\/\/[^\/]*)?/i, + dotSegments = /(?:^|\/)\.\.?(?:$|[\/#?])/; + +// The next ID for new blank nodes +var blankNodePrefix = 0, blankNodeCount = 0; + +// ## Constructor +function N3Parser(options) { + if (!(this instanceof N3Parser)) + return new N3Parser(options); + this._tripleStack = []; + this._graph = null; + + // Set the document IRI. + options = options || {}; + this._setBase(options.documentIRI); + + // Set supported features depending on the format. + var format = (typeof options.format === 'string') && options.format.match(/\w*$/)[0].toLowerCase(), + isTurtle = format === 'turtle', isTriG = format === 'trig', + isNTriples = /triple/.test(format), isNQuads = /quad/.test(format), + isLineMode = isNTriples || isNQuads; + if (!(this._supportsNamedGraphs = !isTurtle)) + this._readPredicateOrNamedGraph = this._readPredicate; + this._supportsQuads = !(isTurtle || isTriG || isNTriples); + // Disable relative IRIs in N-Triples or N-Quads mode + if (isLineMode) { + this._base = ''; + this._resolveIRI = function (token) { + this._error('Disallowed relative IRI', token); + return this._callback = noop, this._subject = null; + }; + } + this._blankNodePrefix = typeof options.blankNodePrefix !== 'string' ? '' : + '_:' + options.blankNodePrefix.replace(/^_:/, ''); + this._lexer = options.lexer || new N3Lexer({ lineMode: isLineMode }); +} + +// ## Private class methods + +// ### `_resetBlankNodeIds` restarts blank node identification. +N3Parser._resetBlankNodeIds = function () { + blankNodePrefix = blankNodeCount = 0; +}; + +N3Parser.prototype = { + // ## Private methods + + // ### `_setBase` sets the base IRI to resolve relative IRIs. + _setBase: function (baseIRI) { + if (!baseIRI) + baseIRI = null; + else if (baseIRI.indexOf('#') >= 0) + throw new Error('Invalid base IRI ' + baseIRI); + // Set base IRI and its components + if (this._base = baseIRI) { + this._basePath = baseIRI.replace(/[^\/?]*(?:\?.*)?$/, ''); + baseIRI = baseIRI.match(schemeAuthority); + this._baseRoot = baseIRI[0]; + this._baseScheme = baseIRI[1]; + } + }, + + // ### `_readInTopContext` reads a token when in the top context. + _readInTopContext: function (token) { + switch (token.type) { + // If an EOF token arrives in the top context, signal that we're done. + case 'eof': + if (this._graph !== null) + return this._error('Unclosed graph', token); + delete this._prefixes._; + return this._callback(null, null, this._prefixes); + // It could be a prefix declaration. + case '@prefix': + this._sparqlStyle = false; + return this._readPrefix; + case 'PREFIX': + this._sparqlStyle = true; + return this._readPrefix; + // It could be a base declaration. + case '@base': + this._sparqlStyle = false; + return this._readBaseIRI; + case 'BASE': + this._sparqlStyle = true; + return this._readBaseIRI; + // It could be a graph. + case '{': + if (this._supportsNamedGraphs) { + this._graph = ''; + this._subject = null; + return this._readSubject; + } + case 'GRAPH': + if (this._supportsNamedGraphs) + return this._readNamedGraphLabel; + // Otherwise, the next token must be a subject. + default: + return this._readSubject(token); + } + }, + + // ### `_readSubject` reads a triple's subject. + _readSubject: function (token) { + this._predicate = null; + switch (token.type) { + case 'IRI': + if (this._base === null || absoluteIRI.test(token.value)) + this._subject = token.value; + else + this._subject = this._resolveIRI(token); + break; + case 'prefixed': + var prefix = this._prefixes[token.prefix]; + if (prefix === undefined) + return this._error('Undefined prefix "' + token.prefix + ':"', token); + this._subject = prefix + token.value; + break; + case '[': + // Start a new triple with a new blank node as subject. + this._subject = '_:b' + blankNodeCount++; + this._tripleStack.push({ subject: this._subject, predicate: null, object: null, type: 'blank' }); + return this._readBlankNodeHead; + case '(': + // Start a new list + this._tripleStack.push({ subject: RDF_NIL, predicate: null, object: null, type: 'list' }); + this._subject = null; + return this._readListItem; + case '}': + return this._readPunctuation(token); + default: + return this._error('Expected subject but got ' + token.type, token); + } + // The next token must be a predicate, + // or, if the subject was actually a graph IRI, a named graph. + return this._readPredicateOrNamedGraph; + }, + + // ### `_readPredicate` reads a triple's predicate. + _readPredicate: function (token) { + var type = token.type; + switch (type) { + case 'IRI': + case 'abbreviation': + if (this._base === null || absoluteIRI.test(token.value)) + this._predicate = token.value; + else + this._predicate = this._resolveIRI(token); + break; + case 'prefixed': + if (token.prefix === '_') + return this._error('Disallowed blank node as predicate', token); + var prefix = this._prefixes[token.prefix]; + if (prefix === undefined) + return this._error('Undefined prefix "' + token.prefix + ':"', token); + this._predicate = prefix + token.value; + break; + case '.': + case ']': + case '}': + // Expected predicate didn't come, must have been trailing semicolon. + if (this._predicate === null) + return this._error('Unexpected ' + type, token); + this._subject = null; + return type === ']' ? this._readBlankNodeTail(token) : this._readPunctuation(token); + case ';': + // Extra semicolons can be safely ignored + return this._readPredicate; + default: + return this._error('Expected predicate to follow "' + this._subject + '"', token); + } + // The next token must be an object. + return this._readObject; + }, + + // ### `_readObject` reads a triple's object. + _readObject: function (token) { + switch (token.type) { + case 'IRI': + if (this._base === null || absoluteIRI.test(token.value)) + this._object = token.value; + else + this._object = this._resolveIRI(token); + break; + case 'prefixed': + var prefix = this._prefixes[token.prefix]; + if (prefix === undefined) + return this._error('Undefined prefix "' + token.prefix + ':"', token); + this._object = prefix + token.value; + break; + case 'literal': + this._object = token.value; + return this._readDataTypeOrLang; + case '[': + // Start a new triple with a new blank node as subject. + var blank = '_:b' + blankNodeCount++; + this._tripleStack.push({ subject: this._subject, predicate: this._predicate, object: blank, type: 'blank' }); + this._subject = blank; + return this._readBlankNodeHead; + case '(': + // Start a new list + this._tripleStack.push({ subject: this._subject, predicate: this._predicate, object: RDF_NIL, type: 'list' }); + this._subject = null; + return this._readListItem; + default: + return this._error('Expected object to follow "' + this._predicate + '"', token); + } + return this._getTripleEndReader(); + }, + + // ### `_readPredicateOrNamedGraph` reads a triple's predicate, or a named graph. + _readPredicateOrNamedGraph: function (token) { + return token.type === '{' ? this._readGraph(token) : this._readPredicate(token); + }, + + // ### `_readGraph` reads a graph. + _readGraph: function (token) { + if (token.type !== '{') + return this._error('Expected graph but got ' + token.type, token); + // The "subject" we read is actually the GRAPH's label + this._graph = this._subject, this._subject = null; + return this._readSubject; + }, + + // ### `_readBlankNodeHead` reads the head of a blank node. + _readBlankNodeHead: function (token) { + if (token.type === ']') { + this._subject = null; + return this._readBlankNodeTail(token); + } + else { + this._predicate = null; + return this._readPredicate(token); + } + }, + + // ### `_readBlankNodeTail` reads the end of a blank node. + _readBlankNodeTail: function (token) { + if (token.type !== ']') + return this._readBlankNodePunctuation(token); + + // Store blank node triple. + if (this._subject !== null) + this._callback(null, { subject: this._subject, + predicate: this._predicate, + object: this._object, + graph: this._graph || '' }); + + // Restore parent triple that contains the blank node. + var triple = this._tripleStack.pop(); + this._subject = triple.subject; + // Was the blank node the object? + if (triple.object !== null) { + // Restore predicate and object as well, and continue by reading punctuation. + this._predicate = triple.predicate; + this._object = triple.object; + return this._getTripleEndReader(); + } + // The blank node was the subject, so continue reading the predicate. + // If the blank node didn't contain any predicates, it could also be the label of a named graph. + return this._predicate !== null ? this._readPredicate : this._readPredicateOrNamedGraph; + }, + + // ### `_readDataTypeOrLang` reads an _optional_ data type or language. + _readDataTypeOrLang: function (token) { + switch (token.type) { + case 'type': + var value; + if (token.prefix === '') { + if (this._base === null || absoluteIRI.test(token.value)) + value = token.value; + else + value = this._resolveIRI(token); + } + else { + var prefix = this._prefixes[token.prefix]; + if (prefix === undefined) + return this._error('Undefined prefix "' + token.prefix + ':"', token); + value = prefix + token.value; + } + this._object += '^^' + value; + return this._getTripleEndReader(); + case 'langcode': + this._object += '@' + token.value.toLowerCase(); + return this._getTripleEndReader(); + default: + return this._getTripleEndReader().call(this, token); + } + }, + + // ### `_readListItem` reads items from a list. + _readListItem: function (token) { + var item = null, // The actual list item. + itemHead = null, // The head of the rdf:first predicate. + prevItemHead = this._subject, // The head of the previous rdf:first predicate. + stack = this._tripleStack, // The stack of triples part of recursion (lists, blanks, etc.). + parentTriple = stack[stack.length - 1], // The triple containing the current list. + next = this._readListItem; // The next function to execute. + + switch (token.type) { + case 'IRI': + if (this._base === null || absoluteIRI.test(token.value)) + item = token.value; + else + item = this._resolveIRI(token); + break; + case 'prefixed': + var prefix = this._prefixes[token.prefix]; + if (prefix === undefined) + return this._error('Undefined prefix "' + token.prefix + ':"', token); + item = prefix + token.value; + break; + case 'literal': + item = token.value; + next = this._readDataTypeOrLang; + break; + case '[': + // Stack the current list triple and start a new triple with a blank node as subject. + itemHead = '_:b' + blankNodeCount++; + item = '_:b' + blankNodeCount++; + stack.push({ subject: itemHead, predicate: RDF_FIRST, object: item, type: 'blank' }); + this._subject = item; + next = this._readBlankNodeHead; + break; + case '(': + // Stack the current list triple and start a new list + itemHead = '_:b' + blankNodeCount++; + stack.push({ subject: itemHead, predicate: RDF_FIRST, object: RDF_NIL, type: 'list' }); + this._subject = null; + next = this._readListItem; + break; + case ')': + // Restore the parent triple. + stack.pop(); + // If this list is contained within a parent list, return the membership triple here. + // This will be ` rdf:first .`. + if (stack.length !== 0 && stack[stack.length - 1].type === 'list') + this._callback(null, { subject: parentTriple.subject, + predicate: parentTriple.predicate, + object: parentTriple.object, + graph: this._graph || '' }); + // Restore the parent triple's subject. + this._subject = parentTriple.subject; + // Was this list in the parent triple's subject? + if (parentTriple.predicate === null) { + // The next token is the predicate. + next = this._readPredicate; + // Skip writing the list tail if this was an empty list. + if (parentTriple.subject === RDF_NIL) + return next; + } + // The list was in the parent triple's object. + else { + // Restore the parent triple's predicate and object as well. + this._predicate = parentTriple.predicate; + this._object = parentTriple.object; + next = this._getTripleEndReader(); + // Skip writing the list tail if this was an empty list. + if (parentTriple.object === RDF_NIL) + return next; + } + // Close the list by making the item head nil. + itemHead = RDF_NIL; + break; + default: + return this._error('Expected list item instead of "' + token.type + '"', token); + } + + // Create a new blank node if no item head was assigned yet. + if (itemHead === null) + this._subject = itemHead = '_:b' + blankNodeCount++; + + // Is this the first element of the list? + if (prevItemHead === null) { + // This list is either the object or the subject. + if (parentTriple.object === RDF_NIL) + parentTriple.object = itemHead; + else + parentTriple.subject = itemHead; + } + else { + // The rest of the list is in the current head. + this._callback(null, { subject: prevItemHead, + predicate: RDF_REST, + object: itemHead, + graph: this._graph || '' }); + } + // Add the item's value. + if (item !== null) + this._callback(null, { subject: itemHead, + predicate: RDF_FIRST, + object: item, + graph: this._graph || '' }); + return next; + }, + + // ### `_readPunctuation` reads punctuation between triples or triple parts. + _readPunctuation: function (token) { + var next, subject = this._subject, graph = this._graph; + switch (token.type) { + // A closing brace ends a graph + case '}': + if (this._graph === null) + return this._error('Unexpected graph closing', token); + this._graph = null; + // A dot just ends the statement, without sharing anything with the next. + case '.': + this._subject = null; + next = this._readInTopContext; + break; + // Semicolon means the subject is shared; predicate and object are different. + case ';': + next = this._readPredicate; + break; + // Comma means both the subject and predicate are shared; the object is different. + case ',': + next = this._readObject; + break; + // An IRI means this is a quad (only allowed if not already inside a graph). + case 'IRI': + if (this._supportsQuads && this._graph === null) { + if (this._base === null || absoluteIRI.test(token.value)) + graph = token.value; + else + graph = this._resolveIRI(token); + subject = this._subject; + next = this._readQuadPunctuation; + break; + } + // An prefixed name means this is a quad (only allowed if not already inside a graph). + case 'prefixed': + if (this._supportsQuads && this._graph === null) { + var prefix = this._prefixes[token.prefix]; + if (prefix === undefined) + return this._error('Undefined prefix "' + token.prefix + ':"', token); + graph = prefix + token.value; + next = this._readQuadPunctuation; + break; + } + default: + return this._error('Expected punctuation to follow "' + this._object + '"', token); + } + // A triple has been completed now, so return it. + if (subject !== null) + this._callback(null, { subject: subject, + predicate: this._predicate, + object: this._object, + graph: graph || '' }); + return next; + }, + + // ### `_readBlankNodePunctuation` reads punctuation in a blank node + _readBlankNodePunctuation: function (token) { + var next; + switch (token.type) { + // Semicolon means the subject is shared; predicate and object are different. + case ';': + next = this._readPredicate; + break; + // Comma means both the subject and predicate are shared; the object is different. + case ',': + next = this._readObject; + break; + default: + return this._error('Expected punctuation to follow "' + this._object + '"', token); + } + // A triple has been completed now, so return it. + this._callback(null, { subject: this._subject, + predicate: this._predicate, + object: this._object, + graph: this._graph || '' }); + return next; + }, + + // ### `_readQuadPunctuation` reads punctuation after a quad. + _readQuadPunctuation: function (token) { + if (token.type !== '.') + return this._error('Expected dot to follow quad', token); + return this._readInTopContext; + }, + + // ### `_readPrefix` reads the prefix of a prefix declaration. + _readPrefix: function (token) { + if (token.type !== 'prefix') + return this._error('Expected prefix to follow @prefix', token); + this._prefix = token.value; + return this._readPrefixIRI; + }, + + // ### `_readPrefixIRI` reads the IRI of a prefix declaration. + _readPrefixIRI: function (token) { + if (token.type !== 'IRI') + return this._error('Expected IRI to follow prefix "' + this._prefix + ':"', token); + var prefixIRI; + if (this._base === null || absoluteIRI.test(token.value)) + prefixIRI = token.value; + else + prefixIRI = this._resolveIRI(token); + this._prefixes[this._prefix] = prefixIRI; + this._prefixCallback(this._prefix, prefixIRI); + return this._readDeclarationPunctuation; + }, + + // ### `_readBaseIRI` reads the IRI of a base declaration. + _readBaseIRI: function (token) { + if (token.type !== 'IRI') + return this._error('Expected IRI to follow base declaration', token); + try { + this._setBase(this._base === null || + absoluteIRI.test(token.value) ? token.value : this._resolveIRI(token)); + } + catch (error) { this._error(error.message, token); } + return this._readDeclarationPunctuation; + }, + + // ### `_readNamedGraphLabel` reads the label of a named graph. + _readNamedGraphLabel: function (token) { + switch (token.type) { + case 'IRI': + case 'prefixed': + return this._readSubject(token), this._readGraph; + case '[': + return this._readNamedGraphBlankLabel; + default: + return this._error('Invalid graph label', token); + } + }, + + // ### `_readNamedGraphLabel` reads a blank node label of a named graph. + _readNamedGraphBlankLabel: function (token) { + if (token.type !== ']') + return this._error('Invalid graph label', token); + this._subject = '_:b' + blankNodeCount++; + return this._readGraph; + }, + + // ### `_readDeclarationPunctuation` reads the punctuation of a declaration. + _readDeclarationPunctuation: function (token) { + // SPARQL-style declarations don't have punctuation. + if (this._sparqlStyle) + return this._readInTopContext(token); + + if (token.type !== '.') + return this._error('Expected declaration to end with a dot', token); + return this._readInTopContext; + }, + + // ### `_getTripleEndReader` gets the next reader function at the end of a triple. + _getTripleEndReader: function () { + var stack = this._tripleStack; + if (stack.length === 0) + return this._readPunctuation; + + switch (stack[stack.length - 1].type) { + case 'blank': + return this._readBlankNodeTail; + case 'list': + return this._readListItem; + } + }, + + // ### `_error` emits an error message through the callback. + _error: function (message, token) { + this._callback(new Error(message + ' at line ' + token.line + '.')); + }, + + // ### `_resolveIRI` resolves a relative IRI token against the base path, + // assuming that a base path has been set and that the IRI is indeed relative. + _resolveIRI: function (token) { + var iri = token.value; + switch (iri[0]) { + // An empty relative IRI indicates the base IRI + case undefined: return this._base; + // Resolve relative fragment IRIs against the base IRI + case '#': return this._base + iri; + // Resolve relative query string IRIs by replacing the query string + case '?': return this._base.replace(/(?:\?.*)?$/, iri); + // Resolve root-relative IRIs at the root of the base IRI + case '/': + // Resolve scheme-relative IRIs to the scheme + return (iri[1] === '/' ? this._baseScheme : this._baseRoot) + this._removeDotSegments(iri); + // Resolve all other IRIs at the base IRI's path + default: + return this._removeDotSegments(this._basePath + iri); + } + }, + + // ### `_removeDotSegments` resolves './' and '../' path segments in an IRI as per RFC3986. + _removeDotSegments: function (iri) { + // Don't modify the IRI if it does not contain any dot segments + if (!dotSegments.test(iri)) + return iri; + + // Start with an imaginary slash before the IRI in order to resolve trailing './' and '../' + var result = '', length = iri.length, i = -1, pathStart = -1, segmentStart = 0, next = '/'; + + while (i < length) { + switch (next) { + // The path starts with the first slash after the authority + case ':': + if (pathStart < 0) { + // Skip two slashes before the authority + if (iri[++i] === '/' && iri[++i] === '/') + // Skip to slash after the authority + while ((pathStart = i + 1) < length && iri[pathStart] !== '/') + i = pathStart; + } + break; + // Don't modify a query string or fragment + case '?': + case '#': + i = length; + break; + // Handle '/.' or '/..' path segments + case '/': + if (iri[i + 1] === '.') { + next = iri[++i + 1]; + switch (next) { + // Remove a '/.' segment + case '/': + result += iri.substring(segmentStart, i - 1); + segmentStart = i + 1; + break; + // Remove a trailing '/.' segment + case undefined: + case '?': + case '#': + return result + iri.substring(segmentStart, i) + iri.substr(i + 1); + // Remove a '/..' segment + case '.': + next = iri[++i + 1]; + if (next === undefined || next === '/' || next === '?' || next === '#') { + result += iri.substring(segmentStart, i - 2); + // Try to remove the parent path from result + if ((segmentStart = result.lastIndexOf('/')) >= pathStart) + result = result.substr(0, segmentStart); + // Remove a trailing '/..' segment + if (next !== '/') + return result + '/' + iri.substr(i + 1); + segmentStart = i + 1; + } + } + } + } + next = iri[++i]; + } + return result + iri.substring(segmentStart); + }, + + // ## Public methods + + // ### `parse` parses the N3 input and emits each parsed triple through the callback. + parse: function (input, tripleCallback, prefixCallback) { + // The read callback is the next function to be executed when a token arrives. + // We start reading in the top context. + this._readCallback = this._readInTopContext; + this._prefixes = Object.create(null); + this._prefixes._ = this._blankNodePrefix || '_:b' + blankNodePrefix++ + '_'; + + // If the input argument is not given, shift parameters + if (typeof input === 'function') + prefixCallback = tripleCallback, tripleCallback = input, input = null; + + // Set the triple and prefix callbacks. + this._callback = tripleCallback || noop; + this._prefixCallback = prefixCallback || noop; + + // Execute the read callback when a token arrives. + var self = this; + this._lexer.tokenize(input, function (error, token) { + if (error !== null) + self._callback(error), self._callback = noop; + else if (self._readCallback !== undefined) + self._readCallback = self._readCallback(token); + }); + + // If no input was given, it can be added with `addChunk` and ended with `end` + if (!input) { + this.addChunk = this._lexer.addChunk; + this.end = this._lexer.end; + } + }, +}; + +// The empty function +function noop() {} + +// ## Exports + +// Export the `N3Parser` class as a whole. +module.exports = N3Parser; + +},{"./N3Lexer":32}],34:[function(require,module,exports){ +// **N3Store** objects store N3 triples by graph in memory. + +var expandPrefixedName = require('./N3Util').expandPrefixedName; + +// ## Constructor +function N3Store(triples, options) { + if (!(this instanceof N3Store)) + return new N3Store(triples, options); + + // The number of triples is initially zero. + this._size = 0; + // `_graphs` contains subject, predicate, and object indexes per graph. + this._graphs = Object.create(null); + // `_entities` maps entities such as `http://xmlns.com/foaf/0.1/name` to numbers. + // This saves memory, since only the numbers have to be stored in `_graphs`. + this._entities = Object.create(null); + this._entities['><'] = 0; // Dummy entry, so the first actual key is non-zero + this._entityCount = 0; + // `_blankNodeIndex` is the index of the last created blank node that was automatically named + this._blankNodeIndex = 0; + + // Shift parameters if `triples` is not given + if (!options && triples && !triples[0]) + options = triples, triples = null; + + // Add triples and prefixes if passed + this._prefixes = Object.create(null); + if (options && options.prefixes) + this.addPrefixes(options.prefixes); + if (triples) + this.addTriples(triples); +} + +N3Store.prototype = { + // ## Public properties + + // ### `size` returns the number of triples in the store. + get size() { + // Return the triple count if if was cached. + var size = this._size; + if (size !== null) + return size; + + // Calculate the number of triples by counting to the deepest level. + var graphs = this._graphs, subjects, subject; + for (var graphKey in graphs) + for (var subjectKey in (subjects = graphs[graphKey].subjects)) + for (var predicateKey in (subject = subjects[subjectKey])) + size += Object.keys(subject[predicateKey]).length; + return this._size = size; + }, + + // ## Private methods + + // ### `_addToIndex` adds a triple to a three-layered index. + _addToIndex: function (index0, key0, key1, key2) { + // Create layers as necessary. + var index1 = index0[key0] || (index0[key0] = {}); + var index2 = index1[key1] || (index1[key1] = {}); + // Setting the key to _any_ value signalizes the presence of the triple. + index2[key2] = null; + }, + + // ### `_removeFromIndex` removes a triple from a three-layered index. + _removeFromIndex: function (index0, key0, key1, key2) { + // Remove the triple from the index. + var index1 = index0[key0], index2 = index1[key1], key; + delete index2[key2]; + + // Remove intermediary index layers if they are empty. + for (key in index2) return; + delete index1[key1]; + for (key in index1) return; + delete index0[key0]; + }, + + // ### `_findInIndex` finds a set of triples in a three-layered index. + // The index base is `index0` and the keys at each level are `key0`, `key1`, and `key2`. + // Any of these keys can be `null`, which is interpreted as a wildcard. + // `name0`, `name1`, and `name2` are the names of the keys at each level, + // used when reconstructing the resulting triple + // (for instance: _subject_, _predicate_, and _object_). + // Finally, `graph` will be the graph of the created triples. + _findInIndex: function (index0, key0, key1, key2, name0, name1, name2, graph) { + var results = [], entityKeys = Object.keys(this._entities), tmp, index1, index2; + + // If a key is specified, use only that part of index 0. + if (key0) (tmp = index0, index0 = {})[key0] = tmp[key0]; + for (var value0 in index0) { + var entity0 = entityKeys[value0]; + + if (index1 = index0[value0]) { + // If a key is specified, use only that part of index 1. + if (key1) (tmp = index1, index1 = {})[key1] = tmp[key1]; + for (var value1 in index1) { + var entity1 = entityKeys[value1]; + + if (index2 = index1[value1]) { + // If a key is specified, use only that part of index 2, if it exists. + var values = key2 ? (key2 in index2 ? [key2] : []) : Object.keys(index2); + // Create triples for all items found in index 2. + for (var l = values.length - 1; l >= 0; l--) { + var result = { subject: '', predicate: '', object: '', graph: graph }; + result[name0] = entity0; + result[name1] = entity1; + result[name2] = entityKeys[values[l]]; + results.push(result); + } + } + } + } + } + return results; + }, + + // ### `_countInIndex` counts matching triples in a three-layered index. + // The index base is `index0` and the keys at each level are `key0`, `key1`, and `key2`. + // Any of these keys can be `null`, which is interpreted as a wildcard. + _countInIndex: function (index0, key0, key1, key2) { + var count = 0, tmp, index1, index2; + + // If a key is specified, count only that part of index 0. + if (key0) (tmp = index0, index0 = {})[key0] = tmp[key0]; + for (var value0 in index0) { + if (index1 = index0[value0]) { + // If a key is specified, count only that part of index 1. + if (key1) (tmp = index1, index1 = {})[key1] = tmp[key1]; + for (var value1 in index1) { + if (index2 = index1[value1]) { + // If a key is specified, count the triple if it exists. + if (key2) (key2 in index2) && count++; + // Otherwise, count all triples. + else count += Object.keys(index2).length; + } + } + } + } + return count; + }, + + // ## Public methods + + // ### `addTriple` adds a new N3 triple to the store. + addTriple: function (subject, predicate, object, graph) { + // Shift arguments if a triple object is given instead of components + if (!predicate) + graph = subject.graph, object = subject.object, + predicate = subject.predicate, subject = subject.subject; + + // Find the graph that will contain the triple. + graph = graph || ''; + var graphItem = this._graphs[graph]; + // Create the graph if it doesn't exist yet. + if (!graphItem) { + graphItem = this._graphs[graph] = { subjects: {}, predicates: {}, objects: {} }; + // Freezing a graph helps subsequent `add` performance, + // and properties will never be modified anyway. + Object.freeze(graphItem); + } + + // Since entities can often be long IRIs, we avoid storing them in every index. + // Instead, we have a separate index that maps entities to numbers, + // which are then used as keys in the other indexes. + var entities = this._entities; + subject = entities[subject] || (entities[subject] = ++this._entityCount); + predicate = entities[predicate] || (entities[predicate] = ++this._entityCount); + object = entities[object] || (entities[object] = ++this._entityCount); + + this._addToIndex(graphItem.subjects, subject, predicate, object); + this._addToIndex(graphItem.predicates, predicate, object, subject); + this._addToIndex(graphItem.objects, object, subject, predicate); + + // The cached triple count is now invalid. + this._size = null; + }, + + // ### `addTriples` adds multiple N3 triples to the store. + addTriples: function (triples) { + for (var i = triples.length - 1; i >= 0; i--) + this.addTriple(triples[i]); + }, + + // ### `addPrefix` adds support for querying with the given prefix + addPrefix: function (prefix, iri) { + this._prefixes[prefix] = iri; + }, + + // ### `addPrefixes` adds support for querying with the given prefixes + addPrefixes: function (prefixes) { + for (var prefix in prefixes) + this.addPrefix(prefix, prefixes[prefix]); + }, + + // ### `removeTriple` removes an N3 triple from the store if it exists. + removeTriple: function (subject, predicate, object, graph) { + // Shift arguments if a triple object is given instead of components. + if (!predicate) + graph = subject.graph, object = subject.object, + predicate = subject.predicate, subject = subject.subject; + graph = graph || ''; + + // Find internal identifiers for all components. + var graphItem, entities = this._entities, graphs = this._graphs; + if (!(subject = entities[subject])) return; + if (!(predicate = entities[predicate])) return; + if (!(object = entities[object])) return; + if (!(graphItem = graphs[graph])) return; + + // Verify that the triple exists. + var subjects, predicates; + if (!(subjects = graphItem.subjects[subject])) return; + if (!(predicates = subjects[predicate])) return; + if (!(object in predicates)) return; + + // Remove it from all indexes. + this._removeFromIndex(graphItem.subjects, subject, predicate, object); + this._removeFromIndex(graphItem.predicates, predicate, object, subject); + this._removeFromIndex(graphItem.objects, object, subject, predicate); + if (this._size !== null) this._size--; + + // Remove the graph if it is empty. + for (subject in graphItem.subjects) return; + delete graphs[graph]; + }, + + // ### `removeTriples` removes multiple N3 triples from the store. + removeTriples: function (triples) { + for (var i = triples.length - 1; i >= 0; i--) + this.removeTriple(triples[i]); + }, + + // ### `find` finds a set of triples matching a pattern, expanding prefixes as necessary. + // Setting `subject`, `predicate`, or `object` to `null` means an _anything_ wildcard. + // Setting `graph` to `null` means the default graph. + find: function (subject, predicate, object, graph) { + var prefixes = this._prefixes; + return this.findByIRI( + expandPrefixedName(subject, prefixes), + expandPrefixedName(predicate, prefixes), + expandPrefixedName(object, prefixes), + expandPrefixedName(graph, prefixes) + ); + }, + + // ### `findByIRI` finds a set of triples matching a pattern. + // Setting `subject`, `predicate`, or `object` to a falsy value means an _anything_ wildcard. + // Setting `graph` to a falsy value means the default graph. + findByIRI: function (subject, predicate, object, graph) { + graph = graph || ''; + var graphItem = this._graphs[graph], entities = this._entities; + + // If the specified graph contain no triples, there are no results. + if (!graphItem) return []; + + // Translate IRIs to internal index keys. + // Optimization: if the entity doesn't exist, no triples with it exist. + if (subject && !(subject = entities[subject])) return []; + if (predicate && !(predicate = entities[predicate])) return []; + if (object && !(object = entities[object])) return []; + + // Choose the optimal index, based on what fields are present + if (subject) { + if (object) + // If subject and object are given, the object index will be the fastest. + return this._findInIndex(graphItem.objects, object, subject, predicate, + 'object', 'subject', 'predicate', graph); + else + // If only subject and possibly predicate are given, the subject index will be the fastest. + return this._findInIndex(graphItem.subjects, subject, predicate, null, + 'subject', 'predicate', 'object', graph); + } + else if (predicate) + // If only predicate and possibly object are given, the predicate index will be the fastest. + return this._findInIndex(graphItem.predicates, predicate, object, null, + 'predicate', 'object', 'subject', graph); + else if (object) + // If only object is given, the object index will be the fastest. + return this._findInIndex(graphItem.objects, object, null, null, + 'object', 'subject', 'predicate', graph); + else + // If nothing is given, iterate subjects and predicates first + return this._findInIndex(graphItem.subjects, null, null, null, + 'subject', 'predicate', 'object', graph); + }, + + // ### `count` returns the number of triples matching a pattern, expanding prefixes as necessary. + // Setting `subject`, `predicate`, or `object` to `null` means an _anything_ wildcard. + // Setting `graph` to `null` means the default graph. + count: function (subject, predicate, object, graph) { + var prefixes = this._prefixes; + return this.countByIRI( + expandPrefixedName(subject, prefixes), + expandPrefixedName(predicate, prefixes), + expandPrefixedName(object, prefixes), + expandPrefixedName(graph, prefixes) + ); + }, + + // ### `countByIRI` returns the number of triples matching a pattern. + // Setting `subject`, `predicate`, or `object` to `null` means an _anything_ wildcard. + // Setting `graph` to `null` means the default graph. + countByIRI: function (subject, predicate, object, graph) { + graph = graph || ''; + var graphItem = this._graphs[graph], entities = this._entities; + + // If the specified graph contain no triples, there are no results. + if (!graphItem) return 0; + + // Translate IRIs to internal index keys. + // Optimization: if the entity doesn't exist, no triples with it exist. + if (subject && !(subject = entities[subject])) return 0; + if (predicate && !(predicate = entities[predicate])) return 0; + if (object && !(object = entities[object])) return 0; + + // Choose the optimal index, based on what fields are present + if (subject) { + if (object) + // If subject and object are given, the object index will be the fastest. + return this._countInIndex(graphItem.objects, object, subject, predicate); + else + // If only subject and possibly predicate are given, the subject index will be the fastest. + return this._countInIndex(graphItem.subjects, subject, predicate, object); + } + else if (predicate) { + // If only predicate and possibly object are given, the predicate index will be the fastest. + return this._countInIndex(graphItem.predicates, predicate, object, subject); + } + else { + // If only object is possibly given, the object index will be the fastest. + return this._countInIndex(graphItem.objects, object, subject, predicate); + } + }, + + // ### `createBlankNode` creates a new blank node, returning its name. + createBlankNode: function (suggestedName) { + var name, index; + // Generate a name based on the suggested name + if (suggestedName) { + name = suggestedName = '_:' + suggestedName, index = 1; + while (this._entities[name]) + name = suggestedName + index++; + } + // Generate a generic blank node name + else { + do { name = '_:b' + this._blankNodeIndex++; } + while (this._entities[name]); + } + // Add the blank node to the entities, avoiding the generation of duplicates + this._entities[name] = ++this._entityCount; + return name; + }, +}; + +// ## Exports + +// Export the `N3Store` class as a whole. +module.exports = N3Store; + +},{"./N3Util":37}],35:[function(require,module,exports){ +// **N3StreamParser** parses an N3 stream into a triple stream +var Transform = require('stream').Transform, + util = require('util'), + N3Parser = require('./N3Parser.js'); + +// ## Constructor +function N3StreamParser(options) { + if (!(this instanceof N3StreamParser)) + return new N3StreamParser(options); + + // Initialize Transform base class + Transform.call(this, { decodeStrings: true }); + this._readableState.objectMode = true; + + // Set up parser + var self = this, parser = new N3Parser(options); + parser.parse( + // Handle triples by pushing them down the pipeline + function (error, triple) { + triple && self.push(triple) || + error && self.emit('error', error); + }, + // Emit prefixes through the `prefix` event + this.emit.bind(this, 'prefix')); + + // Implement Transform methods on top of parser + this._transform = function (chunk, encoding, done) { parser.addChunk(chunk); done(); }; + this._flush = function (done) { parser.end(); done(); }; +} +util.inherits(N3StreamParser, Transform); + +// ## Exports +// Export the `N3StreamParser` class as a whole. +module.exports = N3StreamParser; + +},{"./N3Parser.js":33,"stream":24,"util":29}],36:[function(require,module,exports){ +// **N3StreamWriter** serializes a triple stream into an N3 stream +var Transform = require('stream').Transform, + util = require('util'), + N3Writer = require('./N3Writer.js'); + +// ## Constructor +function N3StreamWriter(options) { + if (!(this instanceof N3StreamWriter)) + return new N3StreamWriter(options); + + // Initialize Transform base class + Transform.call(this, { encoding: 'utf8' }); + this._writableState.objectMode = true; + + // Set up writer with a dummy stream object + var self = this; + var writer = new N3Writer({ + write: function (chunk, encoding, callback) { self.push(chunk); callback && callback(); }, + end: function (callback) { self.push(null); callback && callback(); }, + }, options); + + // Implement Transform methods on top of writer + this._transform = function (triple, encoding, done) { writer.addTriple(triple, done); }; + this._flush = function (done) { writer.end(done); }; +} +util.inherits(N3StreamWriter, Transform); + +// ## Exports +// Export the `N3StreamWriter` class as a whole. +module.exports = N3StreamWriter; + +},{"./N3Writer.js":38,"stream":24,"util":29}],37:[function(require,module,exports){ +// **N3Util** provides N3 utility functions + +var Xsd = 'http://www.w3.org/2001/XMLSchema#'; +var XsdString = Xsd + 'string'; +var XsdInteger = Xsd + 'integer'; +var XsdDecimal = Xsd + 'decimal'; +var XsdBoolean = Xsd + 'boolean'; +var RdfLangString = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString'; + +var N3Util = { + // Tests whether the given entity (triple object) represents an IRI in the N3 library + isIRI: function (entity) { + if (!entity) + return entity; + var firstChar = entity[0]; + return firstChar !== '"' && firstChar !== '_'; + }, + + // Tests whether the given entity (triple object) represents a literal in the N3 library + isLiteral: function (entity) { + return entity && entity[0] === '"'; + }, + + // Tests whether the given entity (triple object) represents a blank node in the N3 library + isBlank: function (entity) { + return entity && entity.substr(0, 2) === '_:'; + }, + + // Gets the string value of a literal in the N3 library + getLiteralValue: function (literal) { + var match = /^"([^]*)"/.exec(literal); + if (!match) + throw new Error(literal + ' is not a literal'); + return match[1]; + }, + + // Gets the type of a literal in the N3 library + getLiteralType: function (literal) { + var match = /^"[^]*"(?:\^\^([^"]+)|(@)[^@"]+)?$/.exec(literal); + if (!match) + throw new Error(literal + ' is not a literal'); + return match[1] || (match[2] ? RdfLangString : XsdString); + }, + + // Gets the language of a literal in the N3 library + getLiteralLanguage: function (literal) { + var match = /^"[^]*"(?:@([^@"]+)|\^\^[^"]+)?$/.exec(literal); + if (!match) + throw new Error(literal + ' is not a literal'); + return match[1] ? match[1].toLowerCase() : ''; + }, + + // Tests whether the given entity (triple object) represents a prefixed name + isPrefixedName: function (entity) { + return entity && /^[^:\/"']*:[^:\/"']+$/.test(entity); + }, + + // Expands the prefixed name to a full IRI (also when it occurs as a literal's type) + expandPrefixedName: function (prefixedName, prefixes) { + var match = /(?:^|"\^\^)([^:\/#"'\^_]*):[^\/]*$/.exec(prefixedName), prefix, base, index; + if (match) + prefix = match[1], base = prefixes[prefix], index = match.index; + if (base === undefined) + return prefixedName; + + // The match index is non-zero when expanding a literal's type. + return index === 0 ? base + prefixedName.substr(prefix.length + 1) + : prefixedName.substr(0, index + 3) + + base + prefixedName.substr(index + prefix.length + 4); + }, + + // Creates an IRI in N3.js representation + createIRI: function (iri) { + return iri && iri[0] === '"' ? N3Util.getLiteralValue(iri) : iri; + }, + + // Creates a literal in N3.js representation + createLiteral: function (value, modifier) { + if (!modifier) { + switch (typeof value) { + case 'boolean': + modifier = XsdBoolean; + break; + case 'number': + if (isFinite(value)) { + modifier = value % 1 === 0 ? XsdInteger : XsdDecimal; + break; + } + default: + return '"' + value + '"'; + } + } + return '"' + value + + (/^[a-z]+(-[a-z0-9]+)*$/i.test(modifier) ? '"@' + modifier.toLowerCase() + : '"^^' + modifier); + }, +}; + +// Add the N3Util functions to the given object or its prototype +function addN3Util(parent, toPrototype) { + for (var name in N3Util) + if (!toPrototype) + parent[name] = N3Util[name]; + else + parent.prototype[name] = applyToThis(N3Util[name]); + + return parent; +} + +// Returns a function that applies `f` to the `this` object +function applyToThis(f) { + return function (a) { return f(this, a); }; +} + +// Expose N3Util, attaching all functions to it +module.exports = addN3Util(addN3Util); + +},{}],38:[function(require,module,exports){ +// **N3Writer** writes N3 documents. + +// Matches a literal as represented in memory by the N3 library +var N3LiteralMatcher = /^"([^]*)"(?:\^\^(.+)|@([\-a-z]+))?$/i; + +// rdf:type predicate (for 'a' abbreviation) +var RDF_PREFIX = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + RDF_TYPE = RDF_PREFIX + 'type'; + +// Characters in literals that require escaping +var escape = /["\\\t\n\r\b\f\u0000-\u0019\ud800-\udbff]/, + escapeAll = /["\\\t\n\r\b\f\u0000-\u0019]|[\ud800-\udbff][\udc00-\udfff]/g, + escapeReplacements = { '\\': '\\\\', '"': '\\"', '\t': '\\t', + '\n': '\\n', '\r': '\\r', '\b': '\\b', '\f': '\\f' }; + +// ## Constructor +function N3Writer(outputStream, options) { + if (!(this instanceof N3Writer)) + return new N3Writer(outputStream, options); + + // Shift arguments if the first argument is not a stream + if (outputStream && typeof outputStream.write !== 'function') + options = outputStream, outputStream = null; + options = options || {}; + + // If no output stream given, send the output as string through the end callback + if (!outputStream) { + var output = ''; + this._outputStream = { + write: function (chunk, encoding, done) { output += chunk; done && done(); }, + end: function (done) { done && done(null, output); }, + }; + this._endStream = true; + } + else { + this._outputStream = outputStream; + this._endStream = options.end === undefined ? true : !!options.end; + } + + // Initialize writer, depending on the format + this._subject = null; + if (!(/triple|quad/i).test(options.format)) { + this._graph = ''; + this._prefixIRIs = Object.create(null); + options.prefixes && this.addPrefixes(options.prefixes); + } + else { + this._writeTriple = this._writeTripleLine; + } +} + +N3Writer.prototype = { + // ## Private methods + + // ### `_write` writes the argument to the output stream + _write: function (string, callback) { + this._outputStream.write(string, 'utf8', callback); + }, + + // ### `_writeTriple` writes the triple to the output stream + _writeTriple: function (subject, predicate, object, graph, done) { + try { + // Write the graph's label if it has changed + if (this._graph !== graph) { + // Close the previous graph and start the new one + this._write((this._subject === null ? '' : (this._graph ? '\n}\n' : '.\n')) + + (graph ? this._encodeIriOrBlankNode(graph) + ' {\n' : '')); + this._subject = null; + // Don't treat identical blank nodes as repeating graphs + this._graph = graph[0] !== '[' ? graph : ']'; + } + // Don't repeat the subject if it's the same + if (this._subject === subject) { + // Don't repeat the predicate if it's the same + if (this._predicate === predicate) + this._write(', ' + this._encodeObject(object), done); + // Same subject, different predicate + else + this._write(';\n ' + + this._encodePredicate(this._predicate = predicate) + ' ' + + this._encodeObject(object), done); + } + // Different subject; write the whole triple + else + this._write((this._subject === null ? '' : '.\n') + + this._encodeSubject(this._subject = subject) + ' ' + + this._encodePredicate(this._predicate = predicate) + ' ' + + this._encodeObject(object), done); + } + catch (error) { done && done(error); } + }, + + // ### `_writeTripleLine` writes the triple or quad to the output stream as a single line + _writeTripleLine: function (subject, predicate, object, graph, done) { + // Don't use prefixes + delete this._prefixMatch; + // Write the triple + try { + this._write(this._encodeIriOrBlankNode(subject) + ' ' + + this._encodeIriOrBlankNode(predicate) + ' ' + + this._encodeObject(object) + + (graph ? ' ' + this._encodeIriOrBlankNode(graph) + '.\n' : '.\n'), done); + } + catch (error) { done && done(error); } + }, + + // ### `_encodeIriOrBlankNode` represents an IRI or blank node + _encodeIriOrBlankNode: function (entity) { + // A blank node or list is represented as-is + var firstChar = entity[0]; + if (firstChar === '[' || firstChar === '(' || firstChar === '_' && entity[1] === ':') + return entity; + // Escape special characters + if (escape.test(entity)) + entity = entity.replace(escapeAll, characterReplacer); + // Try to represent the IRI as prefixed name + var prefixMatch = this._prefixRegex.exec(entity); + return !prefixMatch ? '<' + entity + '>' : + (!prefixMatch[1] ? entity : this._prefixIRIs[prefixMatch[1]] + prefixMatch[2]); + }, + + // ### `_encodeLiteral` represents a literal + _encodeLiteral: function (value, type, language) { + // Escape special characters + if (escape.test(value)) + value = value.replace(escapeAll, characterReplacer); + // Write the literal, possibly with type or language + if (language) + return '"' + value + '"@' + language; + else if (type) + return '"' + value + '"^^' + this._encodeIriOrBlankNode(type); + else + return '"' + value + '"'; + }, + + // ### `_encodeSubject` represents a subject + _encodeSubject: function (subject) { + if (subject[0] === '"') + throw new Error('A literal as subject is not allowed: ' + subject); + // Don't treat identical blank nodes as repeating subjects + if (subject[0] === '[') + this._subject = ']'; + return this._encodeIriOrBlankNode(subject); + }, + + // ### `_encodePredicate` represents a predicate + _encodePredicate: function (predicate) { + if (predicate[0] === '"') + throw new Error('A literal as predicate is not allowed: ' + predicate); + return predicate === RDF_TYPE ? 'a' : this._encodeIriOrBlankNode(predicate); + }, + + // ### `_encodeObject` represents an object + _encodeObject: function (object) { + // Represent an IRI or blank node + if (object[0] !== '"') + return this._encodeIriOrBlankNode(object); + // Represent a literal + var match = N3LiteralMatcher.exec(object); + if (!match) throw new Error('Invalid literal: ' + object); + return this._encodeLiteral(match[1], match[2], match[3]); + }, + + // ### `_blockedWrite` replaces `_write` after the writer has been closed + _blockedWrite: function () { + throw new Error('Cannot write because the writer has been closed.'); + }, + + // ### `addTriple` adds the triple to the output stream + addTriple: function (subject, predicate, object, graph, done) { + // The triple was given as a triple object, so shift parameters + if (object === undefined) + this._writeTriple(subject.subject, subject.predicate, subject.object, + subject.graph || '', predicate); + // The optional `graph` parameter was not provided + else if (typeof graph !== 'string') + this._writeTriple(subject, predicate, object, '', graph); + // The `graph` parameter was provided + else + this._writeTriple(subject, predicate, object, graph, done); + }, + + // ### `addTriples` adds the triples to the output stream + addTriples: function (triples) { + for (var i = 0; i < triples.length; i++) + this.addTriple(triples[i]); + }, + + // ### `addPrefix` adds the prefix to the output stream + addPrefix: function (prefix, iri, done) { + var prefixes = {}; + prefixes[prefix] = iri; + this.addPrefixes(prefixes, done); + }, + + // ### `addPrefixes` adds the prefixes to the output stream + addPrefixes: function (prefixes, done) { + // Add all useful prefixes + var prefixIRIs = this._prefixIRIs, hasPrefixes = false; + for (var prefix in prefixes) { + // Verify whether the prefix can be used and does not exist yet + var iri = prefixes[prefix]; + if (/[#\/]$/.test(iri) && prefixIRIs[iri] !== (prefix += ':')) { + hasPrefixes = true; + prefixIRIs[iri] = prefix; + // Finish a possible pending triple + if (this._subject !== null) { + this._write(this._graph ? '\n}\n' : '.\n'); + this._subject = null, this._graph = ''; + } + // Write prefix + this._write('@prefix ' + prefix + ' <' + iri + '>.\n'); + } + } + // Recreate the prefix matcher + if (hasPrefixes) { + var IRIlist = '', prefixList = ''; + for (var prefixIRI in prefixIRIs) { + IRIlist += IRIlist ? '|' + prefixIRI : prefixIRI; + prefixList += (prefixList ? '|' : '') + prefixIRIs[prefixIRI]; + } + IRIlist = IRIlist.replace(/[\]\/\(\)\*\+\?\.\\\$]/g, '\\$&'); + this._prefixRegex = new RegExp('^(?:' + prefixList + ')[^\/]*$|' + + '^(' + IRIlist + ')([a-zA-Z][\\-_a-zA-Z0-9]*)$'); + } + // End a prefix block with a newline + this._write(hasPrefixes ? '\n' : '', done); + }, + + // ### `blank` creates a blank node with the given content + blank: function (predicate, object) { + var children = predicate, child, length; + // Empty blank node + if (predicate === undefined) + children = []; + // Blank node passed as blank("predicate", "object") + else if (typeof predicate === 'string') + children = [{ predicate: predicate, object: object }]; + // Blank node passed as blank({ predicate: predicate, object: object }) + else if (!('length' in predicate)) + children = [predicate]; + + switch (length = children.length) { + // Generate an empty blank node + case 0: + return '[]'; + // Generate a non-nested one-triple blank node + case 1: + child = children[0]; + if (child.object[0] !== '[') + return '[ ' + this._encodePredicate(child.predicate) + ' ' + + this._encodeObject(child.object) + ' ]'; + // Generate a multi-triple or nested blank node + default: + var contents = '['; + // Write all triples in order + for (var i = 0; i < length; i++) { + child = children[i]; + // Write only the object is the predicate is the same as the previous + if (child.predicate === predicate) + contents += ', ' + this._encodeObject(child.object); + // Otherwise, write the predicate and the object + else { + contents += (i ? ';\n ' : '\n ') + + this._encodePredicate(child.predicate) + ' ' + + this._encodeObject(child.object); + predicate = child.predicate; + } + } + return contents + '\n]'; + } + }, + + // ### `list` creates a list node with the given content + list: function (elements) { + var length = elements && elements.length || 0, contents = new Array(length); + for (var i = 0; i < length; i++) + contents[i] = this._encodeObject(elements[i]); + return '(' + contents.join(' ') + ')'; + }, + + // ### `_prefixRegex` matches a prefixed name or IRI that begins with one of the added prefixes + _prefixRegex: /$0^/, + + // ### `end` signals the end of the output stream + end: function (done) { + // Finish a possible pending triple + if (this._subject !== null) { + this._write(this._graph ? '\n}\n' : '.\n'); + this._subject = null; + } + // Disallow further writing + this._write = this._blockedWrite; + + // Try to end the underlying stream, ensuring done is called exactly one time + var singleDone = done && function (error, result) { singleDone = null, done(error, result); }; + if (this._endStream) { + try { return this._outputStream.end(singleDone); } + catch (error) { /* error closing stream */ } + } + singleDone && singleDone(); + }, +}; + +// Replaces a character by its escaped version +function characterReplacer(character) { + // Replace a single character by its escaped version + var result = escapeReplacements[character]; + if (result === undefined) { + // Replace a single character with its 4-bit unicode escape sequence + if (character.length === 1) { + result = character.charCodeAt(0).toString(16); + result = '\\u0000'.substr(0, 6 - result.length) + result; + } + // Replace a surrogate pair with its 8-bit unicode escape sequence + else { + result = ((character.charCodeAt(0) - 0xD800) * 0x400 + + character.charCodeAt(1) + 0x2400).toString(16); + result = '\\U00000000'.substr(0, 10 - result.length) + result; + } + } + return result; +} + +// ## Exports + +// Export the `N3Writer` class as a whole. +module.exports = N3Writer; + +},{}]},{},[30]);