2019-01-10 12:43:45 +01:00
( function ( ) { function r ( e , n , t ) { function o ( i , f ) { if ( ! n [ i ] ) { if ( ! e [ i ] ) { var c = "function" == typeof require && require ; if ( ! f && c ) return c ( i , ! 0 ) ; if ( u ) return u ( i , ! 0 ) ; var a = new Error ( "Cannot find module '" + i + "'" ) ; throw a . code = "MODULE_NOT_FOUND" , a } var p = n [ i ] = { exports : { } } ; e [ i ] [ 0 ] . call ( p . exports , function ( r ) { var n = e [ i ] [ 1 ] [ r ] ; return o ( n || r ) } , p , p . exports , r , e , n , t ) } return n [ i ] . exports } for ( var u = "function" == typeof require && require , i = 0 ; i < t . length ; i ++ ) o ( t [ i ] ) ; return o } return r } ) ( ) ( { 1 : [ function ( require , module , exports ) {
var N3 = require ( 'n3' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var validate = function ( turtleStream , callback ) {
2019-01-10 12:43:45 +01:00
var parser = N3 . Parser ( { format : 'text/turtle' } ) ;
2018-02-16 11:16:18 +01:00
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*)$/
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var feedback = { warnings : [ ] , errors : [ ] } ;
2019-01-10 12:43:45 +01:00
2018-02-16 11:16:18 +01:00
parser . parse ( turtleStream , function ( error , triple , prefixes ) {
if ( error ) {
2019-01-10 12:43:45 +01:00
feedback . errors . push ( error . message ) ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( triple ) {
2019-01-10 12:43:45 +01:00
if ( triple . object . termType === 'literal' ) {
var value = triple . object . value ;
var type = triple . object . datatype ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
type = type . replace ( 'http://www.w3.org/2001/XMLSchema#' , '' ) ;
if ( regexp [ type ] && ! regexp [ type ] . test ( value ) ) {
2019-01-10 12:43:45 +01:00
feedback . warnings . push ( 'xsd:' , type , 'does not validate for literal. {' , triple . subject . value , triple . predicate . value , triple . object . value , '}' ) ;
2018-02-16 11:16:18 +01:00
}
}
} else {
callback ( feedback ) ;
}
} ) ;
} ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( typeof window !== 'undefined' ) {
window . validate = validate ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
module . exports = validate ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
} , { "n3" : 2 } ] , 2 : [ function ( require , module , exports ) {
2019-01-10 12:43:45 +01:00
module . exports = {
DataFactory : require ( './lib/N3DataFactory' ) ,
2018-02-16 11:16:18 +01:00
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' ) ,
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "./lib/N3DataFactory" : 4 , "./lib/N3Lexer" : 5 , "./lib/N3Parser" : 6 , "./lib/N3Store" : 7 , "./lib/N3StreamParser" : 8 , "./lib/N3StreamWriter" : 9 , "./lib/N3Util" : 10 , "./lib/N3Writer" : 11 } ] , 3 : [ function ( require , module , exports ) {
var RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' ,
XSD = 'http://www.w3.org/2001/XMLSchema#' ,
SWAP = 'http://www.w3.org/2000/10/swap/' ;
module . exports = {
xsd : {
decimal : XSD + 'decimal' ,
boolean : XSD + 'boolean' ,
double : XSD + 'double' ,
integer : XSD + 'integer' ,
string : XSD + 'string' ,
} ,
rdf : {
type : RDF + 'type' ,
nil : RDF + 'nil' ,
first : RDF + 'first' ,
rest : RDF + 'rest' ,
langString : RDF + 'langString' ,
} ,
owl : {
sameAs : 'http://www.w3.org/2002/07/owl#sameAs' ,
} ,
r : {
forSome : SWAP + 'reify#forSome' ,
forAll : SWAP + 'reify#forAll' ,
} ,
log : {
implies : SWAP + 'log#implies' ,
} ,
} ;
} , { } ] , 4 : [ function ( require , module , exports ) {
// N3.js implementations of the RDF/JS core data types
// See https://github.com/rdfjs/representation-task-force/blob/master/interface-spec.md
var namespaces = require ( './IRIs' ) ;
var rdf = namespaces . rdf ,
xsd = namespaces . xsd ;
var DataFactory , DEFAULTGRAPH ;
var _blankNodeCounter = 0 ;
// ## Term constructor
function Term ( id ) {
if ( ! ( this instanceof Term ) )
return new Term ( id ) ;
this . id = id ;
}
// ### Makes this class a subclass of the given type
Term . subclass = function subclass ( Type , name ) {
Type . prototype = Object . create ( this . prototype , {
constructor : { value : Type } ,
termType : { value : name || Type . name } ,
2018-02-16 11:16:18 +01:00
} ) ;
2019-01-10 12:43:45 +01:00
Type . subclass = subclass ;
} ;
// ### Returns whether this object represents the same term as the other
Term . prototype . equals = function ( other ) {
// If both terms were created by this library,
// equality can be computed through ids
if ( other instanceof Term )
return this . id === other . id ;
// Otherwise, compare term type and value
return ! ! other && this . termType === other . termType &&
this . value === other . value ;
} ;
// ### Returns a plain object representation of this term
Term . prototype . toJSON = function ( ) {
return {
termType : this . termType ,
value : this . value ,
} ;
} ;
// ### Constructs a term from the given internal string ID
function fromId ( id , factory ) {
factory = factory || DataFactory ;
// Falsy value or empty string indicate the default graph
if ( ! id )
return factory . defaultGraph ( ) ;
// Identify the term type based on the first character
switch ( id [ 0 ] ) {
case '_' : return factory . blankNode ( id . substr ( 2 ) ) ;
case '?' : return factory . variable ( id . substr ( 1 ) ) ;
case '"' :
// Shortcut for internal literals
if ( factory === DataFactory )
return new Literal ( id ) ;
// Literal without datatype or language
if ( id [ id . length - 1 ] === '"' )
return factory . literal ( id . substr ( 1 , id . length - 2 ) ) ;
// Literal with datatype or language
var endPos = id . lastIndexOf ( '"' , id . length - 1 ) ;
return factory . literal ( id . substr ( 1 , endPos - 1 ) ,
id [ endPos + 1 ] === '@' ? id . substr ( endPos + 2 )
: factory . namedNode ( id . substr ( endPos + 3 ) ) ) ;
default : return factory . namedNode ( id ) ;
}
}
// ### Constructs an internal string ID from the given term or ID string
function toId ( term ) {
if ( typeof term === 'string' )
return term ;
if ( term instanceof Term )
return term . id ;
if ( ! term )
return DEFAULTGRAPH . value ;
// Term instantiated with another library
switch ( term . termType ) {
case 'NamedNode' : return term . value ;
case 'BlankNode' : return '_:' + term . value ;
case 'Variable' : return '?' + term . value ;
case 'DefaultGraph' : return '' ;
case 'Literal' : return '"' + term . value + '"' +
( term . language ? '@' + term . language :
( term . datatype && term . datatype . value !== xsd . string ? '^^' + term . datatype . value : '' ) ) ;
default : throw new Error ( 'Unexpected termType: ' + term . termType ) ;
}
}
// ## NamedNode constructor
function NamedNode ( iri ) {
if ( ! ( this instanceof NamedNode ) )
return new NamedNode ( iri ) ;
this . id = iri ;
}
Term . subclass ( NamedNode , 'NamedNode' ) ;
// ### The IRI of this named node
Object . defineProperty ( NamedNode . prototype , 'value' , {
get : function ( ) { return this . id ; } ,
} ) ;
// ## BlankNode constructor
function BlankNode ( name ) {
if ( ! ( this instanceof BlankNode ) )
return new BlankNode ( name ) ;
this . id = '_:' + name ;
}
Term . subclass ( BlankNode , 'BlankNode' ) ;
// ### The name of this blank node
Object . defineProperty ( BlankNode . prototype , 'value' , {
get : function ( ) { return this . id . substr ( 2 ) ; } ,
} ) ;
// ## Variable constructor
function Variable ( name ) {
if ( ! ( this instanceof Variable ) )
return new Variable ( name ) ;
this . id = '?' + name ;
}
Term . subclass ( Variable , 'Variable' ) ;
// ### The name of this variable
Object . defineProperty ( Variable . prototype , 'value' , {
get : function ( ) { return this . id . substr ( 1 ) ; } ,
} ) ;
// ## Literal constructor
function Literal ( id ) {
if ( ! ( this instanceof Literal ) )
return new Literal ( id ) ;
this . id = id ;
}
Term . subclass ( Literal , 'Literal' ) ;
// ### The text value of this literal
Object . defineProperty ( Literal . prototype , 'value' , {
get : function ( ) {
return this . id . substring ( 1 , this . id . lastIndexOf ( '"' ) ) ;
} ,
} ) ;
// ### The language of this literal
Object . defineProperty ( Literal . prototype , 'language' , {
get : function ( ) {
// Find the last quotation mark (e.g., '"abc"@en-us')
var id = this . id , atPos = id . lastIndexOf ( '"' ) + 1 ;
// If "@" it follows, return the remaining substring; empty otherwise
return atPos < id . length && id [ atPos ++ ] === '@' ? id . substr ( atPos ) . toLowerCase ( ) : '' ;
} ,
} ) ;
// ### The datatype IRI of this literal
Object . defineProperty ( Literal . prototype , 'datatype' , {
get : function ( ) {
return new NamedNode ( this . datatypeString ) ;
} ,
2018-02-16 11:16:18 +01:00
} ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### The datatype string of this literal
Object . defineProperty ( Literal . prototype , 'datatypeString' , {
get : function ( ) {
// Find the last quotation mark (e.g., '"abc"^^http://ex.org/types#t')
var id = this . id , dtPos = id . lastIndexOf ( '"' ) + 1 , ch ;
// If "^" it follows, return the remaining substring
return dtPos < id . length && ( ch = id [ dtPos ] ) === '^' ? id . substr ( dtPos + 2 ) :
// If "@" follows, return rdf:langString; xsd:string otherwise
( ch !== '@' ? xsd . string : rdf . langString ) ;
} ,
} ) ;
// ### Returns whether this object represents the same term as the other
Literal . prototype . equals = function ( other ) {
// If both literals were created by this library,
// equality can be computed through ids
if ( other instanceof Literal )
return this . id === other . id ;
// Otherwise, compare term type, value, language, and datatype
return ! ! other && ! ! other . datatype &&
this . termType === other . termType &&
this . value === other . value &&
this . language === other . language &&
this . datatype . value === other . datatype . value ;
} ;
// ### Returns a plain object representation of this term
Literal . prototype . toJSON = function ( ) {
return {
termType : this . termType ,
value : this . value ,
language : this . language ,
datatype : { termType : 'NamedNode' , value : this . datatypeString } ,
} ;
} ;
// ## DefaultGraph singleton
function DefaultGraph ( ) {
return DEFAULTGRAPH || this ;
}
Term . subclass ( DefaultGraph , 'DefaultGraph' ) ;
// Initialize singleton
DEFAULTGRAPH = new DefaultGraph ( ) ;
DEFAULTGRAPH . id = '' ;
// ### The empty string
Object . defineProperty ( DefaultGraph . prototype , 'value' , { value : '' } ) ;
// ### Returns whether this object represents the same term as the other
DefaultGraph . prototype . equals = function ( other ) {
// If both terms were created by this library,
// equality can be computed through strict equality;
// otherwise, compare term types.
return ( this === other ) || ( ! ! other && ( this . termType === other . termType ) ) ;
} ;
// ## Quad constructor
function Quad ( subject , predicate , object , graph ) {
if ( ! ( this instanceof Quad ) )
return new Quad ( ) ;
this . subject = subject ;
this . predicate = predicate ;
this . object = object ;
this . graph = graph || DEFAULTGRAPH ;
}
// ### Returns a plain object representation of this quad
Quad . prototype . toJSON = function ( ) {
return {
subject : this . subject . toJSON ( ) ,
predicate : this . predicate . toJSON ( ) ,
object : this . object . toJSON ( ) ,
graph : this . graph . toJSON ( ) ,
} ;
} ;
// ### Returns whether this object represents the same quad as the other
Quad . prototype . equals = function ( other ) {
return ! ! other && this . subject . equals ( other . subject ) &&
this . predicate . equals ( other . predicate ) &&
this . object . equals ( other . object ) &&
this . graph . equals ( other . graph ) ;
} ;
// ## DataFactory functions
// ### Creates an IRI
function namedNode ( iri ) {
return new NamedNode ( iri ) ;
}
// ### Creates a blank node
function blankNode ( name ) {
if ( ! name )
name = 'n3-' + _blankNodeCounter ++ ;
return new BlankNode ( name ) ;
}
// ### Creates a literal
function literal ( value , languageOrDataType ) {
// Create a language-tagged string
if ( typeof languageOrDataType === 'string' )
return new Literal ( '"' + value + '"@' + languageOrDataType . toLowerCase ( ) ) ;
// Create a datatyped literal
var datatype = languageOrDataType && languageOrDataType . value || '' ;
if ( ! datatype ) {
switch ( typeof value ) {
// Convert a boolean
case 'boolean' :
datatype = xsd . boolean ;
break ;
// Convert an integer or double
case 'number' :
if ( Number . isFinite ( value ) )
datatype = Number . isInteger ( value ) ? xsd . integer : xsd . double ;
else {
datatype = xsd . double ;
if ( ! Number . isNaN ( value ) )
value = value > 0 ? 'INF' : '-INF' ;
}
break ;
// No datatype, so convert a plain string
default :
return new Literal ( '"' + value + '"' ) ;
}
}
return new Literal ( '"' + value + '"^^' + datatype ) ;
}
// ### Creates a variable
function variable ( name ) {
return new Variable ( name ) ;
}
// ### Returns the default graph
function defaultGraph ( ) {
return DEFAULTGRAPH ;
}
// ### Creates a quad
function quad ( subject , predicate , object , graph ) {
return new Quad ( subject , predicate , object , graph ) ;
}
// ## Module exports
module . exports = DataFactory = {
// ### Public factory functions
namedNode : namedNode ,
blankNode : blankNode ,
variable : variable ,
literal : literal ,
defaultGraph : defaultGraph ,
quad : quad ,
triple : quad ,
// ### Internal datatype constructors
internal : {
Term : Term ,
NamedNode : NamedNode ,
BlankNode : BlankNode ,
Variable : Variable ,
Literal : Literal ,
DefaultGraph : DefaultGraph ,
Quad : Quad ,
Triple : Quad ,
fromId : fromId ,
toId : toId ,
} ,
} ;
} , { "./IRIs" : 3 } ] , 5 : [ function ( require , module , exports ) {
( function ( setImmediate ) {
2018-02-16 11:16:18 +01:00
// **N3Lexer** tokenizes N3 documents.
2019-01-10 12:43:45 +01:00
var xsd = require ( './IRIs' ) . xsd ;
2018-02-16 11:16:18 +01:00
var fromCharCode = String . fromCharCode ;
var immediately = typeof setImmediate === 'function' ? setImmediate :
function setImmediate ( func ) { setTimeout ( func , 0 ) ; } ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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<>\\"\{\}\|\^\`]/ ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Constructor
function N3Lexer ( options ) {
if ( ! ( this instanceof N3Lexer ) )
return new N3Lexer ( options ) ;
options = options || { } ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// In line mode (N-Triples or N-Quads), only simple features may be parsed
if ( 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|blank|literal|langcode|typeIRI|\.|eof)$/ . test ( token . type ) )
callback && callback ( error , token ) ;
else
callback && callback ( error || self . _syntaxError ( token . type , callback = null ) ) ;
} ) ;
} ;
}
// Enable N3 functionality by default
this . _n3Mode = options . n3 !== false ;
// Disable comment tokens by default
this . _comments = ! ! options . comments ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
N3Lexer . prototype = {
// ## Regular expressions
// It's slightly faster to have these as properties than as in-scope variables
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
_iri : /^<((?:[^ <>{}\\]|\\[uU])+)>[ \t]*/ , // IRI with escape sequences; needs sanity check after unescaping
_unescapedIri : /^<([^\x00-\x20<>\\"\{\}\|\^\`]*)>[ \t]*/ , // IRI without escape sequences; no unescaping
2019-01-10 12:43:45 +01:00
_unescapedString : /^"([^"\\\r\n]+)"/ , // non-empty string without escape sequences
_singleQuotedString : /^"((?:[^"\\\r\n]|\\.)*)"(?=[^"])|^'((?:[^'\\\r\n]|\\.)*)'(?=[^'])/ ,
_tripleQuotedString : /^"""([^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*)"""|^'''([^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*)'''/ ,
2018-02-16 11:16:18 +01:00
_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}|\\[!#-\/;=?\-@_~]))?)?)(?:[ \t]+|(?=\.?[,;!\^\s#()\[\]\{\}"'<]))/ ,
_variable : /^\?(?:(?:[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-: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])*)(?=[.,;!\^\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])*)(?:[ \t]+|(?=\.?[,;:\s#()\[\]\{\}"'<]))/ ,
_number : /^[\-+]?(?:\d+\.?\d*([eE](?:[\-\+])?\d+)|\d*\.?\d+)(?=\.?[,;:\s#()\[\]\{\}"'<])/ ,
_boolean : /^(?:true|false)(?=[.,;\s#()\[\]\{\}"'<])/ ,
_keyword : /^@[a-z]+(?=[\s#<:])/i ,
_sparqlKeyword : /^(?:PREFIX|BASE|GRAPH)(?=[\s#<])/i ,
_shortPredicates : /^a(?=\s+|<)/ ,
_newline : /^[ \t]*(?:#[^\n\r]*)?(?:\r\n|\n|\r)[ \t]*/ ,
_comment : /#([^\n\r]*)/ ,
_whitespace : /^[ \t]+/ ,
_endOfFile : /^(?:#[^\n\r]*)?$/ ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Private methods
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_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 , outputComments = this . _comments ;
while ( true ) {
// Count and skip whitespace lines
var whiteSpaceMatch , comment ;
while ( whiteSpaceMatch = this . _newline . exec ( input ) ) {
// Try to find a comment
if ( outputComments && ( comment = this . _comment . exec ( whiteSpaceMatch [ 0 ] ) ) )
callback ( null , { line : this . _line , type : 'comment' , value : comment [ 1 ] , prefix : '' } ) ;
// Advance the 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 ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Stop for now if we're at the end
if ( this . _endOfFile . test ( input ) ) {
// If the input is finished, emit EOF
if ( inputFinished ) {
// Try to find a final comment
if ( outputComments && ( comment = this . _comment . exec ( input ) ) )
callback ( null , { line : this . _line , type : 'comment' , value : comment [ 1 ] , prefix : '' } ) ;
callback ( input = null , { line : this . _line , type : 'eof' , value : '' , prefix : '' } ) ;
}
return this . _input = input ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Look for specific token types based on the first character
var line = this . _line , type = '' , value = '' , prefix = '' ,
2019-01-10 12:43:45 +01:00
firstChar = input [ 0 ] , match = null , matchLength = 0 , inconclusive = false ;
2018-02-16 11:16:18 +01:00
switch ( firstChar ) {
case '^' :
// We need at least 3 tokens lookahead to distinguish ^^<IRI> and ^^pre:fixed
if ( input . length < 3 )
break ;
// Try to match a type
else if ( input [ 1 ] === '^' ) {
this . _previousMarker = '^^' ;
// Move to type IRI or prefixed name
input = input . substr ( 2 ) ;
if ( input [ 0 ] !== '<' ) {
inconclusive = true ;
break ;
}
}
// If no type, it must be a path expression
else {
if ( this . _n3Mode ) {
matchLength = 1 ;
type = '^' ;
}
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 ) ) {
2019-01-10 12:43:45 +01:00
value = this . _unescape ( match [ 1 ] ) ;
if ( value === null || illegalIriChars . test ( value ) )
2018-02-16 11:16:18 +01:00
return reportSyntaxError ( this ) ;
2019-01-10 12:43:45 +01:00
type = 'IRI' ;
2018-02-16 11:16:18 +01:00
}
// Try to find a backwards implication arrow
else if ( this . _n3Mode && input . length > 1 && input [ 1 ] === '=' )
2019-01-10 12:43:45 +01:00
type = 'inverse' , matchLength = 2 , value = '>' ;
2018-02-16 11:16:18 +01:00
break ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 blank node.
// 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 = 'blank' , prefix = '_' , value = match [ 1 ] ;
break ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case '"' :
case "'" :
// Try to find a non-empty double-quoted literal without escape sequences
if ( match = this . _unescapedString . exec ( input ) )
2019-01-10 12:43:45 +01:00
value = match [ 1 ] ;
2018-02-16 11:16:18 +01:00
// Try to find any other literal wrapped in a pair of single or double quotes
2019-01-10 12:43:45 +01:00
else if ( match = this . _singleQuotedString . exec ( input ) )
value = this . _unescape ( typeof match [ 1 ] === 'string' ? match [ 1 ] : match [ 2 ] ) ;
2018-02-16 11:16:18 +01:00
// Try to find a literal wrapped in three pairs of single or double quotes
else if ( match = this . _tripleQuotedString . exec ( input ) ) {
2019-01-10 12:43:45 +01:00
value = typeof match [ 1 ] === 'string' ? match [ 1 ] : match [ 2 ] ;
// Advance line counter
this . _line += value . split ( /\r\n|\r|\n/ ) . length - 1 ;
value = this . _unescape ( value ) ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
if ( value === null )
return reportSyntaxError ( this ) ;
if ( match !== null )
type = 'literal' ;
2018-02-16 11:16:18 +01:00
break ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case '?' :
// Try to find a variable
if ( this . _n3Mode && ( match = this . _variable . exec ( input ) ) )
type = 'var' , value = match [ 0 ] ;
break ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case '@' :
// Try to find a language code
if ( this . _previousMarker === '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. Since it can contain (but not end with) a dot,
// we always need a non-dot character before deciding it is a number.
// Therefore, try inserting a space if we're at the end of the input.
if ( match = this . _number . exec ( input ) ||
inputFinished && ( match = this . _number . exec ( input + ' ' ) ) ) {
2019-01-10 12:43:45 +01:00
type = 'literal' , value = match [ 0 ] ;
prefix = ( match [ 1 ] ? xsd . double :
( /^[+\-]?\d+$/ . test ( match [ 0 ] ) ? xsd . integer : xsd . decimal ) ) ;
2018-02-16 11:16:18 +01:00
}
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 ) )
2019-01-10 12:43:45 +01:00
type = 'literal' , value = match [ 0 ] , prefix = xsd . boolean ;
2018-02-16 11:16:18 +01:00
else
inconclusive = true ;
break ;
case 'a' :
// Try to find an abbreviated predicate
if ( match = this . _shortPredicates . exec ( input ) )
2019-01-10 12:43:45 +01:00
type = 'abbreviation' , value = 'a' ;
2018-02-16 11:16:18 +01:00
else
inconclusive = true ;
break ;
case '=' :
// Try to find an implication arrow or equals sign
if ( this . _n3Mode && input . length > 1 ) {
type = 'abbreviation' ;
if ( input [ 1 ] !== '>' )
2019-01-10 12:43:45 +01:00
matchLength = 1 , value = '=' ;
2018-02-16 11:16:18 +01:00
else
2019-01-10 12:43:45 +01:00
matchLength = 2 , value = '>' ;
2018-02-16 11:16:18 +01:00
}
break ;
case '!' :
if ( ! this . _n3Mode )
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 . _previousMarker === '@prefix' || this . _previousMarker === '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 . _previousMarker === '^^' ) {
switch ( type ) {
case 'prefixed' : type = 'type' ; break ;
case 'IRI' : type = 'typeIRI' ; break ;
default : 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
var token = { line : line , type : type , value : value , prefix : prefix } ;
callback ( null , token ) ;
this . previousToken = token ;
this . _previousMarker = type ;
// Advance to next part to tokenize
input = input . substr ( matchLength || match [ 0 ] . length , input . length ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
// 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 ;
}
} ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
catch ( error ) { return null ; }
} ,
// ### `_syntaxError` creates a syntax error for the given issue
_syntaxError : function ( issue ) {
this . _input = null ;
var err = new Error ( 'Unexpected "' + issue + '" on line ' + this . _line + '.' ) ;
err . context = {
token : undefined ,
line : this . _line ,
previousToken : this . previousToken ,
} ;
return err ;
} ,
// ## 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 ;
// If a callback was passed, asynchronously call it
if ( typeof callback === 'function' )
immediately ( function ( ) { self . _tokenizeToEnd ( callback , true ) ; } ) ;
// If no callback was passed, tokenize synchronously and return
else {
var tokens = [ ] , error ;
this . _tokenizeToEnd ( function ( e , t ) { e ? ( error = e ) : tokens . push ( t ) ; } , true ) ;
if ( error ) throw error ;
return tokens ;
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
// Otherwise, the input must be a stream
else {
this . _input = '' ;
if ( typeof input . setEncoding === 'function' )
input . setEncoding ( 'utf8' ) ;
// Adds the data chunk to the buffer and parses as far as possible
input . on ( 'data' , function ( data ) {
if ( self . _input !== null ) {
self . _input += data ;
self . _tokenizeToEnd ( callback , false ) ;
}
} ) ;
// Parses until the end
input . on ( 'end' , function ( ) {
if ( self . _input !== null )
self . _tokenizeToEnd ( callback , true ) ;
} ) ;
input . on ( 'error' , callback ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ,
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Exports
module . exports = N3Lexer ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} ) . call ( this , require ( "timers" ) . setImmediate )
} , { "./IRIs" : 3 , "timers" : 39 } ] , 6 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
// **N3Parser** parses N3 documents.
2019-01-10 12:43:45 +01:00
var N3Lexer = require ( './N3Lexer' ) ,
DataFactory = require ( './N3DataFactory' ) ,
namespaces = require ( './IRIs' ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Regexes for IRIs
2018-02-16 11:16:18 +01:00
var absoluteIRI = /^[a-z][a-z0-9+.-]*:/i ,
schemeAuthority = /^(?:([a-z][a-z0-9+.-]*:))?(?:\/\/[^\/]*)?/i ,
dotSegments = /(?:^|\/)\.\.?(?:$|[\/#?])/ ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// The next ID for new blank nodes
var blankNodePrefix = 0 , blankNodeCount = 0 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Constructor
function N3Parser ( options ) {
if ( ! ( this instanceof N3Parser ) )
return new N3Parser ( options ) ;
this . _contextStack = [ ] ;
this . _graph = null ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Set the document IRI
options = options || { } ;
2019-01-10 12:43:45 +01:00
this . _setBase ( options . baseIRI ) ;
options . factory && initDataFactory ( this , options . factory ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ) ,
isN3 = this . _n3Mode = /n3/ . test ( format ) ,
isLineMode = isNTriples || isNQuads ;
if ( ! ( this . _supportsNamedGraphs = ! ( isTurtle || isN3 ) ) )
this . _readPredicateOrNamedGraph = this . _readPredicate ;
this . _supportsQuads = ! ( isTurtle || isTriG || isNTriples || isN3 ) ;
// 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 ;
} ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
this . _blankNodePrefix = typeof options . blankNodePrefix !== 'string' ? '' :
2019-01-10 12:43:45 +01:00
options . blankNodePrefix . replace ( /^(?!_:)/ , '_:' ) ;
2018-02-16 11:16:18 +01:00
this . _lexer = options . lexer || new N3Lexer ( { lineMode : isLineMode , n3 : isN3 } ) ;
// Disable explicit quantifiers by default
this . _explicitQuantifiers = ! ! options . explicitQuantifiers ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Private class methods
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_resetBlankNodeIds` restarts blank node identification
N3Parser . _resetBlankNodeIds = function ( ) {
blankNodePrefix = blankNodeCount = 0 ;
} ;
N3Parser . prototype = {
// ## Private methods
2019-01-10 12:43:45 +01:00
// ### `_blank` creates a new blank node
_blank : function ( ) {
return this . _blankNode ( 'b' + blankNodeCount ++ ) ;
} ,
2018-02-16 11:16:18 +01:00
// ### `_setBase` sets the base IRI to resolve relative IRIs
_setBase : function ( baseIRI ) {
if ( ! baseIRI )
this . _base = null ;
else {
// Remove fragment if present
var fragmentPos = baseIRI . indexOf ( '#' ) ;
if ( fragmentPos >= 0 )
baseIRI = baseIRI . substr ( 0 , fragmentPos ) ;
// Set base IRI and its components
this . _base = baseIRI ;
this . _basePath = baseIRI . indexOf ( '/' ) < 0 ? baseIRI :
baseIRI . replace ( /[^\/?]*(?:\?.*)?$/ , '' ) ;
baseIRI = baseIRI . match ( schemeAuthority ) ;
this . _baseRoot = baseIRI [ 0 ] ;
this . _baseScheme = baseIRI [ 1 ] ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_saveContext` stores the current parsing context
// when entering a new scope (list, blank node, formula)
_saveContext : function ( type , graph , subject , predicate , object ) {
var n3Mode = this . _n3Mode ;
this . _contextStack . push ( {
subject : subject , predicate : predicate , object : object ,
graph : graph , type : type ,
inverse : n3Mode ? this . _inversePredicate : false ,
blankPrefix : n3Mode ? this . _prefixes . _ : '' ,
quantified : n3Mode ? this . _quantified : null ,
} ) ;
// The settings below only apply to N3 streams
if ( n3Mode ) {
// Every new scope resets the predicate direction
this . _inversePredicate = false ;
// In N3, blank nodes are scoped to a formula
// (using a dot as separator, as a blank node label cannot start with it)
2019-01-10 12:43:45 +01:00
this . _prefixes . _ = ( this . _graph ? this . _graph . id . substr ( 2 ) + '.' : '.' ) ;
2018-02-16 11:16:18 +01:00
// Quantifiers are scoped to a formula
this . _quantified = Object . create ( this . _quantified ) ;
}
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_restoreContext` restores the parent context
// when leaving a scope (list, blank node, formula)
_restoreContext : function ( ) {
var context = this . _contextStack . pop ( ) , n3Mode = this . _n3Mode ;
this . _subject = context . subject ;
this . _predicate = context . predicate ;
this . _object = context . object ;
this . _graph = context . graph ;
// The settings below only apply to N3 streams
if ( n3Mode ) {
this . _inversePredicate = context . inverse ;
this . _prefixes . _ = context . blankPrefix ;
this . _quantified = context . quantified ;
}
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_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 = true ;
case '@prefix' :
return this . _readPrefix ;
// It could be a base declaration
case 'BASE' :
this . _sparqlStyle = true ;
case '@base' :
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 ) ;
}
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_readEntity` reads an IRI, prefixed name, blank node, or variable
_readEntity : function ( token , quantifier ) {
var value ;
switch ( token . type ) {
// Read a relative or absolute IRI
case 'IRI' :
case 'typeIRI' :
2019-01-10 12:43:45 +01:00
value = this . _namedNode ( this . _base === null || absoluteIRI . test ( token . value ) ?
token . value : this . _resolveIRI ( token ) ) ;
2018-02-16 11:16:18 +01:00
break ;
2019-01-10 12:43:45 +01:00
// Read a prefixed name
2018-02-16 11:16:18 +01:00
case 'type' :
case 'prefixed' :
var prefix = this . _prefixes [ token . prefix ] ;
if ( prefix === undefined )
return this . _error ( 'Undefined prefix "' + token . prefix + ':"' , token ) ;
2019-01-10 12:43:45 +01:00
value = this . _namedNode ( prefix + token . value ) ;
break ;
// Read a blank node
case 'blank' :
value = this . _blankNode ( this . _prefixes [ token . prefix ] + token . value ) ;
2018-02-16 11:16:18 +01:00
break ;
// Read a variable
case 'var' :
2019-01-10 12:43:45 +01:00
value = this . _variable ( token . value . substr ( 1 ) ) ;
break ;
2018-02-16 11:16:18 +01:00
// Everything else is not an entity
default :
return this . _error ( 'Expected entity but got ' + token . type , token ) ;
}
// In N3 mode, replace the entity if it is quantified
2019-01-10 12:43:45 +01:00
if ( ! quantifier && this . _n3Mode && ( value . id in this . _quantified ) )
value = this . _quantified [ value . id ] ;
2018-02-16 11:16:18 +01:00
return value ;
} ,
2019-01-10 12:43:45 +01:00
// ### `_readSubject` reads a quad's subject
2018-02-16 11:16:18 +01:00
_readSubject : function ( token ) {
this . _predicate = null ;
switch ( token . type ) {
case '[' :
2019-01-10 12:43:45 +01:00
// Start a new quad with a new blank node as subject
2018-02-16 11:16:18 +01:00
this . _saveContext ( 'blank' , this . _graph ,
2019-01-10 12:43:45 +01:00
this . _subject = this . _blank ( ) , null , null ) ;
2018-02-16 11:16:18 +01:00
return this . _readBlankNodeHead ;
case '(' :
// Start a new list
2019-01-10 12:43:45 +01:00
this . _saveContext ( 'list' , this . _graph , this . RDF _NIL , null , null ) ;
2018-02-16 11:16:18 +01:00
this . _subject = null ;
return this . _readListItem ;
case '{' :
// Start a new formula
if ( ! this . _n3Mode )
return this . _error ( 'Unexpected graph' , token ) ;
this . _saveContext ( 'formula' , this . _graph ,
2019-01-10 12:43:45 +01:00
this . _graph = this . _blank ( ) , null , null ) ;
2018-02-16 11:16:18 +01:00
return this . _readSubject ;
case '}' :
// No subject; the graph in which we are reading is closed instead
return this . _readPunctuation ( token ) ;
case '@forSome' :
if ( ! this . _n3Mode )
return this . _error ( 'Unexpected "@forSome"' , token ) ;
this . _subject = null ;
2019-01-10 12:43:45 +01:00
this . _predicate = this . N3 _FORSOME ;
this . _quantifier = this . _blankNode ;
2018-02-16 11:16:18 +01:00
return this . _readQuantifierList ;
case '@forAll' :
if ( ! this . _n3Mode )
return this . _error ( 'Unexpected "@forAll"' , token ) ;
this . _subject = null ;
2019-01-10 12:43:45 +01:00
this . _predicate = this . N3 _FORALL ;
this . _quantifier = this . _variable ;
2018-02-16 11:16:18 +01:00
return this . _readQuantifierList ;
default :
// Read the subject entity
if ( ( this . _subject = this . _readEntity ( token ) ) === undefined )
return ;
// In N3 mode, the subject might be a path
if ( this . _n3Mode )
return this . _getPathReader ( this . _readPredicateOrNamedGraph ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// The next token must be a predicate,
// or, if the subject was actually a graph IRI, a named graph
return this . _readPredicateOrNamedGraph ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_readPredicate` reads a quad's predicate
2018-02-16 11:16:18 +01:00
_readPredicate : function ( token ) {
var type = token . type ;
switch ( type ) {
case 'inverse' :
this . _inversePredicate = true ;
case 'abbreviation' :
2019-01-10 12:43:45 +01:00
this . _predicate = this . ABBREVIATIONS [ token . value ] ;
2018-02-16 11:16:18 +01:00
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 ';' :
// Additional semicolons can be safely ignored
return this . _predicate !== null ? this . _readPredicate :
this . _error ( 'Expected predicate but got ;' , token ) ;
case 'blank' :
if ( ! this . _n3Mode )
return this . _error ( 'Disallowed blank node as predicate' , token ) ;
default :
if ( ( this . _predicate = this . _readEntity ( token ) ) === undefined )
return ;
}
// The next token must be an object
return this . _readObject ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_readObject` reads a quad's object
2018-02-16 11:16:18 +01:00
_readObject : function ( token ) {
switch ( token . type ) {
case 'literal' :
2019-01-10 12:43:45 +01:00
// Regular literal, can still get a datatype or language
if ( token . prefix . length === 0 ) {
this . _literalValue = token . value ;
return this . _readDataTypeOrLang ;
}
// Pre-datatyped string literal (prefix stores the datatype)
else
this . _object = this . _literal ( token . value , this . _namedNode ( token . prefix ) ) ;
break ;
2018-02-16 11:16:18 +01:00
case '[' :
2019-01-10 12:43:45 +01:00
// Start a new quad with a new blank node as subject
2018-02-16 11:16:18 +01:00
this . _saveContext ( 'blank' , this . _graph , this . _subject , this . _predicate ,
2019-01-10 12:43:45 +01:00
this . _subject = this . _blank ( ) ) ;
2018-02-16 11:16:18 +01:00
return this . _readBlankNodeHead ;
case '(' :
// Start a new list
2019-01-10 12:43:45 +01:00
this . _saveContext ( 'list' , this . _graph , this . _subject , this . _predicate , this . RDF _NIL ) ;
2018-02-16 11:16:18 +01:00
this . _subject = null ;
return this . _readListItem ;
case '{' :
// Start a new formula
if ( ! this . _n3Mode )
return this . _error ( 'Unexpected graph' , token ) ;
this . _saveContext ( 'formula' , this . _graph , this . _subject , this . _predicate ,
2019-01-10 12:43:45 +01:00
this . _graph = this . _blank ( ) ) ;
2018-02-16 11:16:18 +01:00
return this . _readSubject ;
default :
// Read the object entity
if ( ( this . _object = this . _readEntity ( token ) ) === undefined )
return ;
// In N3 mode, the object might be a path
if ( this . _n3Mode )
return this . _getPathReader ( this . _getContextEndReader ( ) ) ;
}
return this . _getContextEndReader ( ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_readPredicateOrNamedGraph` reads a quad's predicate, or a named graph
2018-02-16 11:16:18 +01:00
_readPredicateOrNamedGraph : function ( token ) {
return token . type === '{' ? this . _readGraph ( token ) : this . _readPredicate ( token ) ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_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 ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_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 ) ;
}
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_readBlankNodeTail` reads the end of a blank node
_readBlankNodeTail : function ( token ) {
if ( token . type !== ']' )
return this . _readBlankNodePunctuation ( token ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Store blank node quad
2018-02-16 11:16:18 +01:00
if ( this . _subject !== null )
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . _predicate , this . _object , this . _graph ) ;
2018-02-16 11:16:18 +01:00
// Restore the parent context containing this blank node
var empty = this . _predicate === null ;
this . _restoreContext ( ) ;
// If the blank node was the subject, continue reading the predicate
if ( this . _object === null )
// If the blank node was empty, it could be a named graph label
return empty ? this . _readPredicateOrNamedGraph : this . _readPredicateAfterBlank ;
// If the blank node was the object, restore previous context and read punctuation
else
return this . _getContextEndReader ( ) ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_readPredicateAfterBlank` reads a predicate after an anonymous blank node
_readPredicateAfterBlank : function ( token ) {
// If a dot follows a blank node in top context, there is no predicate
if ( token . type === '.' && ! this . _contextStack . length ) {
2019-01-10 12:43:45 +01:00
this . _subject = null ; // cancel the current quad
2018-02-16 11:16:18 +01:00
return this . _readPunctuation ( token ) ;
}
return this . _readPredicate ( token ) ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_readListItem` reads items from a list
_readListItem : function ( token ) {
var item = null , // The item of the list
list = null , // The list itself
prevList = this . _subject , // The previous list that contains this list
stack = this . _contextStack , // The stack of parent contexts
parent = stack [ stack . length - 1 ] , // The parent containing the current list
2019-01-10 12:43:45 +01:00
next = this . _readListItem ; // The next function to execute
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
switch ( token . type ) {
case '[' :
2019-01-10 12:43:45 +01:00
// Stack the current list quad and start a new quad with a blank node as subject
this . _saveContext ( 'blank' , this . _graph ,
list = this . _blank ( ) , this . RDF _FIRST ,
this . _subject = item = this . _blank ( ) ) ;
2018-02-16 11:16:18 +01:00
next = this . _readBlankNodeHead ;
break ;
case '(' :
2019-01-10 12:43:45 +01:00
// Stack the current list quad and start a new list
this . _saveContext ( 'list' , this . _graph ,
list = this . _blank ( ) , this . RDF _FIRST , this . RDF _NIL ) ;
2018-02-16 11:16:18 +01:00
this . _subject = null ;
break ;
case ')' :
// Closing the list; restore the parent context
this . _restoreContext ( ) ;
2019-01-10 12:43:45 +01:00
// If this list is contained within a parent list, return the membership quad here.
2018-02-16 11:16:18 +01:00
// This will be `<parent list element> rdf:first <this list>.`.
if ( stack . length !== 0 && stack [ stack . length - 1 ] . type === 'list' )
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . _predicate , this . _object , this . _graph ) ;
2018-02-16 11:16:18 +01:00
// Was this list the parent's subject?
if ( this . _predicate === null ) {
// The next token is the predicate
next = this . _readPredicate ;
// No list tail if this was an empty list
2019-01-10 12:43:45 +01:00
if ( this . _subject === this . RDF _NIL )
2018-02-16 11:16:18 +01:00
return next ;
}
// The list was in the parent context's object
else {
next = this . _getContextEndReader ( ) ;
// No list tail if this was an empty list
2019-01-10 12:43:45 +01:00
if ( this . _object === this . RDF _NIL )
2018-02-16 11:16:18 +01:00
return next ;
}
// Close the list by making the head nil
2019-01-10 12:43:45 +01:00
list = this . RDF _NIL ;
2018-02-16 11:16:18 +01:00
break ;
case 'literal' :
2019-01-10 12:43:45 +01:00
// Regular literal, can still get a datatype or language
if ( token . prefix . length === 0 ) {
this . _literalValue = token . value ;
next = this . _readListItemDataTypeOrLang ;
}
// Pre-datatyped string literal (prefix stores the datatype)
else {
item = this . _literal ( token . value , this . _namedNode ( token . prefix ) ) ;
next = this . _getContextEndReader ( ) ;
}
2018-02-16 11:16:18 +01:00
break ;
default :
if ( ( item = this . _readEntity ( token ) ) === undefined )
return ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// Create a new blank node if no item head was assigned yet
if ( list === null )
2019-01-10 12:43:45 +01:00
this . _subject = list = this . _blank ( ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Is this the first element of the list?
if ( prevList === null ) {
// This list is either the subject or the object of its parent
if ( parent . predicate === null )
parent . subject = list ;
else
parent . object = list ;
}
else {
// Continue the previous list with the current list
2019-01-10 12:43:45 +01:00
this . _emit ( prevList , this . RDF _REST , list , this . _graph ) ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
// If an item was read, add it to the list
2018-02-16 11:16:18 +01:00
if ( item !== null ) {
// In N3 mode, the item might be a path
if ( this . _n3Mode && ( token . type === 'IRI' || token . type === 'prefixed' ) ) {
// Create a new context to add the item's path
2019-01-10 12:43:45 +01:00
this . _saveContext ( 'item' , this . _graph , list , this . RDF _FIRST , item ) ;
2018-02-16 11:16:18 +01:00
this . _subject = item , this . _predicate = null ;
// _readPath will restore the context and output the item
return this . _getPathReader ( this . _readListItem ) ;
}
2019-01-10 12:43:45 +01:00
// Output the item
this . _emit ( list , this . RDF _FIRST , item , this . _graph ) ;
2018-02-16 11:16:18 +01:00
}
return next ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_readDataTypeOrLang` reads an _optional_ datatype or language
2018-02-16 11:16:18 +01:00
_readDataTypeOrLang : function ( token ) {
return this . _completeLiteral ( token , false ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_readListItemDataTypeOrLang` reads an _optional_ datatype or language in a list
2018-02-16 11:16:18 +01:00
_readListItemDataTypeOrLang : function ( token ) {
return this . _completeLiteral ( token , true ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_completeLiteral` completes a literal with an optional datatype or language
2018-02-16 11:16:18 +01:00
_completeLiteral : function ( token , listItem ) {
switch ( token . type ) {
2019-01-10 12:43:45 +01:00
// Create a datatyped literal
2018-02-16 11:16:18 +01:00
case 'type' :
case 'typeIRI' :
2019-01-10 12:43:45 +01:00
var datatype = this . _readEntity ( token ) ;
if ( datatype === undefined ) return ; // No datatype means an error occurred
this . _object = this . _literal ( this . _literalValue , datatype ) ;
token = null ;
2018-02-16 11:16:18 +01:00
break ;
2019-01-10 12:43:45 +01:00
// Create a language-tagged string
2018-02-16 11:16:18 +01:00
case 'langcode' :
2019-01-10 12:43:45 +01:00
this . _object = this . _literal ( this . _literalValue , token . value ) ;
token = null ;
2018-02-16 11:16:18 +01:00
break ;
2019-01-10 12:43:45 +01:00
// Create a simple string literal
default :
this . _object = this . _literal ( this . _literalValue ) ;
2018-02-16 11:16:18 +01:00
}
// If this literal was part of a list, write the item
// (we could also check the context stack, but passing in a flag is faster)
if ( listItem )
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . RDF _FIRST , this . _object , this . _graph ) ;
// If the token was consumed, continue with the rest of the input
if ( token === null )
2018-02-16 11:16:18 +01:00
return this . _getContextEndReader ( ) ;
2019-01-10 12:43:45 +01:00
// Otherwise, consume the token now
2018-02-16 11:16:18 +01:00
else {
this . _readCallback = this . _getContextEndReader ( ) ;
return this . _readCallback ( token ) ;
}
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_readFormulaTail` reads the end of a formula
_readFormulaTail : function ( token ) {
if ( token . type !== '}' )
return this . _readPunctuation ( token ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Store the last quad of the formula
2018-02-16 11:16:18 +01:00
if ( this . _subject !== null )
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . _predicate , this . _object , this . _graph ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Restore the parent context containing this formula
this . _restoreContext ( ) ;
// If the formula was the subject, continue reading the predicate.
// If the formula was the object, read punctuation.
return this . _object === null ? this . _readPredicate : this . _getContextEndReader ( ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_readPunctuation` reads punctuation between quads or quad parts
2018-02-16 11:16:18 +01:00
_readPunctuation : function ( token ) {
var next , subject = this . _subject , graph = this . _graph ,
inversePredicate = this . _inversePredicate ;
switch ( token . type ) {
// A closing brace ends a graph
case '}' :
if ( this . _graph === null )
return this . _error ( 'Unexpected graph closing' , token ) ;
if ( this . _n3Mode )
return this . _readFormulaTail ( token ) ;
this . _graph = null ;
// A dot just ends the statement, without sharing anything with the next
case '.' :
this . _subject = null ;
next = this . _contextStack . length ? this . _readSubject : this . _readInTopContext ;
if ( inversePredicate ) this . _inversePredicate = false ;
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 ;
default :
// An entity means this is a quad (only allowed if not already inside a graph)
if ( this . _supportsQuads && this . _graph === null && ( graph = this . _readEntity ( token ) ) !== undefined ) {
next = this . _readQuadPunctuation ;
break ;
}
2019-01-10 12:43:45 +01:00
return this . _error ( 'Expected punctuation to follow "' + this . _object . id + '"' , token ) ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
// A quad has been completed now, so return it
2018-02-16 11:16:18 +01:00
if ( subject !== null ) {
var predicate = this . _predicate , object = this . _object ;
if ( ! inversePredicate )
2019-01-10 12:43:45 +01:00
this . _emit ( subject , predicate , object , graph ) ;
2018-02-16 11:16:18 +01:00
else
2019-01-10 12:43:45 +01:00
this . _emit ( object , predicate , subject , graph ) ;
2018-02-16 11:16:18 +01:00
}
return next ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_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 :
2019-01-10 12:43:45 +01:00
return this . _error ( 'Expected punctuation to follow "' + this . _object . id + '"' , token ) ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
// A quad has been completed now, so return it
this . _emit ( this . _subject , this . _predicate , this . _object , this . _graph ) ;
2018-02-16 11:16:18 +01:00
return next ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_readQuadPunctuation` reads punctuation after a quad
_readQuadPunctuation : function ( token ) {
if ( token . type !== '.' )
return this . _error ( 'Expected dot to follow quad' , token ) ;
return this . _readInTopContext ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_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 ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_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 ) ;
2019-01-10 12:43:45 +01:00
var prefixNode = this . _readEntity ( token ) ;
this . _prefixes [ this . _prefix ] = prefixNode . value ;
this . _prefixCallback ( this . _prefix , prefixNode ) ;
2018-02-16 11:16:18 +01:00
return this . _readDeclarationPunctuation ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_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 ) ;
this . _setBase ( this . _base === null || absoluteIRI . test ( token . value ) ?
token . value : this . _resolveIRI ( token ) ) ;
return this . _readDeclarationPunctuation ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_readNamedGraphLabel` reads the label of a named graph
_readNamedGraphLabel : function ( token ) {
switch ( token . type ) {
case 'IRI' :
case 'blank' :
case 'prefixed' :
return this . _readSubject ( token ) , this . _readGraph ;
case '[' :
return this . _readNamedGraphBlankLabel ;
default :
return this . _error ( 'Invalid graph label' , token ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_readNamedGraphLabel` reads a blank node label of a named graph
_readNamedGraphBlankLabel : function ( token ) {
if ( token . type !== ']' )
return this . _error ( 'Invalid graph label' , token ) ;
2019-01-10 12:43:45 +01:00
this . _subject = this . _blank ( ) ;
2018-02-16 11:16:18 +01:00
return this . _readGraph ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_readDeclarationPunctuation` reads the punctuation of a declaration
_readDeclarationPunctuation : function ( token ) {
// SPARQL-style declarations don't have punctuation
if ( this . _sparqlStyle ) {
this . _sparqlStyle = false ;
return this . _readInTopContext ( token ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
if ( token . type !== '.' )
return this . _error ( 'Expected declaration to end with a dot' , token ) ;
return this . _readInTopContext ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Reads a list of quantified symbols from a @forSome or @forAll statement
_readQuantifierList : function ( token ) {
var entity ;
switch ( token . type ) {
case 'IRI' :
case 'prefixed' :
if ( ( entity = this . _readEntity ( token , true ) ) !== undefined )
break ;
default :
return this . _error ( 'Unexpected ' + token . type , token ) ;
}
// Without explicit quantifiers, map entities to a quantified entity
if ( ! this . _explicitQuantifiers )
2019-01-10 12:43:45 +01:00
this . _quantified [ entity . id ] = this . _quantifier ( 'b' + blankNodeCount ++ ) ;
2018-02-16 11:16:18 +01:00
// With explicit quantifiers, output the reified quantifier
else {
// If this is the first item, start a new quantifier list
if ( this . _subject === null )
2019-01-10 12:43:45 +01:00
this . _emit ( this . _graph || this . DEFAULTGRAPH , this . _predicate ,
this . _subject = this . _blank ( ) , this . QUANTIFIERS _GRAPH ) ;
2018-02-16 11:16:18 +01:00
// Otherwise, continue the previous list
else
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . RDF _REST ,
this . _subject = this . _blank ( ) , this . QUANTIFIERS _GRAPH ) ;
2018-02-16 11:16:18 +01:00
// Output the list item
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . RDF _FIRST , entity , this . QUANTIFIERS _GRAPH ) ;
2018-02-16 11:16:18 +01:00
}
return this . _readQuantifierPunctuation ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Reads punctuation from a @forSome or @forAll statement
_readQuantifierPunctuation : function ( token ) {
// Read more quantifiers
if ( token . type === ',' )
return this . _readQuantifierList ;
// End of the quantifier list
else {
// With explicit quantifiers, close the quantifier list
if ( this . _explicitQuantifiers ) {
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . RDF _REST , this . RDF _NIL , this . QUANTIFIERS _GRAPH ) ;
2018-02-16 11:16:18 +01:00
this . _subject = null ;
}
// Read a dot
this . _readCallback = this . _getContextEndReader ( ) ;
return this . _readCallback ( token ) ;
}
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_getPathReader` reads a potential path and then resumes with the given function
_getPathReader : function ( afterPath ) {
this . _afterPath = afterPath ;
return this . _readPath ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_readPath` reads a potential path
_readPath : function ( token ) {
switch ( token . type ) {
// Forward path
case '!' : return this . _readForwardPath ;
// Backward path
case '^' : return this . _readBackwardPath ;
// Not a path; resume reading where we left off
default :
var stack = this . _contextStack , parent = stack . length && stack [ stack . length - 1 ] ;
// If we were reading a list item, we still need to output it
if ( parent && parent . type === 'item' ) {
// The list item is the remaining subejct after reading the path
var item = this . _subject ;
// Switch back to the context of the list
this . _restoreContext ( ) ;
// Output the list item
2019-01-10 12:43:45 +01:00
this . _emit ( this . _subject , this . RDF _FIRST , item , this . _graph ) ;
2018-02-16 11:16:18 +01:00
}
return this . _afterPath ( token ) ;
}
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_readForwardPath` reads a '!' path
_readForwardPath : function ( token ) {
2019-01-10 12:43:45 +01:00
var subject , predicate , object = this . _blank ( ) ;
2018-02-16 11:16:18 +01:00
// The next token is the predicate
if ( ( predicate = this . _readEntity ( token ) ) === undefined )
return ;
// If we were reading a subject, replace the subject by the path's object
if ( this . _predicate === null )
subject = this . _subject , this . _subject = object ;
// If we were reading an object, replace the subject by the path's object
else
subject = this . _object , this . _object = object ;
2019-01-10 12:43:45 +01:00
// Emit the path's current quad and read its next section
this . _emit ( subject , predicate , object , this . _graph ) ;
2018-02-16 11:16:18 +01:00
return this . _readPath ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_readBackwardPath` reads a '^' path
_readBackwardPath : function ( token ) {
2019-01-10 12:43:45 +01:00
var subject = this . _blank ( ) , predicate , object ;
2018-02-16 11:16:18 +01:00
// The next token is the predicate
if ( ( predicate = this . _readEntity ( token ) ) === undefined )
return ;
// If we were reading a subject, replace the subject by the path's subject
if ( this . _predicate === null )
object = this . _subject , this . _subject = subject ;
// If we were reading an object, replace the subject by the path's subject
else
object = this . _object , this . _object = subject ;
2019-01-10 12:43:45 +01:00
// Emit the path's current quad and read its next section
this . _emit ( subject , predicate , object , this . _graph ) ;
2018-02-16 11:16:18 +01:00
return this . _readPath ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_getContextEndReader` gets the next reader function at the end of a context
_getContextEndReader : function ( ) {
var contextStack = this . _contextStack ;
if ( ! contextStack . length )
return this . _readPunctuation ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
switch ( contextStack [ contextStack . length - 1 ] . type ) {
case 'blank' :
return this . _readBlankNodeTail ;
case 'list' :
return this . _readListItem ;
case 'formula' :
return this . _readFormulaTail ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_emit` sends a quad through the callback
_emit : function ( subject , predicate , object , graph ) {
this . _callback ( null , this . _quad ( subject , predicate , object , graph || this . DEFAULTGRAPH ) ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_error` emits an error message through the callback
_error : function ( message , token ) {
var err = new Error ( message + ' on line ' + token . line + '.' ) ;
err . context = {
token : token ,
line : token . line ,
previousToken : this . _lexer . previousToken ,
} ;
this . _callback ( err ) ;
2019-01-10 12:43:45 +01:00
this . _callback = noop ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_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 ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_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 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 = '/' ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
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 ] ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return result + iri . substring ( segmentStart ) ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Public methods
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `parse` parses the N3 input and emits each parsed quad through the callback
parse : function ( input , quadCallback , prefixCallback ) {
2018-02-16 11:16:18 +01:00
var self = this ;
// 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 . _sparqlStyle = false ;
this . _prefixes = Object . create ( null ) ;
2019-01-10 12:43:45 +01:00
this . _prefixes . _ = this . _blankNodePrefix ? this . _blankNodePrefix . substr ( 2 )
: 'b' + blankNodePrefix ++ + '_' ;
2018-02-16 11:16:18 +01:00
this . _prefixCallback = prefixCallback || noop ;
this . _inversePredicate = false ;
this . _quantified = Object . create ( null ) ;
2019-01-10 12:43:45 +01:00
// Parse synchronously if no quad callback is given
if ( ! quadCallback ) {
var quads = [ ] , error ;
this . _callback = function ( e , t ) { e ? ( error = e ) : t && quads . push ( t ) ; } ;
2018-02-16 11:16:18 +01:00
this . _lexer . tokenize ( input ) . every ( function ( token ) {
return self . _readCallback = self . _readCallback ( token ) ;
} ) ;
if ( error ) throw error ;
2019-01-10 12:43:45 +01:00
return quads ;
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Parse asynchronously otherwise, executing the read callback when a token arrives
2019-01-10 12:43:45 +01:00
this . _callback = quadCallback ;
2018-02-16 11:16:18 +01:00
this . _lexer . tokenize ( input , function ( error , token ) {
if ( error !== null )
self . _callback ( error ) , self . _callback = noop ;
else if ( self . _readCallback )
self . _readCallback = self . _readCallback ( token ) ;
} ) ;
} ,
} ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// The empty function
function noop ( ) { }
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// Initializes the parser with the given data factory
function initDataFactory ( parser , factory ) {
// Set factory methods
var namedNode = factory . namedNode ;
parser . _namedNode = namedNode ;
parser . _blankNode = factory . blankNode ;
parser . _literal = factory . literal ;
parser . _variable = factory . variable ;
parser . _quad = factory . quad ;
parser . DEFAULTGRAPH = factory . defaultGraph ( ) ;
// Set common named nodes
parser . RDF _FIRST = namedNode ( namespaces . rdf . first ) ;
parser . RDF _REST = namedNode ( namespaces . rdf . rest ) ;
parser . RDF _NIL = namedNode ( namespaces . rdf . nil ) ;
parser . N3 _FORALL = namedNode ( namespaces . r . forAll ) ;
parser . N3 _FORSOME = namedNode ( namespaces . r . forSome ) ;
parser . ABBREVIATIONS = {
'a' : namedNode ( namespaces . rdf . type ) ,
'=' : namedNode ( namespaces . owl . sameAs ) ,
'>' : namedNode ( namespaces . log . implies ) ,
} ;
parser . QUANTIFIERS _GRAPH = namedNode ( 'urn:n3:quantifiers' ) ;
}
initDataFactory ( N3Parser . prototype , DataFactory ) ;
2018-02-16 11:16:18 +01:00
// ## Exports
module . exports = N3Parser ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
} , { "./IRIs" : 3 , "./N3DataFactory" : 4 , "./N3Lexer" : 5 } ] , 7 : [ function ( require , module , exports ) {
// **N3Store** objects store N3 quads by graph in memory.
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
var DataFactory = require ( './N3DataFactory' ) ;
var toId = DataFactory . internal . toId ,
fromId = DataFactory . internal . fromId ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ## Constructor
2019-01-10 12:43:45 +01:00
function N3Store ( quads , options ) {
2018-02-16 11:16:18 +01:00
if ( ! ( this instanceof N3Store ) )
2019-01-10 12:43:45 +01:00
return new N3Store ( quads , options ) ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// The number of quads is initially zero
2018-02-16 11:16:18 +01:00
this . _size = 0 ;
// `_graphs` contains subject, predicate, and object indexes per graph
this . _graphs = Object . create ( null ) ;
// `_ids` maps entities such as `http://xmlns.com/foaf/0.1/name` to numbers,
// saving memory by using only numbers as keys in `_graphs`
this . _id = 0 ;
this . _ids = Object . create ( null ) ;
this . _ids [ '><' ] = 0 ; // dummy entry, so the first actual key is non-zero
this . _entities = Object . create ( null ) ; // inverse of `_ids`
// `_blankNodeIndex` is the index of the last automatically named blank node
this . _blankNodeIndex = 0 ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// Shift parameters if `quads` is not given
if ( ! options && quads && ! quads [ 0 ] )
options = quads , quads = null ;
2018-02-16 11:16:18 +01:00
options = options || { } ;
2019-01-10 12:43:45 +01:00
this . _factory = options . factory || DataFactory ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// Add quads if passed
if ( quads )
this . addQuads ( quads ) ;
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
N3Store . prototype = {
// ## Public properties
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `size` returns the number of quads in the store
2018-02-16 11:16:18 +01:00
get size ( ) {
2019-01-10 12:43:45 +01:00
// Return the quad count if if was cached
2018-02-16 11:16:18 +01:00
var size = this . _size ;
if ( size !== null )
return size ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// Calculate the number of quads by counting to the deepest level
2018-02-16 11:16:18 +01:00
size = 0 ;
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 ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ## Private methods
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_addToIndex` adds a quad to a three-layered index.
2018-02-16 11:16:18 +01:00
// Returns if the index has changed, if the entry did not already exist.
_addToIndex : function ( index0 , key0 , key1 , key2 ) {
// Create layers as necessary
var index1 = index0 [ key0 ] || ( index0 [ key0 ] = { } ) ;
var index2 = index1 [ key1 ] || ( index1 [ key1 ] = { } ) ;
2019-01-10 12:43:45 +01:00
// Setting the key to _any_ value signals the presence of the quad
2018-02-16 11:16:18 +01:00
var existed = key2 in index2 ;
if ( ! existed )
index2 [ key2 ] = null ;
return ! existed ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_removeFromIndex` removes a quad from a three-layered index
2018-02-16 11:16:18 +01:00
_removeFromIndex : function ( index0 , key0 , key1 , key2 ) {
2019-01-10 12:43:45 +01:00
// Remove the quad from the index
2018-02-16 11:16:18 +01:00
var index1 = index0 [ key0 ] , index2 = index1 [ key1 ] , key ;
delete index2 [ key2 ] ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Remove intermediary index layers if they are empty
for ( key in index2 ) return ;
delete index1 [ key1 ] ;
for ( key in index1 ) return ;
delete index0 [ key0 ] ;
} ,
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `_findInIndex` finds a set of quads in a three-layered index.
2018-02-16 11:16:18 +01:00
// The index base is `index0` and the keys at each level are `key0`, `key1`, and `key2`.
// Any of these keys can be undefined, which is interpreted as a wildcard.
// `name0`, `name1`, and `name2` are the names of the keys at each level,
2019-01-10 12:43:45 +01:00
// used when reconstructing the resulting quad
2018-02-16 11:16:18 +01:00
// (for instance: _subject_, _predicate_, and _object_).
2019-01-10 12:43:45 +01:00
// Finally, `graph` will be the graph of the created quads.
2018-02-16 11:16:18 +01:00
// If `callback` is given, each result is passed through it
2019-01-10 12:43:45 +01:00
// and iteration halts when it returns truthy for any quad.
2018-02-16 11:16:18 +01:00
// If instead `array` is given, each result is added to the array.
_findInIndex : function ( index0 , key0 , key1 , key2 , name0 , name1 , name2 , graph , callback , array ) {
var tmp , index1 , index2 , varCount = ! key0 + ! key1 + ! key2 ,
// depending on the number of variables, keys or reverse index are faster
entityKeys = varCount > 1 ? Object . keys ( this . _ids ) : this . _entities ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 ] ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
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 ] ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
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 ) ;
2019-01-10 12:43:45 +01:00
// Create quads for all items found in index 2.
for ( var l = 0 ; l < values . length ; l ++ ) {
var parts = { subject : null , predicate : null , object : null } ;
parts [ name0 ] = fromId ( entity0 , this . _factory ) ;
parts [ name1 ] = fromId ( entity1 , this . _factory ) ;
parts [ name2 ] = fromId ( entityKeys [ values [ l ] ] , this . _factory ) ;
var quad = this . _factory . quad (
parts . subject , parts . predicate , parts . object , fromId ( graph , this . _factory ) ) ;
2018-02-16 11:16:18 +01:00
if ( array )
2019-01-10 12:43:45 +01:00
array . push ( quad ) ;
else if ( callback ( quad ) )
2018-02-16 11:16:18 +01:00
return true ;
}
}
}
}
}
return array ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_loop` executes the callback on all keys of index 0
_loop : function ( index0 , callback ) {
for ( var key0 in index0 )
callback ( key0 ) ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_loopByKey0` executes the callback on all keys of a certain entry in index 0
_loopByKey0 : function ( index0 , key0 , callback ) {
var index1 , key1 ;
if ( index1 = index0 [ key0 ] ) {
for ( key1 in index1 )
callback ( key1 ) ;
}
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_loopByKey1` executes the callback on given keys of all entries in index 0
_loopByKey1 : function ( index0 , key1 , callback ) {
var key0 , index1 ;
for ( key0 in index0 ) {
index1 = index0 [ key0 ] ;
if ( index1 [ key1 ] )
callback ( key0 ) ;
}
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_loopBy2Keys` executes the callback on given keys of certain entries in index 2
_loopBy2Keys : function ( index0 , key0 , key1 , callback ) {
var index1 , index2 , key2 ;
if ( ( index1 = index0 [ key0 ] ) && ( index2 = index1 [ key1 ] ) ) {
for ( key2 in index2 )
callback ( key2 ) ;
}
} ,
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `_countInIndex` counts matching quads in a three-layered index.
2018-02-16 11:16:18 +01:00
// The index base is `index0` and the keys at each level are `key0`, `key1`, and `key2`.
// Any of these keys can be undefined, which is interpreted as a wildcard.
_countInIndex : function ( index0 , key0 , key1 , key2 ) {
var count = 0 , tmp , index1 , index2 ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 ] ) {
2019-01-10 12:43:45 +01:00
// If a key is specified, count the quad if it exists
2018-02-16 11:16:18 +01:00
if ( key2 ) ( key2 in index2 ) && count ++ ;
2019-01-10 12:43:45 +01:00
// Otherwise, count all quads
2018-02-16 11:16:18 +01:00
else count += Object . keys ( index2 ) . length ;
}
}
}
}
return count ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_getGraphs` returns an array with the given graph,
// or all graphs if the argument is null or undefined.
_getGraphs : function ( graph ) {
if ( ! isString ( graph ) )
return this . _graphs ;
var graphs = { } ;
graphs [ graph ] = this . _graphs [ graph ] ;
return graphs ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_uniqueEntities` returns a function that accepts an entity ID
// and passes the corresponding entity to callback if it hasn't occurred before.
_uniqueEntities : function ( callback ) {
var uniqueIds = Object . create ( null ) , entities = this . _entities ;
return function ( id ) {
if ( ! ( id in uniqueIds ) ) {
uniqueIds [ id ] = true ;
2019-01-10 12:43:45 +01:00
callback ( fromId ( entities [ id ] ) ) ;
2018-02-16 11:16:18 +01:00
}
} ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ## Public methods
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `addQuad` adds a new quad to the store.
// Returns if the quad index has changed, if the quad did not already exist.
addQuad : function ( subject , predicate , object , graph ) {
// Shift arguments if a quad object is given instead of components
2018-02-16 11:16:18 +01:00
if ( ! predicate )
graph = subject . graph , object = subject . object ,
predicate = subject . predicate , subject = subject . subject ;
2019-01-10 12:43:45 +01:00
// Convert terms to internal string representation
subject = toId ( subject ) ;
predicate = toId ( predicate ) ;
object = toId ( object ) ;
graph = toId ( graph ) ;
2018-02-16 11:16:18 +01:00
// Find the graph that will contain the triple
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 ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// 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 ids = this . _ids ;
var entities = this . _entities ;
subject = ids [ subject ] || ( ids [ entities [ ++ this . _id ] = subject ] = this . _id ) ;
predicate = ids [ predicate ] || ( ids [ entities [ ++ this . _id ] = predicate ] = this . _id ) ;
object = ids [ object ] || ( ids [ entities [ ++ this . _id ] = object ] = this . _id ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var changed = this . _addToIndex ( graphItem . subjects , subject , predicate , object ) ;
this . _addToIndex ( graphItem . predicates , predicate , object , subject ) ;
this . _addToIndex ( graphItem . objects , object , subject , predicate ) ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// The cached quad count is now invalid
2018-02-16 11:16:18 +01:00
this . _size = null ;
return changed ;
} ,
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `addQuads` adds multiple quads to the store
addQuads : function ( quads ) {
for ( var i = 0 ; i < quads . length ; i ++ )
this . addQuad ( quads [ i ] ) ;
2018-02-16 11:16:18 +01:00
} ,
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `import` adds a stream of quads to the store
import : function ( stream ) {
var self = this ;
stream . on ( 'data' , function ( quad ) { self . addQuad ( quad ) ; } ) ;
return stream ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `removeQuad` removes a quad from the store if it exists
removeQuad : function ( subject , predicate , object , graph ) {
// Shift arguments if a quad object is given instead of components
2018-02-16 11:16:18 +01:00
if ( ! predicate )
graph = subject . graph , object = subject . object ,
predicate = subject . predicate , subject = subject . subject ;
2019-01-10 12:43:45 +01:00
// Convert terms to internal string representation
subject = toId ( subject ) ;
predicate = toId ( predicate ) ;
object = toId ( object ) ;
graph = toId ( graph ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Find internal identifiers for all components
2019-01-10 12:43:45 +01:00
// and verify the quad exists.
2018-02-16 11:16:18 +01:00
var graphItem , ids = this . _ids , graphs = this . _graphs , subjects , predicates ;
if ( ! ( subject = ids [ subject ] ) || ! ( predicate = ids [ predicate ] ) ||
! ( object = ids [ object ] ) || ! ( graphItem = graphs [ graph ] ) ||
! ( subjects = graphItem . subjects [ subject ] ) ||
! ( predicates = subjects [ predicate ] ) ||
! ( object in predicates ) )
return false ;
// 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 -- ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Remove the graph if it is empty
for ( subject in graphItem . subjects ) return true ;
delete graphs [ graph ] ;
return true ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `removeQuads` removes multiple quads from the store
removeQuads : function ( quads ) {
for ( var i = 0 ; i < quads . length ; i ++ )
this . removeQuad ( quads [ i ] ) ;
2018-02-16 11:16:18 +01:00
} ,
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// ### `remove` removes a stream of quads from the store
remove : function ( stream ) {
var self = this ;
stream . on ( 'data' , function ( quad ) { self . removeQuad ( quad ) ; } ) ;
return stream ;
2018-02-16 11:16:18 +01:00
} ,
2019-01-10 12:43:45 +01:00
// ### `getQuads` returns an array of quads matching a pattern.
2018-02-16 11:16:18 +01:00
// Setting any field to `undefined` or `null` indicates a wildcard.
2019-01-10 12:43:45 +01:00
getQuads : function ( subject , predicate , object , graph ) {
// Convert terms to internal string representation
subject = subject && toId ( subject ) ;
predicate = predicate && toId ( predicate ) ;
object = object && toId ( object ) ;
graph = graph && toId ( graph ) ;
2018-02-16 11:16:18 +01:00
var quads = [ ] , graphs = this . _getGraphs ( graph ) , content ,
ids = this . _ids , subjectId , predicateId , objectId ;
// Translate IRIs to internal index keys.
if ( isString ( subject ) && ! ( subjectId = ids [ subject ] ) ||
isString ( predicate ) && ! ( predicateId = ids [ predicate ] ) ||
isString ( object ) && ! ( objectId = ids [ object ] ) )
return quads ;
for ( var graphId in graphs ) {
// Only if the specified graph contains triples, there can be results
if ( content = graphs [ graphId ] ) {
// Choose the optimal index, based on what fields are present
if ( subjectId ) {
if ( objectId )
// If subject and object are given, the object index will be the fastest
this . _findInIndex ( content . objects , objectId , subjectId , predicateId ,
'object' , 'subject' , 'predicate' , graphId , null , quads ) ;
else
// If only subject and possibly predicate are given, the subject index will be the fastest
this . _findInIndex ( content . subjects , subjectId , predicateId , null ,
'subject' , 'predicate' , 'object' , graphId , null , quads ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
else if ( predicateId )
// If only predicate and possibly object are given, the predicate index will be the fastest
this . _findInIndex ( content . predicates , predicateId , objectId , null ,
'predicate' , 'object' , 'subject' , graphId , null , quads ) ;
else if ( objectId )
// If only object is given, the object index will be the fastest
this . _findInIndex ( content . objects , objectId , null , null ,
'object' , 'subject' , 'predicate' , graphId , null , quads ) ;
else
// If nothing is given, iterate subjects and predicates first
this . _findInIndex ( content . subjects , null , null , null ,
'subject' , 'predicate' , 'object' , graphId , null , quads ) ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return quads ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `countQuads` returns the number of quads matching a pattern.
2018-02-16 11:16:18 +01:00
// Setting any field to `undefined` or `null` indicates a wildcard.
2019-01-10 12:43:45 +01:00
countQuads : function ( subject , predicate , object , graph ) {
// Convert terms to internal string representation
subject = subject && toId ( subject ) ;
predicate = predicate && toId ( predicate ) ;
object = object && toId ( object ) ;
graph = graph && toId ( graph ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var count = 0 , graphs = this . _getGraphs ( graph ) , content ,
ids = this . _ids , subjectId , predicateId , objectId ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Translate IRIs to internal index keys.
if ( isString ( subject ) && ! ( subjectId = ids [ subject ] ) ||
isString ( predicate ) && ! ( predicateId = ids [ predicate ] ) ||
isString ( object ) && ! ( objectId = ids [ object ] ) )
return 0 ;
for ( var graphId in graphs ) {
// Only if the specified graph contains triples, there can be results
if ( content = graphs [ graphId ] ) {
// 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
count += this . _countInIndex ( content . objects , objectId , subjectId , predicateId ) ;
else
// If only subject and possibly predicate are given, the subject index will be the fastest
count += this . _countInIndex ( content . subjects , subjectId , predicateId , objectId ) ;
}
else if ( predicate ) {
// If only predicate and possibly object are given, the predicate index will be the fastest
count += this . _countInIndex ( content . predicates , predicateId , objectId , subjectId ) ;
}
else {
// If only object is possibly given, the object index will be the fastest
count += this . _countInIndex ( content . objects , objectId , subjectId , predicateId ) ;
}
}
}
return count ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `forEach` executes the callback on all quads.
2018-02-16 11:16:18 +01:00
// Setting any field to `undefined` or `null` indicates a wildcard.
forEach : function ( callback , subject , predicate , object , graph ) {
2019-01-10 12:43:45 +01:00
this . some ( function ( quad ) {
2018-02-16 11:16:18 +01:00
callback ( quad ) ;
return false ;
} , subject , predicate , object , graph ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `every` executes the callback on all quads,
2018-02-16 11:16:18 +01:00
// and returns `true` if it returns truthy for all them.
// Setting any field to `undefined` or `null` indicates a wildcard.
every : function ( callback , subject , predicate , object , graph ) {
var some = false ;
2019-01-10 12:43:45 +01:00
var every = ! this . some ( function ( quad ) {
2018-02-16 11:16:18 +01:00
some = true ;
return ! callback ( quad ) ;
} , subject , predicate , object , graph ) ;
return some && every ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `some` executes the callback on all quads,
2018-02-16 11:16:18 +01:00
// and returns `true` if it returns truthy for any of them.
// Setting any field to `undefined` or `null` indicates a wildcard.
some : function ( callback , subject , predicate , object , graph ) {
2019-01-10 12:43:45 +01:00
// Convert terms to internal string representation
subject = subject && toId ( subject ) ;
predicate = predicate && toId ( predicate ) ;
object = object && toId ( object ) ;
graph = graph && toId ( graph ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var graphs = this . _getGraphs ( graph ) , content ,
ids = this . _ids , subjectId , predicateId , objectId ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Translate IRIs to internal index keys.
if ( isString ( subject ) && ! ( subjectId = ids [ subject ] ) ||
isString ( predicate ) && ! ( predicateId = ids [ predicate ] ) ||
isString ( object ) && ! ( objectId = ids [ object ] ) )
return false ;
for ( var graphId in graphs ) {
2019-01-10 12:43:45 +01:00
// Only if the specified graph contains triples, there can be results
2018-02-16 11:16:18 +01:00
if ( content = graphs [ graphId ] ) {
// Choose the optimal index, based on what fields are present
if ( subjectId ) {
if ( objectId ) {
// If subject and object are given, the object index will be the fastest
if ( this . _findInIndex ( content . objects , objectId , subjectId , predicateId ,
'object' , 'subject' , 'predicate' , graphId , callback , null ) )
return true ;
}
else
// If only subject and possibly predicate are given, the subject index will be the fastest
if ( this . _findInIndex ( content . subjects , subjectId , predicateId , null ,
'subject' , 'predicate' , 'object' , graphId , callback , null ) )
return true ;
}
else if ( predicateId ) {
// If only predicate and possibly object are given, the predicate index will be the fastest
if ( this . _findInIndex ( content . predicates , predicateId , objectId , null ,
'predicate' , 'object' , 'subject' , graphId , callback , null ) ) {
return true ;
}
}
else if ( objectId ) {
// If only object is given, the object index will be the fastest
if ( this . _findInIndex ( content . objects , objectId , null , null ,
'object' , 'subject' , 'predicate' , graphId , callback , null ) ) {
return true ;
}
}
else
// If nothing is given, iterate subjects and predicates first
if ( this . _findInIndex ( content . subjects , null , null , null ,
'subject' , 'predicate' , 'object' , graphId , callback , null ) ) {
return true ;
}
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return false ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `getSubjects` returns all subjects that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
getSubjects : function ( predicate , object , graph ) {
var results = [ ] ;
2019-01-10 12:43:45 +01:00
this . forSubjects ( function ( s ) { results . push ( s ) ; } , predicate , object , graph ) ;
2018-02-16 11:16:18 +01:00
return results ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `forSubjects` executes the callback on all subjects that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
forSubjects : function ( callback , predicate , object , graph ) {
2019-01-10 12:43:45 +01:00
// Convert terms to internal string representation
predicate = predicate && toId ( predicate ) ;
object = object && toId ( object ) ;
graph = graph && toId ( graph ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var ids = this . _ids , graphs = this . _getGraphs ( graph ) , content , predicateId , objectId ;
callback = this . _uniqueEntities ( callback ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Translate IRIs to internal index keys.
if ( isString ( predicate ) && ! ( predicateId = ids [ predicate ] ) ||
isString ( object ) && ! ( objectId = ids [ object ] ) )
return ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
for ( graph in graphs ) {
// Only if the specified graph contains triples, there can be results
if ( content = graphs [ graph ] ) {
// Choose optimal index based on which fields are wildcards
if ( predicateId ) {
if ( objectId )
// If predicate and object are given, the POS index is best.
this . _loopBy2Keys ( content . predicates , predicateId , objectId , callback ) ;
else
// If only predicate is given, the SPO index is best.
this . _loopByKey1 ( content . subjects , predicateId , callback ) ;
}
else if ( objectId )
// If only object is given, the OSP index is best.
this . _loopByKey0 ( content . objects , objectId , callback ) ;
else
// If no params given, iterate all the subjects
this . _loop ( content . subjects , callback ) ;
}
}
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `getPredicates` returns all predicates that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
getPredicates : function ( subject , object , graph ) {
var results = [ ] ;
2019-01-10 12:43:45 +01:00
this . forPredicates ( function ( p ) { results . push ( p ) ; } , subject , object , graph ) ;
2018-02-16 11:16:18 +01:00
return results ;
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `forPredicates` executes the callback on all predicates that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
forPredicates : function ( callback , subject , object , graph ) {
2019-01-10 12:43:45 +01:00
// Convert terms to internal string representation
subject = subject && toId ( subject ) ;
object = object && toId ( object ) ;
graph = graph && toId ( graph ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var ids = this . _ids , graphs = this . _getGraphs ( graph ) , content , subjectId , objectId ;
callback = this . _uniqueEntities ( callback ) ;
// Translate IRIs to internal index keys.
if ( isString ( subject ) && ! ( subjectId = ids [ subject ] ) ||
isString ( object ) && ! ( objectId = ids [ object ] ) )
return ;
for ( graph in graphs ) {
// Only if the specified graph contains triples, there can be results
if ( content = graphs [ graph ] ) {
// Choose optimal index based on which fields are wildcards
if ( subjectId ) {
if ( objectId )
// If subject and object are given, the OSP index is best.
this . _loopBy2Keys ( content . objects , objectId , subjectId , callback ) ;
else
// If only subject is given, the SPO index is best.
this . _loopByKey0 ( content . subjects , subjectId , callback ) ;
}
else if ( objectId )
// If only object is given, the POS index is best.
this . _loopByKey1 ( content . predicates , objectId , callback ) ;
else
// If no params given, iterate all the predicates.
this . _loop ( content . predicates , callback ) ;
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `getObjects` returns all objects that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
getObjects : function ( subject , predicate , graph ) {
var results = [ ] ;
2019-01-10 12:43:45 +01:00
this . forObjects ( function ( o ) { results . push ( o ) ; } , subject , predicate , graph ) ;
2018-02-16 11:16:18 +01:00
return results ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `forObjects` executes the callback on all objects that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
forObjects : function ( callback , subject , predicate , graph ) {
2019-01-10 12:43:45 +01:00
// Convert terms to internal string representation
subject = subject && toId ( subject ) ;
predicate = predicate && toId ( predicate ) ;
graph = graph && toId ( graph ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var ids = this . _ids , graphs = this . _getGraphs ( graph ) , content , subjectId , predicateId ;
callback = this . _uniqueEntities ( callback ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Translate IRIs to internal index keys.
if ( isString ( subject ) && ! ( subjectId = ids [ subject ] ) ||
isString ( predicate ) && ! ( predicateId = ids [ predicate ] ) )
return ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
for ( graph in graphs ) {
// Only if the specified graph contains triples, there can be results
if ( content = graphs [ graph ] ) {
// Choose optimal index based on which fields are wildcards
if ( subjectId ) {
if ( predicateId )
// If subject and predicate are given, the SPO index is best.
this . _loopBy2Keys ( content . subjects , subjectId , predicateId , callback ) ;
else
// If only subject is given, the OSP index is best.
this . _loopByKey1 ( content . objects , subjectId , callback ) ;
}
else if ( predicateId )
// If only predicate is given, the POS index is best.
this . _loopByKey0 ( content . predicates , predicateId , callback ) ;
else
// If no params given, iterate all the objects.
this . _loop ( content . objects , callback ) ;
2016-11-29 11:09:07 +01:00
}
}
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `getGraphs` returns all graphs that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
getGraphs : function ( subject , predicate , object ) {
var results = [ ] ;
2019-01-10 12:43:45 +01:00
this . forGraphs ( function ( g ) { results . push ( g ) ; } , subject , predicate , object ) ;
2018-02-16 11:16:18 +01:00
return results ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `forGraphs` executes the callback on all graphs that match the pattern.
// Setting any field to `undefined` or `null` indicates a wildcard.
forGraphs : function ( callback , subject , predicate , object ) {
for ( var graph in this . _graphs ) {
2019-01-10 12:43:45 +01:00
this . some ( function ( quad ) {
2018-02-16 11:16:18 +01:00
callback ( quad . graph ) ;
return true ; // Halt iteration of some()
} , subject , predicate , object , graph ) ;
}
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `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 . _ids [ name ] )
name = suggestedName + index ++ ;
}
// Generate a generic blank node name
else {
do { name = '_:b' + this . _blankNodeIndex ++ ; }
while ( this . _ids [ name ] ) ;
}
// Add the blank node to the entities, avoiding the generation of duplicates
this . _ids [ name ] = ++ this . _id ;
this . _entities [ this . _id ] = name ;
2019-01-10 12:43:45 +01:00
return this . _factory . blankNode ( name . substr ( 2 ) ) ;
2018-02-16 11:16:18 +01:00
} ,
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Determines whether the argument is a string
function isString ( s ) {
return typeof s === 'string' || s instanceof String ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Exports
module . exports = N3Store ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "./N3DataFactory" : 4 } ] , 8 : [ function ( require , module , exports ) {
// **N3StreamParser** parses a text stream into a quad stream.
2018-02-16 11:16:18 +01:00
var Transform = require ( 'stream' ) . Transform ,
util = require ( 'util' ) ,
N3Parser = require ( './N3Parser.js' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Constructor
function N3StreamParser ( options ) {
if ( ! ( this instanceof N3StreamParser ) )
return new N3StreamParser ( options ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Initialize Transform base class
Transform . call ( this , { decodeStrings : true } ) ;
this . _readableState . objectMode = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Set up parser
var self = this , parser = new N3Parser ( options ) , onData , onEnd ;
// Pass dummy stream to obtain `data` and `end` callbacks
parser . parse ( {
2019-01-10 12:43:45 +01:00
on : function ( event , callback ) {
2018-02-16 11:16:18 +01:00
switch ( event ) {
2019-01-10 12:43:45 +01:00
case 'data' : onData = callback ; break ;
case 'end' : onEnd = callback ; break ;
2018-02-16 11:16:18 +01:00
}
} ,
} ,
2019-01-10 12:43:45 +01:00
// Handle quads by pushing them down the pipeline
function ( error , quad ) { error && self . emit ( 'error' , error ) || quad && self . push ( quad ) ; } ,
2018-02-16 11:16:18 +01:00
// Emit prefixes through the `prefix` event
function ( prefix , uri ) { self . emit ( 'prefix' , prefix , uri ) ; } ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Implement Transform methods through parser callbacks
this . _transform = function ( chunk , encoding , done ) { onData ( chunk ) ; done ( ) ; } ;
this . _flush = function ( done ) { onEnd ( ) ; done ( ) ; } ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
util . inherits ( N3StreamParser , Transform ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### Parses a stream of strings
N3StreamParser . prototype . import = function ( stream ) {
var self = this ;
stream . on ( 'data' , function ( chunk ) { self . write ( chunk ) ; } ) ;
stream . on ( 'end' , function ( ) { self . end ( ) ; } ) ;
stream . on ( 'error' , function ( error ) { self . emit ( 'error' , error ) ; } ) ;
return this ;
} ;
2018-02-16 11:16:18 +01:00
// ## Exports
module . exports = N3StreamParser ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "./N3Parser.js" : 6 , "stream" : 38 , "util" : 42 } ] , 9 : [ function ( require , module , exports ) {
// **N3StreamWriter** serializes a quad stream into a text stream.
2018-02-16 11:16:18 +01:00
var Transform = require ( 'stream' ) . Transform ,
util = require ( 'util' ) ,
N3Writer = require ( './N3Writer.js' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Constructor
function N3StreamWriter ( options ) {
if ( ! ( this instanceof N3StreamWriter ) )
return new N3StreamWriter ( options ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Initialize Transform base class
Transform . call ( this , { encoding : 'utf8' } ) ;
this . _writableState . objectMode = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Set up writer with a dummy stream object
var self = this ;
2019-01-10 12:43:45 +01:00
var writer = this . _writer = new N3Writer ( {
write : function ( quad , encoding , callback ) { self . push ( quad ) ; callback && callback ( ) ; } ,
2018-02-16 11:16:18 +01:00
end : function ( callback ) { self . push ( null ) ; callback && callback ( ) ; } ,
} , options ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Implement Transform methods on top of writer
2019-01-10 12:43:45 +01:00
this . _transform = function ( quad , encoding , done ) { writer . addQuad ( quad , done ) ; } ;
2018-02-16 11:16:18 +01:00
this . _flush = function ( done ) { writer . end ( done ) ; } ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
util . inherits ( N3StreamWriter , Transform ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### Serializes a stream of quads
N3StreamWriter . prototype . import = function ( stream ) {
var self = this ;
stream . on ( 'data' , function ( quad ) { self . write ( quad ) ; } ) ;
stream . on ( 'end' , function ( ) { self . end ( ) ; } ) ;
stream . on ( 'error' , function ( error ) { self . emit ( 'error' , error ) ; } ) ;
stream . on ( 'prefix' , function ( prefix , iri ) { self . _writer . addPrefix ( prefix , iri ) ; } ) ;
return this ;
} ;
2018-02-16 11:16:18 +01:00
// ## Exports
module . exports = N3StreamWriter ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "./N3Writer.js" : 11 , "stream" : 38 , "util" : 42 } ] , 10 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
// **N3Util** provides N3 utility functions.
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var DataFactory = require ( './N3DataFactory' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var N3Util = {
2019-01-10 12:43:45 +01:00
// Tests whether the given term represents an IRI
isNamedNode : function ( term ) {
return ! ! term && term . termType === 'NamedNode' ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Tests whether the given term represents a blank node
isBlankNode : function ( term ) {
return ! ! term && term . termType === 'BlankNode' ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Tests whether the given term represents a literal
isLiteral : function ( term ) {
return ! ! term && term . termType === 'Literal' ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Tests whether the given term represents a variable
isVariable : function ( term ) {
return ! ! term && term . termType === 'Variable' ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Tests whether the given term represents the default graph
isDefaultGraph : function ( term ) {
return ! ! term && term . termType === 'DefaultGraph' ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Tests whether the given quad is in the default graph
inDefaultGraph : function ( quad ) {
return N3Util . isDefaultGraph ( quad . graph ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Creates a function that prepends the given IRI to a local name
2019-01-10 12:43:45 +01:00
prefix : function ( iri , factory ) {
return N3Util . prefixes ( { '' : iri } , factory ) ( '' ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Creates a function that allows registering and expanding prefixes
2019-01-10 12:43:45 +01:00
prefixes : function ( defaultPrefixes , factory ) {
2018-02-16 11:16:18 +01:00
// Add all of the default prefixes
var prefixes = Object . create ( null ) ;
for ( var prefix in defaultPrefixes )
processPrefix ( prefix , defaultPrefixes [ prefix ] ) ;
2019-01-10 12:43:45 +01:00
// Set the default factory if none was specified
factory = factory || DataFactory ;
2018-02-16 11:16:18 +01:00
// Registers a new prefix (if an IRI was specified)
// or retrieves a function that expands an existing prefix (if no IRI was specified)
function processPrefix ( prefix , iri ) {
// Create a new prefix if an IRI is specified or the prefix doesn't exist
2019-01-10 12:43:45 +01:00
if ( typeof iri === 'string' ) {
2018-02-16 11:16:18 +01:00
// Create a function that expands the prefix
2019-01-10 12:43:45 +01:00
var cache = Object . create ( null ) ;
prefixes [ prefix ] = function ( local ) {
return cache [ local ] || ( cache [ local ] = factory . namedNode ( iri + local ) ) ;
2018-02-16 11:16:18 +01:00
} ;
}
2019-01-10 12:43:45 +01:00
else if ( ! ( prefix in prefixes ) ) {
throw new Error ( 'Unknown prefix: ' + prefix ) ;
}
2018-02-16 11:16:18 +01:00
return prefixes [ prefix ] ;
}
return processPrefix ;
} ,
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Exports
module . exports = N3Util ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "./N3DataFactory" : 4 } ] , 11 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
// **N3Writer** writes N3 documents.
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var namespaces = require ( './IRIs' ) ,
DataFactory = require ( './N3DataFactory' ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var DEFAULTGRAPH = DataFactory . defaultGraph ( ) ;
var rdf = namespaces . rdf ,
xsd = namespaces . xsd ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ,
escapedCharacters = {
'\\' : '\\\\' , '"' : '\\"' , '\t' : '\\t' ,
'\n' : '\\n' , '\r' : '\\r' , '\b' : '\\b' , '\f' : '\\f' ,
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ## Constructor
function N3Writer ( outputStream , options ) {
if ( ! ( this instanceof N3Writer ) )
return new N3Writer ( outputStream , options ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Shift arguments if the first argument is not a stream
if ( outputStream && typeof outputStream . write !== 'function' )
options = outputStream , outputStream = null ;
options = options || { } ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Initialize writer, depending on the format
this . _subject = null ;
if ( ! ( /triple|quad/i ) . test ( options . format ) ) {
2019-01-10 12:43:45 +01:00
this . _graph = DEFAULTGRAPH ;
2018-02-16 11:16:18 +01:00
this . _prefixIRIs = Object . create ( null ) ;
options . prefixes && this . addPrefixes ( options . prefixes ) ;
}
else {
2019-01-10 12:43:45 +01:00
this . _writeQuad = this . _writeQuadLine ;
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
N3Writer . prototype = {
// ## Private methods
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### Whether the current graph is the default graph
get _inDefaultGraph ( ) {
return DEFAULTGRAPH . equals ( this . _graph ) ;
} ,
2018-02-16 11:16:18 +01:00
// ### `_write` writes the argument to the output stream
_write : function ( string , callback ) {
this . _outputStream . write ( string , 'utf8' , callback ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_writeQuad` writes the quad to the output stream
_writeQuad : function ( subject , predicate , object , graph , done ) {
2018-02-16 11:16:18 +01:00
try {
// Write the graph's label if it has changed
2019-01-10 12:43:45 +01:00
if ( ! graph . equals ( this . _graph ) ) {
2018-02-16 11:16:18 +01:00
// Close the previous graph and start the new one
2019-01-10 12:43:45 +01:00
this . _write ( ( this . _subject === null ? '' : ( this . _inDefaultGraph ? '.\n' : '\n}\n' ) ) +
( DEFAULTGRAPH . equals ( graph ) ? '' : this . _encodeIriOrBlank ( graph ) + ' {\n' ) ) ;
this . _graph = graph ;
2018-02-16 11:16:18 +01:00
this . _subject = null ;
}
// Don't repeat the subject if it's the same
2019-01-10 12:43:45 +01:00
if ( subject . equals ( this . _subject ) ) {
2018-02-16 11:16:18 +01:00
// Don't repeat the predicate if it's the same
2019-01-10 12:43:45 +01:00
if ( predicate . equals ( this . _predicate ) )
2018-02-16 11:16:18 +01:00
this . _write ( ', ' + this . _encodeObject ( object ) , done ) ;
// Same subject, different predicate
else
this . _write ( ';\n ' +
this . _encodePredicate ( this . _predicate = predicate ) + ' ' +
this . _encodeObject ( object ) , done ) ;
}
2019-01-10 12:43:45 +01:00
// Different subject; write the whole quad
2018-02-16 11:16:18 +01:00
else
this . _write ( ( this . _subject === null ? '' : '.\n' ) +
2019-01-10 12:43:45 +01:00
this . _encodeIriOrBlank ( this . _subject = subject ) + ' ' +
2018-02-16 11:16:18 +01:00
this . _encodePredicate ( this . _predicate = predicate ) + ' ' +
this . _encodeObject ( object ) , done ) ;
}
catch ( error ) { done && done ( error ) ; }
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_writeQuadLine` writes the quad to the output stream as a single line
_writeQuadLine : function ( subject , predicate , object , graph , done ) {
// Write the quad without prefixes
2018-02-16 11:16:18 +01:00
delete this . _prefixMatch ;
2019-01-10 12:43:45 +01:00
this . _write ( this . quadToString ( subject , predicate , object , graph ) , done ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `quadToString` serializes a quad as a string
quadToString : function ( subject , predicate , object , graph ) {
return this . _encodeIriOrBlank ( subject ) + ' ' +
this . _encodeIriOrBlank ( predicate ) + ' ' +
2018-02-16 11:16:18 +01:00
this . _encodeObject ( object ) +
2019-01-10 12:43:45 +01:00
( graph && graph . value ? ' ' + this . _encodeIriOrBlank ( graph ) + '.\n' : '.\n' ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `quadsToString` serializes an array of quads as a string
quadsToString : function ( quads ) {
return quads . map ( function ( t ) {
return this . quadToString ( t . subject , t . predicate , t . object , t . graph ) ;
2018-02-16 11:16:18 +01:00
} , this ) . join ( '' ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `_encodeIriOrBlank` represents an IRI or blank node
_encodeIriOrBlank : function ( entity ) {
2018-02-16 11:16:18 +01:00
// A blank node or list is represented as-is
2019-01-10 12:43:45 +01:00
if ( entity . termType !== 'NamedNode' )
return 'id' in entity ? entity . id : '_:' + entity . value ;
2018-02-16 11:16:18 +01:00
// Escape special characters
2019-01-10 12:43:45 +01:00
var iri = entity . value ;
if ( escape . test ( iri ) )
iri = iri . replace ( escapeAll , characterReplacer ) ;
2018-02-16 11:16:18 +01:00
// Try to represent the IRI as prefixed name
2019-01-10 12:43:45 +01:00
var prefixMatch = this . _prefixRegex . exec ( iri ) ;
return ! prefixMatch ? '<' + iri + '>' :
( ! prefixMatch [ 1 ] ? iri : this . _prefixIRIs [ prefixMatch [ 1 ] ] + prefixMatch [ 2 ] ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_encodeLiteral` represents a literal
2019-01-10 12:43:45 +01:00
_encodeLiteral : function ( literal ) {
2018-02-16 11:16:18 +01:00
// Escape special characters
2019-01-10 12:43:45 +01:00
var value = literal . value ;
2018-02-16 11:16:18 +01:00
if ( escape . test ( value ) )
value = value . replace ( escapeAll , characterReplacer ) ;
// Write the literal, possibly with type or language
2019-01-10 12:43:45 +01:00
if ( literal . language )
return '"' + value + '"@' + literal . language ;
else if ( literal . datatype . value !== xsd . string )
return '"' + value + '"^^' + this . _encodeIriOrBlank ( literal . datatype ) ;
2018-02-16 11:16:18 +01:00
else
return '"' + value + '"' ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_encodePredicate` represents a predicate
_encodePredicate : function ( predicate ) {
2019-01-10 12:43:45 +01:00
return predicate . value === rdf . type ? 'a' : this . _encodeIriOrBlank ( predicate ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_encodeObject` represents an object
_encodeObject : function ( object ) {
2019-01-10 12:43:45 +01:00
return object . termType === 'Literal' ? this . _encodeLiteral ( object ) : this . _encodeIriOrBlank ( object ) ;
2018-02-16 11:16:18 +01:00
} ,
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// ### `_blockedWrite` replaces `_write` after the writer has been closed
_blockedWrite : function ( ) {
throw new Error ( 'Cannot write because the writer has been closed.' ) ;
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `addQuad` adds the quad to the output stream
addQuad : function ( subject , predicate , object , graph , done ) {
// The quad was given as an object, so shift parameters
2018-02-16 11:16:18 +01:00
if ( object === undefined )
2019-01-10 12:43:45 +01:00
this . _writeQuad ( subject . subject , subject . predicate , subject . object , subject . graph , predicate ) ;
2018-02-16 11:16:18 +01:00
// The optional `graph` parameter was not provided
2019-01-10 12:43:45 +01:00
else if ( typeof graph === 'function' )
this . _writeQuad ( subject , predicate , object , DEFAULTGRAPH , graph ) ;
2018-02-16 11:16:18 +01:00
// The `graph` parameter was provided
else
2019-01-10 12:43:45 +01:00
this . _writeQuad ( subject , predicate , object , graph || DEFAULTGRAPH , done ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ### `addQuads` adds the quads to the output stream
addQuads : function ( quads ) {
for ( var i = 0 ; i < quads . length ; i ++ )
this . addQuad ( quads [ i ] ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `addPrefix` adds the prefix to the output stream
addPrefix : function ( prefix , iri , done ) {
var prefixes = { } ;
prefixes [ prefix ] = iri ;
this . addPrefixes ( prefixes , done ) ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `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 ] ;
2019-01-10 12:43:45 +01:00
if ( typeof iri !== 'string' )
iri = iri . value ;
2018-02-16 11:16:18 +01:00
if ( /[#\/]$/ . test ( iri ) && prefixIRIs [ iri ] !== ( prefix += ':' ) ) {
hasPrefixes = true ;
prefixIRIs [ iri ] = prefix ;
2019-01-10 12:43:45 +01:00
// Finish a possible pending quad
2018-02-16 11:16:18 +01:00
if ( this . _subject !== null ) {
2019-01-10 12:43:45 +01:00
this . _write ( this . _inDefaultGraph ? '.\n' : '\n}\n' ) ;
2018-02-16 11:16:18 +01:00
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 ) ;
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `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 = [ ] ;
2019-01-10 12:43:45 +01:00
// Blank node passed as blank(Term("predicate"), Term("object"))
else if ( predicate . termType )
2018-02-16 11:16:18 +01:00
children = [ { predicate : predicate , object : object } ] ;
// Blank node passed as blank({ predicate: predicate, object: object })
else if ( ! ( 'length' in predicate ) )
children = [ predicate ] ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
switch ( length = children . length ) {
// Generate an empty blank node
case 0 :
2019-01-10 12:43:45 +01:00
return new SerializedTerm ( '[]' ) ;
2018-02-16 11:16:18 +01:00
// Generate a non-nested one-triple blank node
case 1 :
child = children [ 0 ] ;
2019-01-10 12:43:45 +01:00
if ( ! ( child . object instanceof SerializedTerm ) )
return new SerializedTerm ( '[ ' + this . _encodePredicate ( child . predicate ) + ' ' +
this . _encodeObject ( child . object ) + ' ]' ) ;
2018-02-16 11:16:18 +01:00
// 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
2019-01-10 12:43:45 +01:00
if ( child . predicate . equals ( predicate ) )
2018-02-16 11:16:18 +01:00
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 ;
}
}
2019-01-10 12:43:45 +01:00
return new SerializedTerm ( contents + '\n]' ) ;
2018-02-16 11:16:18 +01:00
}
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `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 ] ) ;
2019-01-10 12:43:45 +01:00
return new SerializedTerm ( '(' + contents . join ( ' ' ) + ')' ) ;
2018-02-16 11:16:18 +01:00
} ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `_prefixRegex` matches a prefixed name or IRI that begins with one of the added prefixes
_prefixRegex : /$0^/ ,
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ### `end` signals the end of the output stream
end : function ( done ) {
2019-01-10 12:43:45 +01:00
// Finish a possible pending quad
2018-02-16 11:16:18 +01:00
if ( this . _subject !== null ) {
2019-01-10 12:43:45 +01:00
this . _write ( this . _inDefaultGraph ? '.\n' : '\n}\n' ) ;
2018-02-16 11:16:18 +01:00
this . _subject = null ;
}
// Disallow further writing
this . _write = this . _blockedWrite ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 */ }
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
singleDone && singleDone ( ) ;
} ,
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Replaces a character by its escaped version
function characterReplacer ( character ) {
// Replace a single character by its escaped version
var result = escapedCharacters [ 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 ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ## Placeholder class to represent already pretty-printed terms
function SerializedTerm ( value ) {
this . id = value ;
}
DataFactory . internal . Term . subclass ( SerializedTerm ) ;
// Pretty-printed nodes are not equal to any other node
// (e.g., [] does not equal [])
SerializedTerm . prototype . equals = function ( ) { return false ; } ;
2018-02-16 11:16:18 +01:00
// ## Exports
module . exports = N3Writer ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "./IRIs" : 3 , "./N3DataFactory" : 4 } ] , 12 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
'use strict'
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
exports . byteLength = byteLength
exports . toByteArray = toByteArray
exports . fromByteArray = fromByteArray
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var lookup = [ ]
var revLookup = [ ]
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for ( var i = 0 , len = code . length ; i < len ; ++ i ) {
lookup [ i ] = code [ i ]
revLookup [ code . charCodeAt ( i ) ] = i
2015-07-14 19:23:35 +02:00
}
2019-01-10 12:43:45 +01:00
// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
2018-02-16 11:16:18 +01:00
revLookup [ '-' . charCodeAt ( 0 ) ] = 62
revLookup [ '_' . charCodeAt ( 0 ) ] = 63
2019-01-10 12:43:45 +01:00
function getLens ( b64 ) {
2018-02-16 11:16:18 +01:00
var len = b64 . length
2019-01-10 12:43:45 +01:00
2018-02-16 11:16:18 +01:00
if ( len % 4 > 0 ) {
throw new Error ( 'Invalid string. Length must be a multiple of 4' )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
// Trim off extra bytes after placeholder bytes are found
// See: https://github.com/beatgammit/base64-js/issues/42
var validLen = b64 . indexOf ( '=' )
if ( validLen === - 1 ) validLen = len
var placeHoldersLen = validLen === len
? 0
: 4 - ( validLen % 4 )
return [ validLen , placeHoldersLen ]
2015-07-14 19:23:35 +02:00
}
2019-01-10 12:43:45 +01:00
// base64 is 4/3 + up to two characters of the original data
2018-02-16 11:16:18 +01:00
function byteLength ( b64 ) {
2019-01-10 12:43:45 +01:00
var lens = getLens ( b64 )
var validLen = lens [ 0 ]
var placeHoldersLen = lens [ 1 ]
return ( ( validLen + placeHoldersLen ) * 3 / 4 ) - placeHoldersLen
}
function _byteLength ( b64 , validLen , placeHoldersLen ) {
return ( ( validLen + placeHoldersLen ) * 3 / 4 ) - placeHoldersLen
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function toByteArray ( b64 ) {
2019-01-10 12:43:45 +01:00
var tmp
var lens = getLens ( b64 )
var validLen = lens [ 0 ]
var placeHoldersLen = lens [ 1 ]
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
var arr = new Arr ( _byteLength ( b64 , validLen , placeHoldersLen ) )
var curByte = 0
2018-02-16 11:16:18 +01:00
// if there are placeholders, only get up to the last complete 4 chars
2019-01-10 12:43:45 +01:00
var len = placeHoldersLen > 0
? validLen - 4
: validLen
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
for ( var i = 0 ; i < len ; i += 4 ) {
tmp =
( revLookup [ b64 . charCodeAt ( i ) ] << 18 ) |
( revLookup [ b64 . charCodeAt ( i + 1 ) ] << 12 ) |
( revLookup [ b64 . charCodeAt ( i + 2 ) ] << 6 ) |
revLookup [ b64 . charCodeAt ( i + 3 ) ]
arr [ curByte ++ ] = ( tmp >> 16 ) & 0xFF
arr [ curByte ++ ] = ( tmp >> 8 ) & 0xFF
arr [ curByte ++ ] = tmp & 0xFF
}
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
if ( placeHoldersLen === 2 ) {
tmp =
( revLookup [ b64 . charCodeAt ( i ) ] << 2 ) |
( revLookup [ b64 . charCodeAt ( i + 1 ) ] >> 4 )
arr [ curByte ++ ] = tmp & 0xFF
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( placeHoldersLen === 1 ) {
tmp =
( revLookup [ b64 . charCodeAt ( i ) ] << 10 ) |
( revLookup [ b64 . charCodeAt ( i + 1 ) ] << 4 ) |
( revLookup [ b64 . charCodeAt ( i + 2 ) ] >> 2 )
arr [ curByte ++ ] = ( tmp >> 8 ) & 0xFF
arr [ curByte ++ ] = tmp & 0xFF
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return arr
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function tripletToBase64 ( num ) {
2019-01-10 12:43:45 +01:00
return lookup [ num >> 18 & 0x3F ] +
lookup [ num >> 12 & 0x3F ] +
lookup [ num >> 6 & 0x3F ] +
lookup [ num & 0x3F ]
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function encodeChunk ( uint8 , start , end ) {
var tmp
var output = [ ]
for ( var i = start ; i < end ; i += 3 ) {
2019-01-10 12:43:45 +01:00
tmp =
( ( uint8 [ i ] << 16 ) & 0xFF0000 ) +
( ( uint8 [ i + 1 ] << 8 ) & 0xFF00 ) +
( uint8 [ i + 2 ] & 0xFF )
2018-02-16 11:16:18 +01:00
output . push ( tripletToBase64 ( tmp ) )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return output . join ( '' )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function fromByteArray ( uint8 ) {
var tmp
var len = uint8 . length
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
var parts = [ ]
var maxChunkLength = 16383 // must be multiple of 3
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ) {
2019-01-10 12:43:45 +01:00
parts . push ( encodeChunk (
uint8 , i , ( i + maxChunkLength ) > len2 ? len2 : ( i + maxChunkLength )
) )
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// pad the end with zeros, but make sure to not forget the extra bytes
if ( extraBytes === 1 ) {
tmp = uint8 [ len - 1 ]
2019-01-10 12:43:45 +01:00
parts . push (
lookup [ tmp >> 2 ] +
lookup [ ( tmp << 4 ) & 0x3F ] +
'=='
)
2018-02-16 11:16:18 +01:00
} else if ( extraBytes === 2 ) {
2019-01-10 12:43:45 +01:00
tmp = ( uint8 [ len - 2 ] << 8 ) + uint8 [ len - 1 ]
parts . push (
lookup [ tmp >> 10 ] +
lookup [ ( tmp >> 4 ) & 0x3F ] +
lookup [ ( tmp << 2 ) & 0x3F ] +
'='
)
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return parts . join ( '' )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { } ] , 13 : [ function ( require , module , exports ) {
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { } ] , 14 : [ function ( require , module , exports ) {
/ * !
* The buffer module from node . js , for the browser .
*
* @ author Feross Aboukhadijeh < https : //feross.org>
* @ license MIT
* /
/* eslint-disable no-proto */
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
'use strict'
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var base64 = require ( 'base64-js' )
var ieee754 = require ( 'ieee754' )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
exports . Buffer = Buffer
exports . SlowBuffer = SlowBuffer
exports . INSPECT _MAX _BYTES = 50
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var K _MAX _LENGTH = 0x7fffffff
exports . kMaxLength = K _MAX _LENGTH
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ * *
* If ` Buffer.TYPED_ARRAY_SUPPORT ` :
* === true Use Uint8Array implementation ( fastest )
* === false Print warning and recommend using ` buffer ` v4 . x which has an Object
* implementation ( most compatible , even IE6 )
*
* Browsers that support typed arrays are IE 10 + , Firefox 4 + , Chrome 7 + , Safari 5.1 + ,
* Opera 11.6 + , iOS 4.2 + .
*
* We report that the browser does not support typed arrays if the are not subclassable
* using _ _proto _ _ . Firefox 4 - 29 lacks support for adding new properties to ` Uint8Array `
* ( See : https : //bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
* for _ _proto _ _ and has a buggy typed array implementation .
* /
Buffer . TYPED _ARRAY _SUPPORT = typedArraySupport ( )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! Buffer . TYPED _ARRAY _SUPPORT && typeof console !== 'undefined' &&
typeof console . error === 'function' ) {
console . error (
'This browser lacks typed array (Uint8Array) support which is required by ' +
'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
)
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
function typedArraySupport ( ) {
// Can typed array instances can be augmented?
try {
var arr = new Uint8Array ( 1 )
2019-01-10 12:43:45 +01:00
arr . _ _proto _ _ = { _ _proto _ _ : Uint8Array . prototype , foo : function ( ) { return 42 } }
2018-02-16 11:16:18 +01:00
return arr . foo ( ) === 42
} catch ( e ) {
return false
2015-07-14 19:23:35 +02:00
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
Object . defineProperty ( Buffer . prototype , 'parent' , {
enumerable : true ,
get : function ( ) {
if ( ! Buffer . isBuffer ( this ) ) return undefined
return this . buffer
}
} )
Object . defineProperty ( Buffer . prototype , 'offset' , {
enumerable : true ,
get : function ( ) {
if ( ! Buffer . isBuffer ( this ) ) return undefined
return this . byteOffset
}
} )
2018-02-16 11:16:18 +01:00
function createBuffer ( length ) {
if ( length > K _MAX _LENGTH ) {
2019-01-10 12:43:45 +01:00
throw new RangeError ( 'The value "' + length + '" is invalid for option "size"' )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
// Return an augmented `Uint8Array` instance
var buf = new Uint8Array ( length )
buf . _ _proto _ _ = Buffer . prototype
return buf
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ * *
* 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 ` Uint8Array ` prototype remains unmodified .
* /
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function Buffer ( arg , encodingOrOffset , length ) {
// Common case.
if ( typeof arg === 'number' ) {
if ( typeof encodingOrOffset === 'string' ) {
2019-01-10 12:43:45 +01:00
throw new TypeError (
'The "string" argument must be of type string. Received type number'
2018-02-16 11:16:18 +01:00
)
}
return allocUnsafe ( arg )
}
return from ( arg , encodingOrOffset , length )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
2019-01-10 12:43:45 +01:00
if ( typeof Symbol !== 'undefined' && Symbol . species != null &&
2018-02-16 11:16:18 +01:00
Buffer [ Symbol . species ] === Buffer ) {
Object . defineProperty ( Buffer , Symbol . species , {
value : null ,
configurable : true ,
enumerable : false ,
writable : false
} )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . poolSize = 8192 // not used by this implementation
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function from ( value , encodingOrOffset , length ) {
2019-01-10 12:43:45 +01:00
if ( typeof value === 'string' ) {
return fromString ( value , encodingOrOffset )
}
if ( ArrayBuffer . isView ( value ) ) {
return fromArrayLike ( value )
}
if ( value == null ) {
throw TypeError (
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
'or Array-like Object. Received type ' + ( typeof value )
)
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( isInstance ( value , ArrayBuffer ) ||
( value && isInstance ( value . buffer , ArrayBuffer ) ) ) {
2018-02-16 11:16:18 +01:00
return fromArrayBuffer ( value , encodingOrOffset , length )
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( typeof value === 'number' ) {
throw new TypeError (
'The "value" argument must not be of type number. Received type number'
)
}
var valueOf = value . valueOf && value . valueOf ( )
if ( valueOf != null && valueOf !== value ) {
return Buffer . from ( valueOf , encodingOrOffset , length )
}
var b = fromObject ( value )
if ( b ) return b
if ( typeof Symbol !== 'undefined' && Symbol . toPrimitive != null &&
typeof value [ Symbol . toPrimitive ] === 'function' ) {
return Buffer . from (
value [ Symbol . toPrimitive ] ( 'string' ) , encodingOrOffset , length
)
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
throw new TypeError (
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
'or Array-like Object. Received type ' + ( typeof value )
)
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
/ * *
* 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 ( value , encodingOrOffset , length )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Buffer . prototype . _ _proto _ _ = Uint8Array . prototype
Buffer . _ _proto _ _ = Uint8Array
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function assertSize ( size ) {
if ( typeof size !== 'number' ) {
2019-01-10 12:43:45 +01:00
throw new TypeError ( '"size" argument must be of type number' )
2018-02-16 11:16:18 +01:00
} else if ( size < 0 ) {
2019-01-10 12:43:45 +01:00
throw new RangeError ( 'The value "' + size + '" is invalid for option "size"' )
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function alloc ( size , fill , encoding ) {
assertSize ( size )
if ( size <= 0 ) {
return createBuffer ( 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 ( size ) . fill ( fill , encoding )
: createBuffer ( size ) . fill ( fill )
}
return createBuffer ( size )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
/ * *
* Creates a new filled Buffer instance .
* alloc ( size [ , fill [ , encoding ] ] )
* * /
Buffer . alloc = function ( size , fill , encoding ) {
return alloc ( size , fill , encoding )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function allocUnsafe ( size ) {
assertSize ( size )
return createBuffer ( size < 0 ? 0 : checked ( size ) | 0 )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ * *
* Equivalent to Buffer ( num ) , by default creates a non - zero - filled Buffer instance .
* * /
Buffer . allocUnsafe = function ( size ) {
return allocUnsafe ( size )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
/ * *
* Equivalent to SlowBuffer ( num ) , by default creates a non - zero - filled Buffer instance .
* /
Buffer . allocUnsafeSlow = function ( size ) {
return allocUnsafe ( size )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
function fromString ( string , encoding ) {
if ( typeof encoding !== 'string' || encoding === '' ) {
encoding = 'utf8'
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
if ( ! Buffer . isEncoding ( encoding ) ) {
2019-01-10 12:43:45 +01:00
throw new TypeError ( 'Unknown encoding: ' + encoding )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
var length = byteLength ( string , encoding ) | 0
var buf = createBuffer ( length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var actual = buf . write ( string , encoding )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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')
buf = buf . slice ( 0 , actual )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return buf
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function fromArrayLike ( array ) {
var length = array . length < 0 ? 0 : checked ( array . length ) | 0
var buf = createBuffer ( length )
for ( var i = 0 ; i < length ; i += 1 ) {
buf [ i ] = array [ i ] & 255
}
return buf
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function fromArrayBuffer ( array , byteOffset , length ) {
if ( byteOffset < 0 || array . byteLength < byteOffset ) {
2019-01-10 12:43:45 +01:00
throw new RangeError ( '"offset" is outside of buffer bounds' )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
if ( array . byteLength < byteOffset + ( length || 0 ) ) {
2019-01-10 12:43:45 +01:00
throw new RangeError ( '"length" is outside of buffer bounds' )
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var buf
if ( byteOffset === undefined && length === undefined ) {
buf = new Uint8Array ( array )
} else if ( length === undefined ) {
buf = new Uint8Array ( array , byteOffset )
} else {
buf = new Uint8Array ( array , byteOffset , length )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Return an augmented `Uint8Array` instance
buf . _ _proto _ _ = Buffer . prototype
return buf
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function fromObject ( obj ) {
if ( Buffer . isBuffer ( obj ) ) {
var len = checked ( obj . length ) | 0
var buf = createBuffer ( len )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( buf . length === 0 ) {
return buf
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
obj . copy ( buf , 0 , 0 , len )
return buf
2015-07-14 19:23:35 +02:00
}
2019-01-10 12:43:45 +01:00
if ( obj . length !== undefined ) {
if ( typeof obj . length !== 'number' || numberIsNaN ( obj . length ) ) {
return createBuffer ( 0 )
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
return fromArrayLike ( obj )
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( obj . type === 'Buffer' && Array . isArray ( obj . data ) ) {
return fromArrayLike ( obj . data )
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function checked ( length ) {
// Note: cannot use `length < K_MAX_LENGTH` here because that fails when
// length is NaN (which is otherwise coerced to zero.)
if ( length >= K _MAX _LENGTH ) {
throw new RangeError ( 'Attempt to allocate Buffer larger than maximum ' +
'size: 0x' + K _MAX _LENGTH . toString ( 16 ) + ' bytes' )
}
return length | 0
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function SlowBuffer ( length ) {
if ( + length != length ) { // eslint-disable-line eqeqeq
length = 0
}
return Buffer . alloc ( + length )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . isBuffer = function isBuffer ( b ) {
2019-01-10 12:43:45 +01:00
return b != null && b . _isBuffer === true &&
b !== Buffer . prototype // so Buffer.isBuffer(Buffer.prototype) will be false
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . compare = function compare ( a , b ) {
2019-01-10 12:43:45 +01:00
if ( isInstance ( a , Uint8Array ) ) a = Buffer . from ( a , a . offset , a . byteLength )
if ( isInstance ( b , Uint8Array ) ) b = Buffer . from ( b , b . offset , b . byteLength )
2018-02-16 11:16:18 +01:00
if ( ! Buffer . isBuffer ( a ) || ! Buffer . isBuffer ( b ) ) {
2019-01-10 12:43:45 +01:00
throw new TypeError (
'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
)
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( a === b ) return 0
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var x = a . length
var y = b . length
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
for ( var i = 0 , len = Math . min ( x , y ) ; i < len ; ++ i ) {
if ( a [ i ] !== b [ i ] ) {
x = a [ i ]
y = b [ i ]
break
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
if ( x < y ) return - 1
if ( y < x ) return 1
return 0
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 'ucs2' :
case 'ucs-2' :
case 'utf16le' :
case 'utf-16le' :
return true
default :
return false
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . concat = function concat ( list , length ) {
if ( ! Array . isArray ( list ) ) {
throw new TypeError ( '"list" argument must be an Array of Buffers' )
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( list . length === 0 ) {
return Buffer . alloc ( 0 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
var i
if ( length === undefined ) {
length = 0
for ( i = 0 ; i < list . length ; ++ i ) {
length += list [ i ] . length
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
var buffer = Buffer . allocUnsafe ( length )
var pos = 0
for ( i = 0 ; i < list . length ; ++ i ) {
var buf = list [ i ]
2019-01-10 12:43:45 +01:00
if ( isInstance ( buf , Uint8Array ) ) {
buf = Buffer . from ( buf )
}
2018-02-16 11:16:18 +01:00
if ( ! Buffer . isBuffer ( buf ) ) {
throw new TypeError ( '"list" argument must be an Array of Buffers' )
}
buf . copy ( buffer , pos )
pos += buf . length
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return buffer
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function byteLength ( string , encoding ) {
if ( Buffer . isBuffer ( string ) ) {
return string . length
}
2019-01-10 12:43:45 +01:00
if ( ArrayBuffer . isView ( string ) || isInstance ( string , ArrayBuffer ) ) {
2018-02-16 11:16:18 +01:00
return string . byteLength
}
if ( typeof string !== 'string' ) {
2019-01-10 12:43:45 +01:00
throw new TypeError (
'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
'Received type ' + typeof string
)
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var len = string . length
2019-01-10 12:43:45 +01:00
var mustMatch = ( arguments . length > 2 && arguments [ 2 ] === true )
if ( ! mustMatch && len === 0 ) return 0
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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' :
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 :
2019-01-10 12:43:45 +01:00
if ( loweredCase ) {
return mustMatch ? - 1 : utf8ToBytes ( string ) . length // assume utf8
}
2018-02-16 11:16:18 +01:00
encoding = ( '' + encoding ) . toLowerCase ( )
loweredCase = true
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
}
Buffer . byteLength = byteLength
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function slowToString ( encoding , start , end ) {
var loweredCase = false
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only
// property of a typed array.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( end <= 0 ) {
return ''
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Force coersion to uint32. This will also coerce falsey/NaN values to 0.
end >>>= 0
start >>>= 0
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( end <= start ) {
return ''
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! encoding ) encoding = 'utf8'
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
while ( true ) {
switch ( encoding ) {
case 'hex' :
return hexSlice ( this , start , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'utf8' :
case 'utf-8' :
return utf8Slice ( this , start , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'ascii' :
return asciiSlice ( this , start , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'latin1' :
case 'binary' :
return latin1Slice ( this , start , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'base64' :
return base64Slice ( this , start , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'ucs2' :
case 'ucs-2' :
case 'utf16le' :
case 'utf-16le' :
return utf16leSlice ( this , start , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
default :
if ( loweredCase ) throw new TypeError ( 'Unknown encoding: ' + encoding )
encoding = ( encoding + '' ) . toLowerCase ( )
loweredCase = true
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer . prototype . _isBuffer = true
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function swap ( b , n , m ) {
var i = b [ n ]
b [ n ] = b [ m ]
b [ m ] = i
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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' )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
for ( var i = 0 ; i < len ; i += 4 ) {
swap ( this , i , i + 3 )
swap ( this , i + 1 , i + 2 )
}
return this
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
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
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . toString = function toString ( ) {
var length = this . length
if ( length === 0 ) return ''
if ( arguments . length === 0 ) return utf8Slice ( this , 0 , length )
return slowToString . apply ( this , arguments )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
Buffer . prototype . toLocaleString = Buffer . prototype . toString
2018-02-16 11:16:18 +01:00
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
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . inspect = function inspect ( ) {
var str = ''
var max = exports . INSPECT _MAX _BYTES
2019-01-10 12:43:45 +01:00
str = this . toString ( 'hex' , 0 , max ) . replace ( /(.{2})/g , '$1 ' ) . trim ( )
if ( this . length > max ) str += ' ... '
2018-02-16 11:16:18 +01:00
return '<Buffer ' + str + '>'
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . compare = function compare ( target , start , end , thisStart , thisEnd ) {
2019-01-10 12:43:45 +01:00
if ( isInstance ( target , Uint8Array ) ) {
target = Buffer . from ( target , target . offset , target . byteLength )
}
2018-02-16 11:16:18 +01:00
if ( ! Buffer . isBuffer ( target ) ) {
2019-01-10 12:43:45 +01:00
throw new TypeError (
'The "target" argument must be one of type Buffer or Uint8Array. ' +
'Received type ' + ( typeof target )
)
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( start === undefined ) {
start = 0
}
if ( end === undefined ) {
end = target ? target . length : 0
}
if ( thisStart === undefined ) {
thisStart = 0
}
if ( thisEnd === undefined ) {
thisEnd = this . length
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( x < y ) return - 1
if ( y < x ) return 1
return 0
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
// 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
2016-11-29 11:09:07 +01:00
}
2019-01-10 12:43:45 +01:00
byteOffset = + byteOffset // Coerce to Number.
if ( numberIsNaN ( byteOffset ) ) {
2018-02-16 11:16:18 +01:00
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
byteOffset = dir ? 0 : ( buffer . length - 1 )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Normalize val
if ( typeof val === 'string' ) {
val = Buffer . from ( val , encoding )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ( 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 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
throw new TypeError ( 'val must be string, number or Buffer' )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
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
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
function read ( buf , i ) {
if ( indexSize === 1 ) {
return buf [ i ]
} else {
return buf . readUInt16BE ( i * indexSize )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
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
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} 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
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
if ( found ) return i
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return - 1
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . includes = function includes ( val , byteOffset , encoding ) {
return this . indexOf ( val , byteOffset , encoding ) !== - 1
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . indexOf = function indexOf ( val , byteOffset , encoding ) {
return bidirectionalIndexOf ( this , val , byteOffset , encoding , true )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . lastIndexOf = function lastIndexOf ( val , byteOffset , encoding ) {
return bidirectionalIndexOf ( this , val , byteOffset , encoding , false )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function hexWrite ( buf , string , offset , length ) {
offset = Number ( offset ) || 0
var remaining = buf . length - offset
if ( ! length ) {
length = remaining
} else {
length = Number ( length )
if ( length > remaining ) {
length = remaining
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var strLen = string . length
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( length > strLen / 2 ) {
length = strLen / 2
}
for ( var i = 0 ; i < length ; ++ i ) {
var parsed = parseInt ( string . substr ( i * 2 , 2 ) , 16 )
2019-01-10 12:43:45 +01:00
if ( numberIsNaN ( parsed ) ) return i
2018-02-16 11:16:18 +01:00
buf [ offset + i ] = parsed
}
return i
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function utf8Write ( buf , string , offset , length ) {
return blitBuffer ( utf8ToBytes ( string , buf . length - offset ) , buf , offset , length )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function asciiWrite ( buf , string , offset , length ) {
return blitBuffer ( asciiToBytes ( string ) , buf , offset , length )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function latin1Write ( buf , string , offset , length ) {
return asciiWrite ( buf , string , offset , length )
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function base64Write ( buf , string , offset , length ) {
return blitBuffer ( base64ToBytes ( string ) , buf , offset , length )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function ucs2Write ( buf , string , offset , length ) {
return blitBuffer ( utf16leToBytes ( string , buf . length - offset ) , buf , offset , length )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 {
throw new Error (
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
)
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var remaining = this . length - offset
if ( length === undefined || length > remaining ) length = remaining
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ( string . length > 0 && ( length < 0 || offset < 0 ) ) || offset > this . length ) {
throw new RangeError ( 'Attempt to write outside buffer bounds' )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! encoding ) encoding = 'utf8'
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var loweredCase = false
for ( ; ; ) {
switch ( encoding ) {
case 'hex' :
return hexWrite ( this , string , offset , length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'utf8' :
case 'utf-8' :
return utf8Write ( this , string , offset , length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'ascii' :
return asciiWrite ( this , string , offset , length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'latin1' :
case 'binary' :
return latin1Write ( this , string , offset , length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'base64' :
// Warning: maxLength not taken into account in base64Write
return base64Write ( this , string , offset , length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
case 'ucs2' :
case 'ucs-2' :
case 'utf16le' :
case 'utf-16le' :
return ucs2Write ( this , string , offset , length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
default :
if ( loweredCase ) throw new TypeError ( 'Unknown encoding: ' + encoding )
encoding = ( '' + encoding ) . toLowerCase ( )
loweredCase = true
}
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . toJSON = function toJSON ( ) {
return {
type : 'Buffer' ,
data : Array . prototype . slice . call ( this . _arr || this , 0 )
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function base64Slice ( buf , start , end ) {
if ( start === 0 && end === buf . length ) {
return base64 . fromByteArray ( buf )
} else {
return base64 . fromByteArray ( buf . slice ( start , end ) )
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function utf8Slice ( buf , start , end ) {
end = Math . min ( buf . length , end )
var res = [ ]
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var i = start
while ( i < end ) {
var firstByte = buf [ i ]
var codePoint = null
var bytesPerSequence = ( firstByte > 0xEF ) ? 4
: ( firstByte > 0xDF ) ? 3
2019-01-10 12:43:45 +01:00
: ( firstByte > 0xBF ) ? 2
: 1
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
res . push ( codePoint )
i += bytesPerSequence
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return decodeCodePointsArray ( res )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// 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
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function decodeCodePointsArray ( codePoints ) {
var len = codePoints . length
if ( len <= MAX _ARGUMENTS _LENGTH ) {
return String . fromCharCode . apply ( String , codePoints ) // avoid extra slice()
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 )
)
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return res
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function asciiSlice ( buf , start , end ) {
var ret = ''
end = Math . min ( buf . length , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
for ( var i = start ; i < end ; ++ i ) {
ret += String . fromCharCode ( buf [ i ] & 0x7F )
}
return ret
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function latin1Slice ( buf , start , end ) {
var ret = ''
end = Math . min ( buf . length , end )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
for ( var i = start ; i < end ; ++ i ) {
ret += String . fromCharCode ( buf [ i ] )
}
return ret
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function hexSlice ( buf , start , end ) {
var len = buf . length
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! start || start < 0 ) start = 0
if ( ! end || end < 0 || end > len ) end = len
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var out = ''
for ( var i = start ; i < end ; ++ i ) {
out += toHex ( buf [ i ] )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return out
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function utf16leSlice ( buf , start , end ) {
var bytes = buf . slice ( start , end )
var res = ''
for ( var i = 0 ; i < bytes . length ; i += 2 ) {
res += String . fromCharCode ( bytes [ i ] + ( bytes [ i + 1 ] * 256 ) )
}
return res
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . slice = function slice ( start , end ) {
var len = this . length
start = ~ ~ start
end = end === undefined ? len : ~ ~ end
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( start < 0 ) {
start += len
if ( start < 0 ) start = 0
} else if ( start > len ) {
start = len
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( end < 0 ) {
end += len
if ( end < 0 ) end = 0
} else if ( end > len ) {
end = len
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
if ( end < start ) end = start
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var newBuf = this . subarray ( start , end )
// Return an augmented `Uint8Array` instance
newBuf . _ _proto _ _ = Buffer . prototype
return newBuf
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ *
* 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' )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readUIntLE = function readUIntLE ( offset , byteLength , noAssert ) {
offset = offset >>> 0
byteLength = byteLength >>> 0
if ( ! noAssert ) checkOffset ( offset , byteLength , this . length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var val = this [ offset ]
var mul = 1
var i = 0
while ( ++ i < byteLength && ( mul *= 0x100 ) ) {
val += this [ offset + i ] * mul
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return val
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readUIntBE = function readUIntBE ( offset , byteLength , noAssert ) {
offset = offset >>> 0
byteLength = byteLength >>> 0
if ( ! noAssert ) {
checkOffset ( offset , byteLength , this . length )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var val = this [ offset + -- byteLength ]
var mul = 1
while ( byteLength > 0 && ( mul *= 0x100 ) ) {
val += this [ offset + -- byteLength ] * mul
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return val
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readUInt8 = function readUInt8 ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 1 , this . length )
return this [ offset ]
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readUInt16LE = function readUInt16LE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 2 , this . length )
return this [ offset ] | ( this [ offset + 1 ] << 8 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readUInt16BE = function readUInt16BE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 2 , this . length )
return ( this [ offset ] << 8 ) | this [ offset + 1 ]
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readUInt32LE = function readUInt32LE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 4 , this . length )
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
return ( ( this [ offset ] ) |
( this [ offset + 1 ] << 8 ) |
( this [ offset + 2 ] << 16 ) ) +
( this [ offset + 3 ] * 0x1000000 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . readUInt32BE = function readUInt32BE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 4 , this . length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return ( this [ offset ] * 0x1000000 ) +
( ( this [ offset + 1 ] << 16 ) |
( this [ offset + 2 ] << 8 ) |
this [ offset + 3 ] )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readIntLE = function readIntLE ( offset , byteLength , noAssert ) {
offset = offset >>> 0
byteLength = byteLength >>> 0
if ( ! noAssert ) checkOffset ( offset , byteLength , this . length )
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var val = this [ offset ]
var mul = 1
var i = 0
while ( ++ i < byteLength && ( mul *= 0x100 ) ) {
val += this [ offset + i ] * mul
}
mul *= 0x80
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( val >= mul ) val -= Math . pow ( 2 , 8 * byteLength )
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
return val
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . readIntBE = function readIntBE ( offset , byteLength , noAssert ) {
offset = offset >>> 0
byteLength = byteLength >>> 0
if ( ! noAssert ) checkOffset ( offset , byteLength , this . length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var i = byteLength
var mul = 1
var val = this [ offset + -- i ]
while ( i > 0 && ( mul *= 0x100 ) ) {
val += this [ offset + -- i ] * mul
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
mul *= 0x80
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( val >= mul ) val -= Math . pow ( 2 , 8 * byteLength )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return val
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readInt8 = function readInt8 ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 1 , this . length )
if ( ! ( this [ offset ] & 0x80 ) ) return ( this [ offset ] )
return ( ( 0xff - this [ offset ] + 1 ) * - 1 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readInt16LE = function readInt16LE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 2 , this . length )
var val = this [ offset ] | ( this [ offset + 1 ] << 8 )
return ( val & 0x8000 ) ? val | 0xFFFF0000 : val
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readInt16BE = function readInt16BE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 2 , this . length )
var val = this [ offset + 1 ] | ( this [ offset ] << 8 )
return ( val & 0x8000 ) ? val | 0xFFFF0000 : val
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readInt32LE = function readInt32LE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 4 , this . length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return ( this [ offset ] ) |
( this [ offset + 1 ] << 8 ) |
( this [ offset + 2 ] << 16 ) |
( this [ offset + 3 ] << 24 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readInt32BE = function readInt32BE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 4 , this . length )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return ( this [ offset ] << 24 ) |
( this [ offset + 1 ] << 16 ) |
( this [ offset + 2 ] << 8 ) |
( this [ offset + 3 ] )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . readFloatLE = function readFloatLE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 4 , this . length )
return ieee754 . read ( this , offset , true , 23 , 4 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . readFloatBE = function readFloatBE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 4 , this . length )
return ieee754 . read ( this , offset , false , 23 , 4 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . readDoubleLE = function readDoubleLE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 8 , this . length )
return ieee754 . read ( this , offset , true , 52 , 8 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . readDoubleBE = function readDoubleBE ( offset , noAssert ) {
offset = offset >>> 0
if ( ! noAssert ) checkOffset ( offset , 8 , this . length )
return ieee754 . read ( this , offset , false , 52 , 8 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function checkInt ( buf , value , offset , ext , max , min ) {
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' )
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeUIntLE = function writeUIntLE ( value , offset , byteLength , noAssert ) {
value = + value
offset = offset >>> 0
byteLength = byteLength >>> 0
if ( ! noAssert ) {
var maxBytes = Math . pow ( 2 , 8 * byteLength ) - 1
checkInt ( this , value , offset , byteLength , maxBytes , 0 )
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var mul = 1
var i = 0
this [ offset ] = value & 0xFF
while ( ++ i < byteLength && ( mul *= 0x100 ) ) {
this [ offset + i ] = ( value / mul ) & 0xFF
}
return offset + byteLength
}
Buffer . prototype . writeUIntBE = function writeUIntBE ( value , offset , byteLength , noAssert ) {
value = + value
offset = offset >>> 0
byteLength = byteLength >>> 0
if ( ! noAssert ) {
var maxBytes = Math . pow ( 2 , 8 * byteLength ) - 1
checkInt ( this , value , offset , byteLength , maxBytes , 0 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
var i = byteLength - 1
var mul = 1
this [ offset + i ] = value & 0xFF
while ( -- i >= 0 && ( mul *= 0x100 ) ) {
this [ offset + i ] = ( value / mul ) & 0xFF
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return offset + byteLength
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeUInt8 = function writeUInt8 ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 1 , 0xff , 0 )
this [ offset ] = ( value & 0xff )
return offset + 1
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeUInt16LE = function writeUInt16LE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 2 , 0xffff , 0 )
this [ offset ] = ( value & 0xff )
this [ offset + 1 ] = ( value >>> 8 )
return offset + 2
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeUInt16BE = function writeUInt16BE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 2 , 0xffff , 0 )
this [ offset ] = ( value >>> 8 )
this [ offset + 1 ] = ( value & 0xff )
return offset + 2
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeUInt32LE = function writeUInt32LE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 4 , 0xffffffff , 0 )
this [ offset + 3 ] = ( value >>> 24 )
this [ offset + 2 ] = ( value >>> 16 )
this [ offset + 1 ] = ( value >>> 8 )
this [ offset ] = ( value & 0xff )
return offset + 4
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeUInt32BE = function writeUInt32BE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 4 , 0xffffffff , 0 )
this [ offset ] = ( value >>> 24 )
this [ offset + 1 ] = ( value >>> 16 )
this [ offset + 2 ] = ( value >>> 8 )
this [ offset + 3 ] = ( value & 0xff )
return offset + 4
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeIntLE = function writeIntLE ( value , offset , byteLength , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) {
var limit = Math . pow ( 2 , ( 8 * byteLength ) - 1 )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
checkInt ( this , value , offset , byteLength , limit - 1 , - limit )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var i = 0
var mul = 1
var sub = 0
this [ offset ] = value & 0xFF
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
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return offset + byteLength
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeIntBE = function writeIntBE ( value , offset , byteLength , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) {
var limit = Math . pow ( 2 , ( 8 * byteLength ) - 1 )
checkInt ( this , value , offset , byteLength , limit - 1 , - limit )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var i = byteLength - 1
var mul = 1
var sub = 0
this [ offset + i ] = value & 0xFF
while ( -- i >= 0 && ( mul *= 0x100 ) ) {
if ( value < 0 && sub === 0 && this [ offset + i + 1 ] !== 0 ) {
sub = 1
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
this [ offset + i ] = ( ( value / mul ) >> 0 ) - sub & 0xFF
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return offset + byteLength
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeInt8 = function writeInt8 ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 1 , 0x7f , - 0x80 )
if ( value < 0 ) value = 0xff + value + 1
this [ offset ] = ( value & 0xff )
return offset + 1
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeInt16LE = function writeInt16LE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 2 , 0x7fff , - 0x8000 )
this [ offset ] = ( value & 0xff )
this [ offset + 1 ] = ( value >>> 8 )
return offset + 2
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeInt16BE = function writeInt16BE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 2 , 0x7fff , - 0x8000 )
this [ offset ] = ( value >>> 8 )
this [ offset + 1 ] = ( value & 0xff )
return offset + 2
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeInt32LE = function writeInt32LE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 4 , 0x7fffffff , - 0x80000000 )
this [ offset ] = ( value & 0xff )
this [ offset + 1 ] = ( value >>> 8 )
this [ offset + 2 ] = ( value >>> 16 )
this [ offset + 3 ] = ( value >>> 24 )
return offset + 4
}
Buffer . prototype . writeInt32BE = function writeInt32BE ( value , offset , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) checkInt ( this , value , offset , 4 , 0x7fffffff , - 0x80000000 )
if ( value < 0 ) value = 0xffffffff + value + 1
this [ offset ] = ( value >>> 24 )
this [ offset + 1 ] = ( value >>> 16 )
this [ offset + 2 ] = ( value >>> 8 )
this [ offset + 3 ] = ( value & 0xff )
return offset + 4
}
function checkIEEE754 ( buf , value , offset , ext , max , min ) {
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 ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) {
checkIEEE754 ( buf , value , offset , 4 , 3.4028234663852886 e + 38 , - 3.4028234663852886 e + 38 )
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
ieee754 . write ( buf , value , offset , littleEndian , 23 , 4 )
return offset + 4
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeFloatLE = function writeFloatLE ( value , offset , noAssert ) {
return writeFloat ( this , value , offset , true , noAssert )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeFloatBE = function writeFloatBE ( value , offset , noAssert ) {
return writeFloat ( this , value , offset , false , noAssert )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function writeDouble ( buf , value , offset , littleEndian , noAssert ) {
value = + value
offset = offset >>> 0
if ( ! noAssert ) {
checkIEEE754 ( buf , value , offset , 8 , 1.7976931348623157 E + 308 , - 1.7976931348623157 E + 308 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
ieee754 . write ( buf , value , offset , littleEndian , 52 , 8 )
return offset + 8
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeDoubleLE = function writeDoubleLE ( value , offset , noAssert ) {
return writeDouble ( this , value , offset , true , noAssert )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Buffer . prototype . writeDoubleBE = function writeDoubleBE ( value , offset , noAssert ) {
return writeDouble ( this , value , offset , false , noAssert )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer . prototype . copy = function copy ( target , targetStart , start , end ) {
2019-01-10 12:43:45 +01:00
if ( ! Buffer . isBuffer ( target ) ) throw new TypeError ( 'argument should be a Buffer' )
2018-02-16 11:16:18 +01:00
if ( ! start ) start = 0
if ( ! end && end !== 0 ) end = this . length
if ( targetStart >= target . length ) targetStart = target . length
if ( ! targetStart ) targetStart = 0
if ( end > 0 && end < start ) end = start
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Copy 0 bytes; we're done
if ( end === start ) return 0
if ( target . length === 0 || this . length === 0 ) return 0
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Fatal error conditions
if ( targetStart < 0 ) {
throw new RangeError ( 'targetStart out of bounds' )
}
2019-01-10 12:43:45 +01:00
if ( start < 0 || start >= this . length ) throw new RangeError ( 'Index out of range' )
2018-02-16 11:16:18 +01:00
if ( end < 0 ) throw new RangeError ( 'sourceEnd out of bounds' )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Are we oob?
if ( end > this . length ) end = this . length
if ( target . length - targetStart < end - start ) {
end = target . length - targetStart + start
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var len = end - start
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( this === target && typeof Uint8Array . prototype . copyWithin === 'function' ) {
// Use built-in when available, missing from IE11
this . copyWithin ( targetStart , start , end )
} else if ( this === target && start < targetStart && targetStart < end ) {
2018-02-16 11:16:18 +01:00
// descending copy from end
2019-01-10 12:43:45 +01:00
for ( var i = len - 1 ; i >= 0 ; -- i ) {
2018-02-16 11:16:18 +01:00
target [ i + targetStart ] = this [ i + start ]
}
} else {
Uint8Array . prototype . set . call (
target ,
2019-01-10 12:43:45 +01:00
this . subarray ( start , end ) ,
2018-02-16 11:16:18 +01:00
targetStart
)
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return len
}
// 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 ( 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 )
}
2019-01-10 12:43:45 +01:00
if ( val . length === 1 ) {
var code = val . charCodeAt ( 0 )
if ( ( encoding === 'utf8' && code < 128 ) ||
encoding === 'latin1' ) {
// Fast path: If `val` fits into a single byte, use that numeric value.
val = code
}
}
2018-02-16 11:16:18 +01:00
} else if ( typeof val === 'number' ) {
val = val & 255
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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' )
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( end <= start ) {
return this
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
start = start >>> 0
end = end === undefined ? this . length : end >>> 0
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! val ) val = 0
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var i
if ( typeof val === 'number' ) {
for ( i = start ; i < end ; ++ i ) {
this [ i ] = val
}
} else {
var bytes = Buffer . isBuffer ( val )
? val
2019-01-10 12:43:45 +01:00
: Buffer . from ( val , encoding )
2018-02-16 11:16:18 +01:00
var len = bytes . length
2019-01-10 12:43:45 +01:00
if ( len === 0 ) {
throw new TypeError ( 'The value "' + val +
'" is invalid for argument "value"' )
}
2018-02-16 11:16:18 +01:00
for ( i = 0 ; i < end - start ; ++ i ) {
this [ i + start ] = bytes [ i % len ]
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return this
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// HELPER FUNCTIONS
// ================
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var INVALID _BASE64 _RE = /[^+/0-9A-Za-z-_]/g
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function base64clean ( str ) {
2019-01-10 12:43:45 +01:00
// Node takes equal signs as end of the Base64 encoding
str = str . split ( '=' ) [ 0 ]
2018-02-16 11:16:18 +01:00
// Node strips out invalid characters like \n and \t from the string, base64-js does not
2019-01-10 12:43:45 +01:00
str = str . trim ( ) . replace ( INVALID _BASE64 _RE , '' )
2018-02-16 11:16:18 +01:00
// Node converts strings with length < 2 to ''
if ( str . length < 2 ) return ''
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while ( str . length % 4 !== 0 ) {
str = str + '='
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return str
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function toHex ( n ) {
if ( n < 16 ) return '0' + n . toString ( 16 )
return n . toString ( 16 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function utf8ToBytes ( string , units ) {
units = units || Infinity
var codePoint
var length = string . length
var leadSurrogate = null
var bytes = [ ]
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
for ( var i = 0 ; i < length ; ++ i ) {
codePoint = string . charCodeAt ( i )
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// is surrogate component
if ( codePoint > 0xD7FF && codePoint < 0xE000 ) {
// last char was a lead
if ( ! leadSurrogate ) {
// no lead yet
if ( codePoint > 0xDBFF ) {
// unexpected trail
if ( ( units -= 3 ) > - 1 ) bytes . push ( 0xEF , 0xBF , 0xBD )
continue
} else if ( i + 1 === length ) {
// unpaired lead
if ( ( units -= 3 ) > - 1 ) bytes . push ( 0xEF , 0xBF , 0xBD )
continue
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// valid lead
leadSurrogate = codePoint
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
continue
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 2 leads in a row
if ( codePoint < 0xDC00 ) {
if ( ( units -= 3 ) > - 1 ) bytes . push ( 0xEF , 0xBF , 0xBD )
leadSurrogate = codePoint
continue
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// 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 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
leadSurrogate = null
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// encode utf8
if ( codePoint < 0x80 ) {
if ( ( units -= 1 ) < 0 ) break
bytes . push ( codePoint )
} else if ( codePoint < 0x800 ) {
if ( ( units -= 2 ) < 0 ) break
bytes . push (
codePoint >> 0x6 | 0xC0 ,
codePoint & 0x3F | 0x80
)
} else if ( codePoint < 0x10000 ) {
if ( ( units -= 3 ) < 0 ) break
bytes . push (
codePoint >> 0xC | 0xE0 ,
codePoint >> 0x6 & 0x3F | 0x80 ,
codePoint & 0x3F | 0x80
)
} 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 {
throw new Error ( 'Invalid code point' )
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return bytes
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function asciiToBytes ( str ) {
var byteArray = [ ]
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 )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return byteArray
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function utf16leToBytes ( str , units ) {
var c , hi , lo
var byteArray = [ ]
for ( var i = 0 ; i < str . length ; ++ i ) {
if ( ( units -= 2 ) < 0 ) break
c = str . charCodeAt ( i )
hi = c >> 8
lo = c % 256
byteArray . push ( lo )
byteArray . push ( hi )
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return byteArray
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function base64ToBytes ( str ) {
return base64 . toByteArray ( base64clean ( str ) )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
// the `instanceof` check but they should be treated as of that type.
// See: https://github.com/feross/buffer/issues/166
function isInstance ( obj , type ) {
return obj instanceof type ||
( obj != null && obj . constructor != null && obj . constructor . name != null &&
obj . constructor . name === type . name )
}
function numberIsNaN ( obj ) {
// For IE11 support
return obj !== obj // eslint-disable-line no-self-compare
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "base64-js" : 12 , "ieee754" : 17 } ] , 15 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
( 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.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function isArray ( arg ) {
if ( Array . isArray ) {
return Array . isArray ( arg ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return objectToString ( arg ) === '[object Array]' ;
}
exports . isArray = isArray ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isBoolean ( arg ) {
return typeof arg === 'boolean' ;
}
exports . isBoolean = isBoolean ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isNull ( arg ) {
return arg === null ;
}
exports . isNull = isNull ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isNullOrUndefined ( arg ) {
return arg == null ;
}
exports . isNullOrUndefined = isNullOrUndefined ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function isNumber ( arg ) {
return typeof arg === 'number' ;
}
exports . isNumber = isNumber ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function isString ( arg ) {
return typeof arg === 'string' ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
exports . isString = isString ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function isSymbol ( arg ) {
return typeof arg === 'symbol' ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
exports . isSymbol = isSymbol ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isUndefined ( arg ) {
return arg === void 0 ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
exports . isUndefined = isUndefined ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isRegExp ( re ) {
return objectToString ( re ) === '[object RegExp]' ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
exports . isRegExp = isRegExp ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isObject ( arg ) {
return typeof arg === 'object' && arg !== null ;
}
exports . isObject = isObject ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isDate ( d ) {
return objectToString ( d ) === '[object Date]' ;
}
exports . isDate = isDate ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isError ( e ) {
return ( objectToString ( e ) === '[object Error]' || e instanceof Error ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
exports . isError = isError ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isFunction ( arg ) {
return typeof arg === 'function' ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
exports . isFunction = isFunction ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isPrimitive ( arg ) {
return arg === null ||
typeof arg === 'boolean' ||
typeof arg === 'number' ||
typeof arg === 'string' ||
typeof arg === 'symbol' || // ES6 symbol
typeof arg === 'undefined' ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
exports . isPrimitive = isPrimitive ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
exports . isBuffer = Buffer . isBuffer ;
function objectToString ( o ) {
return Object . prototype . toString . call ( o ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ) . call ( this , { "isBuffer" : require ( "../../is-buffer/index.js" ) } )
2019-01-10 12:43:45 +01:00
} , { "../../is-buffer/index.js" : 19 } ] , 16 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
// Copyright Joyent, Inc. and other Node contributors.
2016-11-29 11:09:07 +01:00
//
2018-02-16 11:16:18 +01:00
// 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:
2016-11-29 11:09:07 +01:00
//
2018-02-16 11:16:18 +01:00
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
2016-11-29 11:09:07 +01:00
//
2018-02-16 11:16:18 +01:00
// 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.
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var objectCreate = Object . create || objectCreatePolyfill
var objectKeys = Object . keys || objectKeysPolyfill
var bind = Function . prototype . bind || functionBindPolyfill
2018-02-16 11:16:18 +01:00
function EventEmitter ( ) {
2019-01-10 12:43:45 +01:00
if ( ! this . _events || ! Object . prototype . hasOwnProperty . call ( this , '_events' ) ) {
this . _events = objectCreate ( null ) ;
this . _eventsCount = 0 ;
}
2018-02-16 11:16:18 +01:00
this . _maxListeners = this . _maxListeners || undefined ;
}
module . exports = EventEmitter ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Backwards-compat with node 0.10.x
EventEmitter . EventEmitter = EventEmitter ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
EventEmitter . prototype . _events = undefined ;
EventEmitter . prototype . _maxListeners = undefined ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
2019-01-10 12:43:45 +01:00
var defaultMaxListeners = 10 ;
var hasDefineProperty ;
try {
var o = { } ;
if ( Object . defineProperty ) Object . defineProperty ( o , 'x' , { value : 0 } ) ;
hasDefineProperty = o . x === 0 ;
} catch ( err ) { hasDefineProperty = false }
if ( hasDefineProperty ) {
Object . defineProperty ( EventEmitter , 'defaultMaxListeners' , {
enumerable : true ,
get : function ( ) {
return defaultMaxListeners ;
} ,
set : function ( arg ) {
// check whether the input is a positive number (whose value is zero or
// greater and not a NaN).
if ( typeof arg !== 'number' || arg < 0 || arg !== arg )
throw new TypeError ( '"defaultMaxListeners" must be a positive number' ) ;
defaultMaxListeners = arg ;
}
} ) ;
} else {
EventEmitter . defaultMaxListeners = defaultMaxListeners ;
}
2018-02-16 11:16:18 +01:00
// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . setMaxListeners = function setMaxListeners ( n ) {
if ( typeof n !== 'number' || n < 0 || isNaN ( n ) )
throw new TypeError ( '"n" argument must be a positive number' ) ;
2018-02-16 11:16:18 +01:00
this . _maxListeners = n ;
return this ;
} ;
2019-01-10 12:43:45 +01:00
function $getMaxListeners ( that ) {
if ( that . _maxListeners === undefined )
return EventEmitter . defaultMaxListeners ;
return that . _maxListeners ;
}
EventEmitter . prototype . getMaxListeners = function getMaxListeners ( ) {
return $getMaxListeners ( this ) ;
} ;
// These standalone emit* functions are used to optimize calling of event
// handlers for fast cases because emit() itself often has a variable number of
// arguments and can be deoptimized because of that. These functions always have
// the same number of arguments and thus do not get deoptimized, so the code
// inside them can execute faster.
function emitNone ( handler , isFn , self ) {
if ( isFn )
handler . call ( self ) ;
else {
var len = handler . length ;
var listeners = arrayClone ( handler , len ) ;
for ( var i = 0 ; i < len ; ++ i )
listeners [ i ] . call ( self ) ;
}
}
function emitOne ( handler , isFn , self , arg1 ) {
if ( isFn )
handler . call ( self , arg1 ) ;
else {
var len = handler . length ;
var listeners = arrayClone ( handler , len ) ;
for ( var i = 0 ; i < len ; ++ i )
listeners [ i ] . call ( self , arg1 ) ;
}
}
function emitTwo ( handler , isFn , self , arg1 , arg2 ) {
if ( isFn )
handler . call ( self , arg1 , arg2 ) ;
else {
var len = handler . length ;
var listeners = arrayClone ( handler , len ) ;
for ( var i = 0 ; i < len ; ++ i )
listeners [ i ] . call ( self , arg1 , arg2 ) ;
}
}
function emitThree ( handler , isFn , self , arg1 , arg2 , arg3 ) {
if ( isFn )
handler . call ( self , arg1 , arg2 , arg3 ) ;
else {
var len = handler . length ;
var listeners = arrayClone ( handler , len ) ;
for ( var i = 0 ; i < len ; ++ i )
listeners [ i ] . call ( self , arg1 , arg2 , arg3 ) ;
}
}
function emitMany ( handler , isFn , self , args ) {
if ( isFn )
handler . apply ( self , args ) ;
else {
var len = handler . length ;
var listeners = arrayClone ( handler , len ) ;
for ( var i = 0 ; i < len ; ++ i )
listeners [ i ] . apply ( self , args ) ;
}
}
EventEmitter . prototype . emit = function emit ( type ) {
var er , handler , len , args , i , events ;
var doError = ( type === 'error' ) ;
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
events = this . _events ;
if ( events )
doError = ( doError && events . error == null ) ;
else if ( ! doError )
return false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// If there is no 'error' event listener then throw.
2019-01-10 12:43:45 +01:00
if ( doError ) {
if ( arguments . length > 1 )
2018-02-16 11:16:18 +01:00
er = arguments [ 1 ] ;
2019-01-10 12:43:45 +01:00
if ( er instanceof Error ) {
throw er ; // Unhandled 'error' event
} else {
// At least give some kind of context to the user
var err = new Error ( 'Unhandled "error" event. (' + er + ')' ) ;
err . context = er ;
throw err ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
return false ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
handler = events [ type ] ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( ! handler )
2018-02-16 11:16:18 +01:00
return false ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var isFn = typeof handler === 'function' ;
len = arguments . length ;
switch ( len ) {
2018-02-16 11:16:18 +01:00
// fast cases
2019-01-10 12:43:45 +01:00
case 1 :
emitNone ( handler , isFn , this ) ;
break ;
case 2 :
emitOne ( handler , isFn , this , arguments [ 1 ] ) ;
break ;
case 3 :
emitTwo ( handler , isFn , this , arguments [ 1 ] , arguments [ 2 ] ) ;
break ;
case 4 :
emitThree ( handler , isFn , this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
break ;
2018-02-16 11:16:18 +01:00
// slower
2019-01-10 12:43:45 +01:00
default :
args = new Array ( len - 1 ) ;
for ( i = 1 ; i < len ; i ++ )
args [ i - 1 ] = arguments [ i ] ;
emitMany ( handler , isFn , this , args ) ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return true ;
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
function _addListener ( target , type , listener , prepend ) {
2018-02-16 11:16:18 +01:00
var m ;
2019-01-10 12:43:45 +01:00
var events ;
var existing ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
if ( typeof listener !== 'function' )
throw new TypeError ( '"listener" argument must be a function' ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
events = target . _events ;
if ( ! events ) {
events = target . _events = objectCreate ( null ) ;
target . _eventsCount = 0 ;
} else {
// To avoid recursion in the case that type === "newListener"! Before
// adding it to the listeners, first emit "newListener".
if ( events . newListener ) {
target . emit ( 'newListener' , type ,
listener . listener ? listener . listener : listener ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Re-assign `events` because a newListener handler could have caused the
// this._events to be assigned to a new object
events = target . _events ;
}
existing = events [ type ] ;
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( ! existing ) {
2018-02-16 11:16:18 +01:00
// Optimize the case of one listener. Don't need the extra array object.
2019-01-10 12:43:45 +01:00
existing = events [ type ] = listener ;
++ target . _eventsCount ;
} else {
if ( typeof existing === 'function' ) {
// Adding the second element, need to change to array.
existing = events [ type ] =
prepend ? [ listener , existing ] : [ existing , listener ] ;
2018-02-16 11:16:18 +01:00
} else {
2019-01-10 12:43:45 +01:00
// If we've already got an array, just append.
if ( prepend ) {
existing . unshift ( listener ) ;
} else {
existing . push ( listener ) ;
}
}
// Check for listener leak
if ( ! existing . warned ) {
m = $getMaxListeners ( target ) ;
if ( m && m > 0 && existing . length > m ) {
existing . warned = true ;
var w = new Error ( 'Possible EventEmitter memory leak detected. ' +
existing . length + ' "' + String ( type ) + '" listeners ' +
'added. Use emitter.setMaxListeners() to ' +
'increase limit.' ) ;
w . name = 'MaxListenersExceededWarning' ;
w . emitter = target ;
w . type = type ;
w . count = existing . length ;
if ( typeof console === 'object' && console . warn ) {
console . warn ( '%s: %s' , w . name , w . message ) ;
}
2018-02-16 11:16:18 +01:00
}
}
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
return target ;
}
EventEmitter . prototype . addListener = function addListener ( type , listener ) {
return _addListener ( this , type , listener , false ) ;
2018-02-16 11:16:18 +01:00
} ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
EventEmitter . prototype . on = EventEmitter . prototype . addListener ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . prependListener =
function prependListener ( type , listener ) {
return _addListener ( this , type , listener , true ) ;
} ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
function onceWrapper ( ) {
if ( ! this . fired ) {
this . target . removeListener ( this . type , this . wrapFn ) ;
this . fired = true ;
switch ( arguments . length ) {
case 0 :
return this . listener . call ( this . target ) ;
case 1 :
return this . listener . call ( this . target , arguments [ 0 ] ) ;
case 2 :
return this . listener . call ( this . target , arguments [ 0 ] , arguments [ 1 ] ) ;
case 3 :
return this . listener . call ( this . target , arguments [ 0 ] , arguments [ 1 ] ,
arguments [ 2 ] ) ;
default :
var args = new Array ( arguments . length ) ;
for ( var i = 0 ; i < args . length ; ++ i )
args [ i ] = arguments [ i ] ;
this . listener . apply ( this . target , args ) ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
}
2019-01-10 12:43:45 +01:00
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
function _onceWrap ( target , type , listener ) {
var state = { fired : false , wrapFn : undefined , target : target , type : type , listener : listener } ;
var wrapped = bind . call ( onceWrapper , state ) ;
wrapped . listener = listener ;
state . wrapFn = wrapped ;
return wrapped ;
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . once = function once ( type , listener ) {
if ( typeof listener !== 'function' )
throw new TypeError ( '"listener" argument must be a function' ) ;
this . on ( type , _onceWrap ( this , type , listener ) ) ;
2018-02-16 11:16:18 +01:00
return this ;
2016-11-29 11:09:07 +01:00
} ;
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . prependOnceListener =
function prependOnceListener ( type , listener ) {
if ( typeof listener !== 'function' )
throw new TypeError ( '"listener" argument must be a function' ) ;
this . prependListener ( type , _onceWrap ( this , type , listener ) ) ;
return this ;
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter . prototype . removeListener =
function removeListener ( type , listener ) {
var list , events , position , i , originalListener ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( typeof listener !== 'function' )
throw new TypeError ( '"listener" argument must be a function' ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
events = this . _events ;
if ( ! events )
return this ;
list = events [ type ] ;
if ( ! list )
return this ;
if ( list === listener || list . listener === listener ) {
if ( -- this . _eventsCount === 0 )
this . _events = objectCreate ( null ) ;
else {
delete events [ type ] ;
if ( events . removeListener )
this . emit ( 'removeListener' , type , list . listener || listener ) ;
}
} else if ( typeof list !== 'function' ) {
position = - 1 ;
for ( i = list . length - 1 ; i >= 0 ; i -- ) {
if ( list [ i ] === listener || list [ i ] . listener === listener ) {
originalListener = list [ i ] . listener ;
position = i ;
break ;
}
}
if ( position < 0 )
return this ;
if ( position === 0 )
list . shift ( ) ;
else
spliceOne ( list , position ) ;
if ( list . length === 1 )
events [ type ] = list [ 0 ] ;
if ( events . removeListener )
this . emit ( 'removeListener' , type , originalListener || listener ) ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return this ;
2019-01-10 12:43:45 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . removeAllListeners =
function removeAllListeners ( type ) {
var listeners , events , i ;
events = this . _events ;
if ( ! events )
return this ;
// not listening for removeListener, no need to emit
if ( ! events . removeListener ) {
if ( arguments . length === 0 ) {
this . _events = objectCreate ( null ) ;
this . _eventsCount = 0 ;
} else if ( events [ type ] ) {
if ( -- this . _eventsCount === 0 )
this . _events = objectCreate ( null ) ;
else
delete events [ type ] ;
}
return this ;
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// emit removeListener for all listeners on all events
if ( arguments . length === 0 ) {
var keys = objectKeys ( events ) ;
var key ;
for ( i = 0 ; i < keys . length ; ++ i ) {
key = keys [ i ] ;
if ( key === 'removeListener' ) continue ;
this . removeAllListeners ( key ) ;
}
this . removeAllListeners ( 'removeListener' ) ;
this . _events = objectCreate ( null ) ;
this . _eventsCount = 0 ;
return this ;
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
listeners = events [ type ] ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( typeof listeners === 'function' ) {
this . removeListener ( type , listeners ) ;
} else if ( listeners ) {
// LIFO order
for ( i = listeners . length - 1 ; i >= 0 ; i -- ) {
this . removeListener ( type , listeners [ i ] ) ;
}
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
return this ;
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
function _listeners ( target , type , unwrap ) {
var events = target . _events ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( ! events )
return [ ] ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var evlistener = events [ type ] ;
if ( ! evlistener )
return [ ] ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( typeof evlistener === 'function' )
return unwrap ? [ evlistener . listener || evlistener ] : [ evlistener ] ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
return unwrap ? unwrapListeners ( evlistener ) : arrayClone ( evlistener , evlistener . length ) ;
}
EventEmitter . prototype . listeners = function listeners ( type ) {
return _listeners ( this , type , true ) ;
2018-02-16 11:16:18 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . rawListeners = function rawListeners ( type ) {
return _listeners ( this , type , false ) ;
} ;
EventEmitter . listenerCount = function ( emitter , type ) {
if ( typeof emitter . listenerCount === 'function' ) {
return emitter . listenerCount ( type ) ;
} else {
return listenerCount . call ( emitter , type ) ;
}
2015-07-14 19:23:35 +02:00
} ;
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . listenerCount = listenerCount ;
function listenerCount ( type ) {
var events = this . _events ;
if ( events ) {
var evlistener = events [ type ] ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( typeof evlistener === 'function' ) {
2018-02-16 11:16:18 +01:00
return 1 ;
2019-01-10 12:43:45 +01:00
} else if ( evlistener ) {
2018-02-16 11:16:18 +01:00
return evlistener . length ;
2019-01-10 12:43:45 +01:00
}
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
2018-02-16 11:16:18 +01:00
return 0 ;
2019-01-10 12:43:45 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
EventEmitter . prototype . eventNames = function eventNames ( ) {
return this . _eventsCount > 0 ? Reflect . ownKeys ( this . _events ) : [ ] ;
2018-02-16 11:16:18 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// About 1.5x faster than the two-arg version of Array#splice().
function spliceOne ( list , index ) {
for ( var i = index , k = i + 1 , n = list . length ; k < n ; i += 1 , k += 1 )
list [ i ] = list [ k ] ;
list . pop ( ) ;
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
function arrayClone ( arr , n ) {
var copy = new Array ( n ) ;
for ( var i = 0 ; i < n ; ++ i )
copy [ i ] = arr [ i ] ;
return copy ;
2016-11-29 11:09:07 +01:00
}
2019-01-10 12:43:45 +01:00
function unwrapListeners ( arr ) {
var ret = new Array ( arr . length ) ;
for ( var i = 0 ; i < ret . length ; ++ i ) {
ret [ i ] = arr [ i ] . listener || arr [ i ] ;
}
return ret ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
function objectCreatePolyfill ( proto ) {
var F = function ( ) { } ;
F . prototype = proto ;
return new F ;
}
function objectKeysPolyfill ( obj ) {
var keys = [ ] ;
for ( var k in obj ) if ( Object . prototype . hasOwnProperty . call ( obj , k ) ) {
keys . push ( k ) ;
}
return k ;
}
function functionBindPolyfill ( context ) {
var fn = this ;
return function ( ) {
return fn . apply ( context , arguments ) ;
} ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { } ] , 17 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
exports . read = function ( buffer , offset , isLE , mLen , nBytes ) {
var e , m
2019-01-10 12:43:45 +01:00
var eLen = ( nBytes * 8 ) - mLen - 1
2018-02-16 11:16:18 +01:00
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 ]
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
i += d
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
e = s & ( ( 1 << ( - nBits ) ) - 1 )
s >>= ( - nBits )
nBits += eLen
2019-01-10 12:43:45 +01:00
for ( ; nBits > 0 ; e = ( e * 256 ) + buffer [ offset + i ] , i += d , nBits -= 8 ) { }
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
m = e & ( ( 1 << ( - nBits ) ) - 1 )
e >>= ( - nBits )
nBits += mLen
2019-01-10 12:43:45 +01:00
for ( ; nBits > 0 ; m = ( m * 256 ) + buffer [ offset + i ] , i += d , nBits -= 8 ) { }
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 )
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
exports . write = function ( buffer , value , offset , isLE , mLen , nBytes ) {
var e , m , c
2019-01-10 12:43:45 +01:00
var eLen = ( nBytes * 8 ) - mLen - 1
2018-02-16 11:16:18 +01:00
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
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
value = Math . abs ( value )
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
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
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( e + eBias >= eMax ) {
m = 0
e = eMax
} else if ( e + eBias >= 1 ) {
2019-01-10 12:43:45 +01:00
m = ( ( value * c ) - 1 ) * Math . pow ( 2 , mLen )
2018-02-16 11:16:18 +01:00
e = e + eBias
} else {
m = value * Math . pow ( 2 , eBias - 1 ) * Math . pow ( 2 , mLen )
e = 0
}
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
for ( ; mLen >= 8 ; buffer [ offset + i ] = m & 0xff , i += d , m /= 256 , mLen -= 8 ) { }
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
e = ( e << mLen ) | m
eLen += mLen
for ( ; eLen > 0 ; buffer [ offset + i ] = e & 0xff , i += d , e /= 256 , eLen -= 8 ) { }
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
buffer [ offset + i - d ] |= s * 128
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { } ] , 18 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
if ( typeof Object . create === 'function' ) {
// implementation from standard node.js 'util' module
module . exports = function inherits ( ctor , superCtor ) {
ctor . super _ = superCtor
ctor . prototype = Object . create ( superCtor . prototype , {
constructor : {
value : ctor ,
enumerable : false ,
writable : true ,
configurable : true
}
} ) ;
2016-11-29 11:09:07 +01:00
} ;
2018-02-16 11:16:18 +01:00
} else {
// old school shim for old browsers
module . exports = function inherits ( ctor , superCtor ) {
ctor . super _ = superCtor
var TempCtor = function ( ) { }
TempCtor . prototype = superCtor . prototype
ctor . prototype = new TempCtor ( )
ctor . prototype . constructor = ctor
}
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { } ] , 19 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
/ * !
* Determine if an object is a Buffer
*
2019-01-10 12:43:45 +01:00
* @ author Feross Aboukhadijeh < https : //feross.org>
2018-02-16 11:16:18 +01:00
* @ license MIT
* /
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isBuffer ( obj ) {
return ! ! obj . constructor && typeof obj . constructor . isBuffer === 'function' && obj . constructor . isBuffer ( obj )
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ) )
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { } ] , 20 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
var toString = { } . toString ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
module . exports = Array . isArray || function ( arr ) {
return toString . call ( arr ) == '[object Array]' ;
} ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
} , { } ] , 21 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
( function ( process ) {
'use strict' ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( ! process . version ||
process . version . indexOf ( 'v0.' ) === 0 ||
process . version . indexOf ( 'v1.' ) === 0 && process . version . indexOf ( 'v1.8.' ) !== 0 ) {
2019-01-10 12:43:45 +01:00
module . exports = { nextTick : nextTick } ;
2018-02-16 11:16:18 +01:00
} else {
2019-01-10 12:43:45 +01:00
module . exports = process
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
function nextTick ( fn , arg1 , arg2 , arg3 ) {
if ( typeof fn !== 'function' ) {
throw new TypeError ( '"callback" argument must be a function' ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
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 ) ;
2016-11-29 11:09:07 +01:00
} ) ;
2018-02-16 11:16:18 +01:00
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 ] ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return process . nextTick ( function afterTick ( ) {
fn . apply ( null , args ) ;
} ) ;
}
2015-07-14 19:23:35 +02:00
}
2019-01-10 12:43:45 +01:00
2018-02-16 11:16:18 +01:00
} ) . call ( this , require ( '_process' ) )
2019-01-10 12:43:45 +01:00
} , { "_process" : 22 } ] , 22 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
// shim for using process in browser
var process = module . exports = { } ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var cachedSetTimeout ;
var cachedClearTimeout ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
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 ) ;
}
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
}
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 ) ;
}
}
2016-11-29 11:09:07 +01:00
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
}
var queue = [ ] ;
var draining = false ;
var currentQueue ;
var queueIndex = - 1 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function cleanUpNextTick ( ) {
if ( ! draining || ! currentQueue ) {
return ;
}
draining = false ;
if ( currentQueue . length ) {
queue = currentQueue . concat ( queue ) ;
} else {
queueIndex = - 1 ;
}
if ( queue . length ) {
drainQueue ( ) ;
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
function drainQueue ( ) {
if ( draining ) {
return ;
}
var timeout = runTimeout ( cleanUpNextTick ) ;
draining = true ;
var len = queue . length ;
while ( len ) {
currentQueue = queue ;
queue = [ ] ;
while ( ++ queueIndex < len ) {
if ( currentQueue ) {
currentQueue [ queueIndex ] . run ( ) ;
}
}
queueIndex = - 1 ;
len = queue . length ;
}
currentQueue = null ;
draining = false ;
runClearTimeout ( timeout ) ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
process . nextTick = function ( fun ) {
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 ) ;
}
} ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 = { } ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function noop ( ) { }
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
process . on = noop ;
process . addListener = noop ;
process . once = noop ;
process . off = noop ;
process . removeListener = noop ;
process . removeAllListeners = noop ;
process . emit = noop ;
2019-01-10 12:43:45 +01:00
process . prependListener = noop ;
process . prependOnceListener = noop ;
process . listeners = function ( name ) { return [ ] }
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
process . binding = function ( name ) {
throw new Error ( 'process.binding is not supported' ) ;
2015-07-14 19:23:35 +02:00
} ;
2018-02-16 11:16:18 +01:00
process . cwd = function ( ) { return '/' } ;
process . chdir = function ( dir ) {
throw new Error ( 'process.chdir is not supported' ) ;
2015-07-14 19:23:35 +02:00
} ;
2018-02-16 11:16:18 +01:00
process . umask = function ( ) { return 0 ; } ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { } ] , 23 : [ function ( require , module , exports ) {
module . exports = require ( './lib/_stream_duplex.js' ) ;
} , { "./lib/_stream_duplex.js" : 24 } ] , 24 : [ 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.
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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.
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
'use strict' ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
var pna = require ( 'process-nextick-args' ) ;
/*</replacement>*/
/*<replacement>*/
2018-02-16 11:16:18 +01:00
var objectKeys = Object . keys || function ( obj ) {
var keys = [ ] ;
for ( var key in obj ) {
keys . push ( key ) ;
} return keys ;
} ;
/*</replacement>*/
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
module . exports = Duplex ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var util = require ( 'core-util-is' ) ;
util . inherits = require ( 'inherits' ) ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var Readable = require ( './_stream_readable' ) ;
var Writable = require ( './_stream_writable' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
util . inherits ( Duplex , Readable ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
{
// avoid scope creep, the keys array can then be collected
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 ] ;
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function Duplex ( options ) {
if ( ! ( this instanceof Duplex ) ) return new Duplex ( options ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Readable . call ( this , options ) ;
Writable . call ( this , options ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( options && options . readable === false ) this . readable = false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( options && options . writable === false ) this . writable = false ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
this . allowHalfOpen = true ;
if ( options && options . allowHalfOpen === false ) this . allowHalfOpen = false ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
this . once ( 'end' , onend ) ;
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
Object . defineProperty ( Duplex . prototype , 'writableHighWaterMark' , {
// making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable : false ,
get : function ( ) {
return this . _writableState . highWaterMark ;
}
} ) ;
2018-02-16 11:16:18 +01:00
// the no-half-open enforcer
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 ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// no more data can be written.
// But allow more writes to happen in this tick.
2019-01-10 12:43:45 +01:00
pna . nextTick ( onEndNT , this ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function onEndNT ( self ) {
self . end ( ) ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
Object . defineProperty ( Duplex . prototype , 'destroyed' , {
get : function ( ) {
if ( this . _readableState === undefined || this . _writableState === undefined ) {
return false ;
}
return this . _readableState . destroyed && this . _writableState . destroyed ;
} ,
set : function ( value ) {
// we ignore the value if the stream
// has not been initialized yet
if ( this . _readableState === undefined || this . _writableState === undefined ) {
return ;
}
// backward compatibility, the user is explicitly
// managing destroyed
this . _readableState . destroyed = value ;
this . _writableState . destroyed = value ;
2015-07-14 19:23:35 +02:00
}
2019-01-10 12:43:45 +01:00
} ) ;
Duplex . prototype . _destroy = function ( err , cb ) {
this . push ( null ) ;
this . end ( ) ;
pna . nextTick ( cb , err ) ;
} ;
} , { "./_stream_readable" : 26 , "./_stream_writable" : 28 , "core-util-is" : 15 , "inherits" : 18 , "process-nextick-args" : 21 } ] , 25 : [ 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.
2018-02-16 11:16:18 +01:00
// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
'use strict' ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
module . exports = PassThrough ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var Transform = require ( './_stream_transform' ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var util = require ( 'core-util-is' ) ;
util . inherits = require ( 'inherits' ) ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
util . inherits ( PassThrough , Transform ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function PassThrough ( options ) {
if ( ! ( this instanceof PassThrough ) ) return new PassThrough ( options ) ;
Transform . call ( this , options ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
PassThrough . prototype . _transform = function ( chunk , encoding , cb ) {
cb ( null , chunk ) ;
2016-11-29 11:09:07 +01:00
} ;
2019-01-10 12:43:45 +01:00
} , { "./_stream_transform" : 27 , "core-util-is" : 15 , "inherits" : 18 } ] , 26 : [ function ( require , module , exports ) {
( function ( process , global ) {
// 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.
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
'use strict' ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2019-01-10 12:43:45 +01:00
var pna = require ( 'process-nextick-args' ) ;
2018-02-16 11:16:18 +01:00
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
module . exports = Readable ;
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var isArray = require ( 'isarray' ) ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var Duplex ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Readable . ReadableState = ReadableState ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var EE = require ( 'events' ) . EventEmitter ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var EElistenerCount = function ( emitter , type ) {
return emitter . listeners ( type ) . length ;
} ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2019-01-10 12:43:45 +01:00
var Stream = require ( './internal/streams/stream' ) ;
2018-02-16 11:16:18 +01:00
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2019-01-10 12:43:45 +01:00
var Buffer = require ( 'safe-buffer' ) . Buffer ;
var OurUint8Array = global . Uint8Array || function ( ) { } ;
function _uint8ArrayToBuffer ( chunk ) {
return Buffer . from ( chunk ) ;
}
function _isUint8Array ( obj ) {
return Buffer . isBuffer ( obj ) || obj instanceof OurUint8Array ;
}
2018-02-16 11:16:18 +01:00
/*</replacement>*/
/*<replacement>*/
var util = require ( 'core-util-is' ) ;
util . inherits = require ( 'inherits' ) ;
/*</replacement>*/
/*<replacement>*/
var debugUtil = require ( 'util' ) ;
var debug = void 0 ;
if ( debugUtil && debugUtil . debuglog ) {
debug = debugUtil . debuglog ( 'stream' ) ;
} else {
debug = function ( ) { } ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var BufferList = require ( './internal/streams/BufferList' ) ;
2019-01-10 12:43:45 +01:00
var destroyImpl = require ( './internal/streams/destroy' ) ;
2018-02-16 11:16:18 +01:00
var StringDecoder ;
util . inherits ( Readable , Stream ) ;
2019-01-10 12:43:45 +01:00
var kProxyEvents = [ 'error' , 'close' , 'destroy' , 'pause' , 'resume' ] ;
2018-02-16 11:16:18 +01:00
function prependListener ( emitter , event , fn ) {
// Sadly this is not cacheable as some libraries bundle their own
// event emitter implementation with them.
2019-01-10 12:43:45 +01:00
if ( typeof emitter . prependListener === 'function' ) return emitter . prependListener ( event , fn ) ;
// 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 ] ] ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function ReadableState ( options , stream ) {
Duplex = Duplex || require ( './_stream_duplex' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
options = options || { } ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Duplex streams are both readable and writable, but share
// the same options object.
// However, some cases require setting options to different
// values for the readable and the writable sides of the duplex stream.
// These options can be provided separately as readableXXX and writableXXX.
var isDuplex = stream instanceof Duplex ;
2018-02-16 11:16:18 +01:00
// 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 ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( isDuplex ) this . objectMode = this . objectMode || ! ! options . readableObjectMode ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ;
2019-01-10 12:43:45 +01:00
var readableHwm = options . readableHighWaterMark ;
2018-02-16 11:16:18 +01:00
var defaultHwm = this . objectMode ? 16 : 16 * 1024 ;
2019-01-10 12:43:45 +01:00
if ( hwm || hwm === 0 ) this . highWaterMark = hwm ; else if ( isDuplex && ( readableHwm || readableHwm === 0 ) ) this . highWaterMark = readableHwm ; else this . highWaterMark = defaultHwm ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// cast to ints.
2019-01-10 12:43:45 +01:00
this . highWaterMark = Math . floor ( this . highWaterMark ) ;
2018-02-16 11:16:18 +01:00
// 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 ( ) ;
2016-11-29 11:09:07 +01:00
this . length = 0 ;
2018-02-16 11:16:18 +01:00
this . pipes = null ;
this . pipesCount = 0 ;
this . flowing = null ;
this . ended = false ;
this . endEmitted = false ;
this . reading = false ;
2019-01-10 12:43:45 +01:00
// a flag to be able to tell if the event 'readable'/'data' is emitted
// immediately, 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 read call.
2018-02-16 11:16:18 +01:00
this . sync = true ;
// whenever we return null, then we set a flag to say
// that we're awaiting a 'readable' event emission.
this . needReadable = false ;
this . emittedReadable = false ;
this . readableListening = false ;
this . resumeScheduled = false ;
2019-01-10 12:43:45 +01:00
// has it been destroyed
this . destroyed = false ;
2018-02-16 11:16:18 +01:00
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this . defaultEncoding = options . defaultEncoding || 'utf8' ;
// the number of writers that are awaiting a drain event in .pipe()s
this . awaitDrain = 0 ;
// if true, a maybeReadMore has been scheduled
this . readingMore = false ;
this . decoder = null ;
this . encoding = null ;
if ( options . encoding ) {
if ( ! StringDecoder ) StringDecoder = require ( 'string_decoder/' ) . StringDecoder ;
this . decoder = new StringDecoder ( options . encoding ) ;
this . encoding = options . encoding ;
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
function Readable ( options ) {
Duplex = Duplex || require ( './_stream_duplex' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! ( this instanceof Readable ) ) return new Readable ( options ) ;
this . _readableState = new ReadableState ( options , this ) ;
// legacy
this . readable = true ;
2019-01-10 12:43:45 +01:00
if ( options ) {
if ( typeof options . read === 'function' ) this . _read = options . read ;
if ( typeof options . destroy === 'function' ) this . _destroy = options . destroy ;
}
2018-02-16 11:16:18 +01:00
Stream . call ( this ) ;
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
Object . defineProperty ( Readable . prototype , 'destroyed' , {
get : function ( ) {
if ( this . _readableState === undefined ) {
return false ;
}
return this . _readableState . destroyed ;
} ,
set : function ( value ) {
// we ignore the value if the stream
// has not been initialized yet
if ( ! this . _readableState ) {
return ;
}
// backward compatibility, the user is explicitly
// managing destroyed
this . _readableState . destroyed = value ;
}
} ) ;
Readable . prototype . destroy = destroyImpl . destroy ;
Readable . prototype . _undestroy = destroyImpl . undestroy ;
Readable . prototype . _destroy = function ( err , cb ) {
this . push ( null ) ;
cb ( err ) ;
} ;
2018-02-16 11:16:18 +01:00
// Manually shove something into the read() buffer.
// 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 ) {
var state = this . _readableState ;
2019-01-10 12:43:45 +01:00
var skipChunkCheck ;
if ( ! state . objectMode ) {
if ( typeof chunk === 'string' ) {
encoding = encoding || state . defaultEncoding ;
if ( encoding !== state . encoding ) {
chunk = Buffer . from ( chunk , encoding ) ;
encoding = '' ;
}
skipChunkCheck = true ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
} else {
skipChunkCheck = true ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
return readableAddChunk ( this , chunk , encoding , false , skipChunkCheck ) ;
2016-11-29 11:09:07 +01:00
} ;
2018-02-16 11:16:18 +01:00
// Unshift should *always* be something directly out of read()
Readable . prototype . unshift = function ( chunk ) {
2019-01-10 12:43:45 +01:00
return readableAddChunk ( this , chunk , null , true , false ) ;
2016-11-29 11:09:07 +01:00
} ;
2019-01-10 12:43:45 +01:00
function readableAddChunk ( stream , chunk , encoding , addToFront , skipChunkCheck ) {
var state = stream . _readableState ;
if ( chunk === null ) {
2018-02-16 11:16:18 +01:00
state . reading = false ;
onEofChunk ( stream , state ) ;
2019-01-10 12:43:45 +01:00
} else {
var er ;
if ( ! skipChunkCheck ) er = chunkInvalid ( state , chunk ) ;
if ( er ) {
stream . emit ( 'error' , er ) ;
} else if ( state . objectMode || chunk && chunk . length > 0 ) {
if ( typeof chunk !== 'string' && ! state . objectMode && Object . getPrototypeOf ( chunk ) !== Buffer . prototype ) {
chunk = _uint8ArrayToBuffer ( chunk ) ;
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
if ( addToFront ) {
if ( state . endEmitted ) stream . emit ( 'error' , new Error ( 'stream.unshift() after end event' ) ) ; else addChunk ( stream , state , chunk , true ) ;
} else if ( state . ended ) {
stream . emit ( 'error' , new Error ( 'stream.push() after EOF' ) ) ;
} else {
state . reading = false ;
if ( state . decoder && ! encoding ) {
chunk = state . decoder . write ( chunk ) ;
if ( state . objectMode || chunk . length !== 0 ) addChunk ( stream , state , chunk , false ) ; else maybeReadMore ( stream , state ) ;
2018-02-16 11:16:18 +01:00
} else {
2019-01-10 12:43:45 +01:00
addChunk ( stream , state , chunk , false ) ;
2018-02-16 11:16:18 +01:00
}
}
2019-01-10 12:43:45 +01:00
} else if ( ! addToFront ) {
state . reading = false ;
2018-02-16 11:16:18 +01:00
}
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
return needMoreData ( state ) ;
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
function addChunk ( stream , state , chunk , addToFront ) {
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 ) ;
}
function chunkInvalid ( state , chunk ) {
var er ;
if ( ! _isUint8Array ( chunk ) && typeof chunk !== 'string' && chunk !== undefined && ! state . objectMode ) {
er = new TypeError ( 'Invalid non-string/buffer chunk' ) ;
}
return er ;
}
2018-02-16 11:16:18 +01:00
// 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,
// such as the repl. Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// 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 ) ;
}
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
Readable . prototype . isPaused = function ( ) {
return this . _readableState . flowing === false ;
} ;
2018-02-16 11:16:18 +01:00
// backwards compatibility.
Readable . prototype . setEncoding = function ( enc ) {
if ( ! StringDecoder ) StringDecoder = require ( 'string_decoder/' ) . StringDecoder ;
this . _readableState . decoder = new StringDecoder ( enc ) ;
this . _readableState . encoding = enc ;
return this ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Don't raise the hwm > 8MB
var MAX _HWM = 0x800000 ;
function computeNewHighWaterMark ( n ) {
if ( n >= MAX _HWM ) {
n = MAX _HWM ;
} else {
// Get the next highest power of 2 to prevent increasing hwm excessively in
// tiny amounts
n -- ;
n |= n >>> 1 ;
n |= n >>> 2 ;
n |= n >>> 4 ;
n |= n >>> 8 ;
n |= n >>> 16 ;
n ++ ;
}
return n ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function howMuchToRead ( n , state ) {
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 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 ;
}
return state . length ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// you can override either this method, or the async _read(n) below.
Readable . prototype . read = function ( n ) {
debug ( 'read' , n ) ;
n = parseInt ( n , 10 ) ;
var state = this . _readableState ;
var nOrig = n ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( n !== 0 ) state . emittedReadable = false ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 ) ) {
debug ( 'read: emitReadable' , state . length , state . ended ) ;
if ( state . length === 0 && state . ended ) endReadable ( this ) ; else emitReadable ( this ) ;
return null ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
n = howMuchToRead ( n , state ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// if we've ended, and we're now clear, then finish it up.
if ( n === 0 && state . ended ) {
if ( state . length === 0 ) endReadable ( this ) ;
return null ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// All the actual chunk generation logic needs to be
// *below* the call to _read. The reason is that in certain
// synthetic stream cases, such as passthrough streams, _read
// may be a completely synchronous operation which may change
// the state of the read buffer, providing enough data when
// before there was *not* enough.
//
// So, the steps are:
// 1. Figure out what the state of things will be after we do
// a read from the buffer.
//
// 2. If that resulting state will trigger a _read, then call _read.
// Note that this may be asynchronous, or synchronous. Yes, it is
// deeply ugly to write APIs this way, but that still doesn't mean
// that the Readable class should behave improperly, as streams are
// designed to be sync/async agnostic.
// Take note if the _read call is sync or async (ie, if the read call
// has returned yet), so that we know whether or not it's safe to emit
// 'readable' etc.
//
// 3. Actually pull the requested chunks out of the buffer and return.
// 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 === 0 || state . length - n < state . highWaterMark ) {
doRead = true ;
debug ( 'length less than watermark' , doRead ) ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 ) {
doRead = false ;
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 ;
// 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 ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
var ret ;
if ( n > 0 ) ret = fromList ( n , state ) ; else ret = null ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ret === null ) {
state . needReadable = true ;
n = 0 ;
} else {
state . length -= n ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// If we tried to read() past the EOF, then emit end on the next tick.
if ( nOrig !== n && state . ended ) endReadable ( this ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
if ( ret !== null ) this . emit ( 'data' , ret ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return ret ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function onEofChunk ( stream , state ) {
if ( state . ended ) return ;
if ( state . decoder ) {
var chunk = state . decoder . end ( ) ;
if ( chunk && chunk . length ) {
state . buffer . push ( chunk ) ;
state . length += state . objectMode ? 1 : chunk . length ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
state . ended = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// emit 'readable' now to make sure it gets picked up.
emitReadable ( stream ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow. This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable ( stream ) {
var state = stream . _readableState ;
state . needReadable = false ;
if ( ! state . emittedReadable ) {
debug ( 'emitReadable' , state . flowing ) ;
state . emittedReadable = true ;
2019-01-10 12:43:45 +01:00
if ( state . sync ) pna . nextTick ( emitReadable _ , stream ) ; else emitReadable _ ( stream ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function emitReadable _ ( stream ) {
debug ( 'emit readable' ) ;
stream . emit ( 'readable' ) ;
flow ( stream ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore ( stream , state ) {
if ( ! state . readingMore ) {
state . readingMore = true ;
2019-01-10 12:43:45 +01:00
pna . nextTick ( maybeReadMore _ , stream , state ) ;
2018-02-16 11:16:18 +01:00
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function maybeReadMore _ ( stream , state ) {
var len = state . length ;
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 ;
}
state . readingMore = false ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// abstract method. to be overridden in specific implementation classes.
// 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 ( '_read() is not implemented' ) ) ;
2015-07-14 19:23:35 +02:00
} ;
2018-02-16 11:16:18 +01:00
Readable . prototype . pipe = function ( dest , pipeOpts ) {
var src = this ;
var state = this . _readableState ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
switch ( state . pipesCount ) {
case 0 :
state . pipes = dest ;
2016-11-29 11:09:07 +01:00
break ;
2018-02-16 11:16:18 +01:00
case 1 :
state . pipes = [ state . pipes , dest ] ;
2016-11-29 11:09:07 +01:00
break ;
default :
2018-02-16 11:16:18 +01:00
state . pipes . push ( dest ) ;
break ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
state . pipesCount += 1 ;
debug ( 'pipe count=%d opts=%j' , state . pipesCount , pipeOpts ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var doEnd = ( ! pipeOpts || pipeOpts . end !== false ) && dest !== process . stdout && dest !== process . stderr ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var endFn = doEnd ? onend : unpipe ;
if ( state . endEmitted ) pna . nextTick ( endFn ) ; else src . once ( 'end' , endFn ) ;
2018-02-16 11:16:18 +01:00
dest . on ( 'unpipe' , onunpipe ) ;
2019-01-10 12:43:45 +01:00
function onunpipe ( readable , unpipeInfo ) {
2018-02-16 11:16:18 +01:00
debug ( 'onunpipe' ) ;
if ( readable === src ) {
2019-01-10 12:43:45 +01:00
if ( unpipeInfo && unpipeInfo . hasUnpiped === false ) {
unpipeInfo . hasUnpiped = true ;
cleanup ( ) ;
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function onend ( ) {
debug ( 'onend' ) ;
dest . end ( ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// when the dest drains, it reduces the awaitDrain counter
// on the source. This would be more elegant with a .once()
// handler in flow(), but adding and removing repeatedly is
// too slow.
var ondrain = pipeOnDrain ( src ) ;
dest . on ( 'drain' , ondrain ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var cleanedUp = false ;
function cleanup ( ) {
debug ( 'cleanup' ) ;
// cleanup event handlers once the pipe is broken
dest . removeListener ( 'close' , onclose ) ;
dest . removeListener ( 'finish' , onfinish ) ;
dest . removeListener ( 'drain' , ondrain ) ;
dest . removeListener ( 'error' , onerror ) ;
dest . removeListener ( 'unpipe' , onunpipe ) ;
src . removeListener ( 'end' , onend ) ;
2019-01-10 12:43:45 +01:00
src . removeListener ( 'end' , unpipe ) ;
2018-02-16 11:16:18 +01:00
src . removeListener ( 'data' , ondata ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ( state . awaitDrain && ( ! dest . _writableState || dest . _writableState . needDrain ) ) ondrain ( ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// 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 ( ) ;
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ( EElistenerCount ( dest , 'error' ) === 0 ) dest . emit ( 'error' , er ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// Make sure our error handler is attached before userland ones.
prependListener ( dest , 'error' , onerror ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Both close and finish should trigger unpipe, but only once.
function onclose ( ) {
dest . removeListener ( 'finish' , onfinish ) ;
unpipe ( ) ;
}
dest . once ( 'close' , onclose ) ;
function onfinish ( ) {
debug ( 'onfinish' ) ;
dest . removeListener ( 'close' , onclose ) ;
unpipe ( ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
dest . once ( 'finish' , onfinish ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function unpipe ( ) {
debug ( 'unpipe' ) ;
src . unpipe ( dest ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// tell the dest that it's being piped to
dest . emit ( 'pipe' , src ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// start the flow if it hasn't been started already.
if ( ! state . flowing ) {
debug ( 'pipe resume' ) ;
src . resume ( ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return dest ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function pipeOnDrain ( src ) {
return function ( ) {
var state = src . _readableState ;
debug ( 'pipeOnDrain' , state . awaitDrain ) ;
if ( state . awaitDrain ) state . awaitDrain -- ;
if ( state . awaitDrain === 0 && EElistenerCount ( src , 'data' ) ) {
state . flowing = true ;
flow ( src ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
} ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Readable . prototype . unpipe = function ( dest ) {
var state = this . _readableState ;
2019-01-10 12:43:45 +01:00
var unpipeInfo = { hasUnpiped : false } ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// if we're not piping anywhere, then do nothing.
if ( state . pipesCount === 0 ) return this ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! dest ) dest = state . pipes ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// got a match.
state . pipes = null ;
state . pipesCount = 0 ;
state . flowing = false ;
2019-01-10 12:43:45 +01:00
if ( dest ) dest . emit ( 'unpipe' , this , unpipeInfo ) ;
2018-02-16 11:16:18 +01:00
return this ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// slow case. multiple pipe destinations.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! dest ) {
// remove all.
var dests = state . pipes ;
var len = state . pipesCount ;
state . pipes = null ;
state . pipesCount = 0 ;
state . flowing = false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
for ( var i = 0 ; i < len ; i ++ ) {
2019-01-10 12:43:45 +01:00
dests [ i ] . emit ( 'unpipe' , this , unpipeInfo ) ;
2018-02-16 11:16:18 +01:00
} return this ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// try to find the right one.
var index = indexOf ( state . pipes , dest ) ;
if ( index === - 1 ) return this ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
state . pipes . splice ( index , 1 ) ;
state . pipesCount -= 1 ;
if ( state . pipesCount === 1 ) state . pipes = state . pipes [ 0 ] ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
dest . emit ( 'unpipe' , this , unpipeInfo ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return this ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable . prototype . on = function ( ev , fn ) {
var res = Stream . prototype . on . call ( this , ev , fn ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 . endEmitted && ! state . readableListening ) {
state . readableListening = state . needReadable = true ;
state . emittedReadable = false ;
if ( ! state . reading ) {
2019-01-10 12:43:45 +01:00
pna . nextTick ( nReadingNextTick , this ) ;
2018-02-16 11:16:18 +01:00
} else if ( state . length ) {
2019-01-10 12:43:45 +01:00
emitReadable ( this ) ;
2015-07-14 19:23:35 +02:00
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return res ;
} ;
Readable . prototype . addListener = Readable . prototype . on ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function nReadingNextTick ( self ) {
debug ( 'readable nexttick read 0' ) ;
self . read ( 0 ) ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 ( ) {
var state = this . _readableState ;
if ( ! state . flowing ) {
debug ( 'resume' ) ;
state . flowing = true ;
resume ( this , state ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return this ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function resume ( stream , state ) {
if ( ! state . resumeScheduled ) {
state . resumeScheduled = true ;
2019-01-10 12:43:45 +01:00
pna . nextTick ( resume _ , stream , state ) ;
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function resume _ ( stream , state ) {
if ( ! state . reading ) {
debug ( 'resume read 0' ) ;
stream . read ( 0 ) ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
state . resumeScheduled = false ;
state . awaitDrain = 0 ;
stream . emit ( 'resume' ) ;
flow ( stream ) ;
if ( state . flowing && ! state . reading ) stream . read ( 0 ) ;
}
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' ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return this ;
2016-11-29 11:09:07 +01:00
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function flow ( stream ) {
var state = stream . _readableState ;
debug ( 'flow' , state . flowing ) ;
while ( state . flowing && stream . read ( ) !== null ) { }
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ) {
2019-01-10 12:43:45 +01:00
var _this = this ;
2018-02-16 11:16:18 +01:00
var state = this . _readableState ;
var paused = false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
stream . on ( 'end' , function ( ) {
debug ( 'wrapped end' ) ;
if ( state . decoder && ! state . ended ) {
var chunk = state . decoder . end ( ) ;
2019-01-10 12:43:45 +01:00
if ( chunk && chunk . length ) _this . push ( chunk ) ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
_this . push ( null ) ;
2018-02-16 11:16:18 +01:00
} ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
stream . on ( 'data' , function ( chunk ) {
debug ( 'wrapped data' ) ;
if ( state . decoder ) chunk = state . decoder . write ( chunk ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// don't skip over falsy values in objectMode
if ( state . objectMode && ( chunk === null || chunk === undefined ) ) return ; else if ( ! state . objectMode && ( ! chunk || ! chunk . length ) ) return ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
var ret = _this . push ( chunk ) ;
2018-02-16 11:16:18 +01:00
if ( ! ret ) {
paused = true ;
stream . pause ( ) ;
}
} ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// proxy all the other methods.
// important when wrapping filters and duplexes.
for ( var i in stream ) {
if ( this [ i ] === undefined && typeof stream [ i ] === 'function' ) {
this [ i ] = function ( method ) {
return function ( ) {
return stream [ method ] . apply ( stream , arguments ) ;
} ;
} ( i ) ;
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// proxy certain important events.
2019-01-10 12:43:45 +01:00
for ( var n = 0 ; n < kProxyEvents . length ; n ++ ) {
stream . on ( kProxyEvents [ n ] , this . emit . bind ( this , kProxyEvents [ n ] ) ) ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// when we try to consume some more bytes, simply unpause the
// underlying stream.
2019-01-10 12:43:45 +01:00
this . _read = function ( n ) {
2018-02-16 11:16:18 +01:00
debug ( 'wrapped _read' , n ) ;
if ( paused ) {
paused = false ;
stream . resume ( ) ;
}
} ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
return this ;
2016-11-29 11:09:07 +01:00
} ;
2019-01-10 12:43:45 +01:00
Object . defineProperty ( Readable . prototype , 'readableHighWaterMark' , {
// making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable : false ,
get : function ( ) {
return this . _readableState . highWaterMark ;
}
} ) ;
2018-02-16 11:16:18 +01:00
// exposed for testing purposes only.
Readable . _fromList = fromList ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 ) {
// nothing buffered
if ( state . length === 0 ) return null ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
var ret ;
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 ( ) ;
2016-11-29 11:09:07 +01:00
} else {
2018-02-16 11:16:18 +01:00
// read part of list
ret = fromListPartial ( n , state . buffer , state . decoder ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return ret ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// 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 ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ) {
2019-01-10 12:43:45 +01:00
var ret = Buffer . allocUnsafe ( n ) ;
2018-02-16 11:16:18 +01:00
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 ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function endReadable ( stream ) {
var state = stream . _readableState ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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' ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( ! state . endEmitted ) {
state . ended = true ;
2019-01-10 12:43:45 +01:00
pna . nextTick ( endReadableNT , state , stream ) ;
2018-02-16 11:16:18 +01:00
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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' ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function indexOf ( xs , x ) {
for ( var i = 0 , l = xs . length ; i < l ; i ++ ) {
if ( xs [ i ] === x ) return i ;
}
return - 1 ;
}
2019-01-10 12:43:45 +01:00
} ) . call ( this , require ( '_process' ) , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } )
} , { "./_stream_duplex" : 24 , "./internal/streams/BufferList" : 29 , "./internal/streams/destroy" : 30 , "./internal/streams/stream" : 31 , "_process" : 22 , "core-util-is" : 15 , "events" : 16 , "inherits" : 18 , "isarray" : 20 , "process-nextick-args" : 21 , "safe-buffer" : 37 , "string_decoder/" : 32 , "util" : 13 } ] , 27 : [ 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.
2018-02-16 11:16:18 +01:00
// 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
// some bits pass through, and others are simply ignored. (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation. For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes. When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up. When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer. When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks. If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk. However,
// a pathological inflate type of transform can cause excessive buffering
// here. For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output. In this case, you could write a very small
// amount of input, and end up with a very large amount of output. In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform. A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
'use strict' ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
module . exports = Transform ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var Duplex = require ( './_stream_duplex' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var util = require ( 'core-util-is' ) ;
util . inherits = require ( 'inherits' ) ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
util . inherits ( Transform , Duplex ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
function afterTransform ( er , data ) {
var ts = this . _transformState ;
2018-02-16 11:16:18 +01:00
ts . transforming = false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var cb = ts . writecb ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( ! cb ) {
return this . emit ( 'error' , new Error ( 'write callback called multiple times' ) ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
ts . writechunk = null ;
ts . writecb = null ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( data != null ) // single equals check for both `null` and `undefined`
this . push ( data ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
cb ( er ) ;
2019-01-10 12:43:45 +01:00
var rs = this . _readableState ;
2018-02-16 11:16:18 +01:00
rs . reading = false ;
if ( rs . needReadable || rs . length < rs . highWaterMark ) {
2019-01-10 12:43:45 +01:00
this . _read ( rs . highWaterMark ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function Transform ( options ) {
if ( ! ( this instanceof Transform ) ) return new Transform ( options ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Duplex . call ( this , options ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
this . _transformState = {
afterTransform : afterTransform . bind ( this ) ,
needTransform : false ,
transforming : false ,
writecb : null ,
writechunk : null ,
writeencoding : null
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// start out asking for a readable event once data is transformed.
this . _readableState . needReadable = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// we have implemented the _read method, and done the other things
// that Readable wants before the first _read call, so unset the
// sync guard flag.
this . _readableState . sync = false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( options ) {
if ( typeof options . transform === 'function' ) this . _transform = options . transform ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( typeof options . flush === 'function' ) this . _flush = options . flush ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
// When the writable side finishes, then flush out anything remaining.
2019-01-10 12:43:45 +01:00
this . on ( 'prefinish' , prefinish ) ;
}
function prefinish ( ) {
var _this = this ;
if ( typeof this . _flush === 'function' ) {
this . _flush ( function ( er , data ) {
done ( _this , er , data ) ;
} ) ;
} else {
done ( this , null , null ) ;
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Transform . prototype . push = function ( chunk , encoding ) {
this . _transformState . needTransform = false ;
return Duplex . prototype . push . call ( this , chunk , encoding ) ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side. You may call 'push' zero or more times.
//
// 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 ( '_transform() is not implemented' ) ;
} ;
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 ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ;
// 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 ) {
var ts = this . _transformState ;
if ( ts . writechunk !== null && ts . writecb && ! ts . transforming ) {
ts . transforming = true ;
this . _transform ( ts . writechunk , ts . writeencoding , ts . afterTransform ) ;
} else {
// mark that we need a transform, so that any data that comes in
// will get processed, now that we've asked for it.
ts . needTransform = true ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ;
2019-01-10 12:43:45 +01:00
Transform . prototype . _destroy = function ( err , cb ) {
var _this2 = this ;
Duplex . prototype . _destroy . call ( this , err , function ( err2 ) {
cb ( err2 ) ;
_this2 . emit ( 'close' ) ;
} ) ;
} ;
2018-02-16 11:16:18 +01:00
function done ( stream , er , data ) {
if ( er ) return stream . emit ( 'error' , er ) ;
2019-01-10 12:43:45 +01:00
if ( data != null ) // single equals check for both `null` and `undefined`
stream . push ( data ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// if there's nothing in the write buffer, then that means
// that nothing more will ever be provided
2019-01-10 12:43:45 +01:00
if ( stream . _writableState . length ) throw new Error ( 'Calling transform done when ws.length != 0' ) ;
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
if ( stream . _transformState . transforming ) throw new Error ( 'Calling transform done when still transforming' ) ;
2018-02-16 11:16:18 +01:00
return stream . push ( null ) ;
2016-11-29 11:09:07 +01:00
}
2019-01-10 12:43:45 +01:00
} , { "./_stream_duplex" : 24 , "core-util-is" : 15 , "inherits" : 18 } ] , 28 : [ function ( require , module , exports ) {
( function ( process , global , setImmediate ) {
// 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.
2018-02-16 11:16:18 +01:00
// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
'use strict' ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2019-01-10 12:43:45 +01:00
var pna = require ( 'process-nextick-args' ) ;
2018-02-16 11:16:18 +01:00
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
module . exports = Writable ;
/* <replacement> */
function WriteReq ( chunk , encoding , cb ) {
this . chunk = chunk ;
this . encoding = encoding ;
this . callback = cb ;
this . next = null ;
}
// 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 ( ) {
onCorkedFinish ( _this , state ) ;
} ;
}
/* </replacement> */
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2019-01-10 12:43:45 +01:00
var asyncWrite = ! process . browser && [ 'v0.10' , 'v0.9.' ] . indexOf ( process . version . slice ( 0 , 5 ) ) > - 1 ? setImmediate : pna . nextTick ;
2018-02-16 11:16:18 +01:00
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var Duplex ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Writable . WritableState = WritableState ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var util = require ( 'core-util-is' ) ;
util . inherits = require ( 'inherits' ) ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
var internalUtil = {
deprecate : require ( 'util-deprecate' )
} ;
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2019-01-10 12:43:45 +01:00
var Stream = require ( './internal/streams/stream' ) ;
2018-02-16 11:16:18 +01:00
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var Buffer = require ( 'safe-buffer' ) . Buffer ;
var OurUint8Array = global . Uint8Array || function ( ) { } ;
function _uint8ArrayToBuffer ( chunk ) {
return Buffer . from ( chunk ) ;
}
function _isUint8Array ( obj ) {
return Buffer . isBuffer ( obj ) || obj instanceof OurUint8Array ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
/*</replacement>*/
var destroyImpl = require ( './internal/streams/destroy' ) ;
util . inherits ( Writable , Stream ) ;
function nop ( ) { }
2018-02-16 11:16:18 +01:00
function WritableState ( options , stream ) {
Duplex = Duplex || require ( './_stream_duplex' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
options = options || { } ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Duplex streams are both readable and writable, but share
// the same options object.
// However, some cases require setting options to different
// values for the readable and the writable sides of the duplex stream.
// These options can be provided separately as readableXXX and writableXXX.
var isDuplex = stream instanceof Duplex ;
2018-02-16 11:16:18 +01:00
// object stream flag to indicate whether or not this stream
// contains buffers or objects.
this . objectMode = ! ! options . objectMode ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( isDuplex ) this . objectMode = this . objectMode || ! ! options . writableObjectMode ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ;
2019-01-10 12:43:45 +01:00
var writableHwm = options . writableHighWaterMark ;
2018-02-16 11:16:18 +01:00
var defaultHwm = this . objectMode ? 16 : 16 * 1024 ;
2019-01-10 12:43:45 +01:00
if ( hwm || hwm === 0 ) this . highWaterMark = hwm ; else if ( isDuplex && ( writableHwm || writableHwm === 0 ) ) this . highWaterMark = writableHwm ; else this . highWaterMark = defaultHwm ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// cast to ints.
2019-01-10 12:43:45 +01:00
this . highWaterMark = Math . floor ( this . highWaterMark ) ;
// if _final has been called
this . finalCalled = false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// drain event flag.
this . needDrain = false ;
// at the start of calling end()
this . ending = false ;
// when end() has been called, and returned
this . ended = false ;
// when 'finish' is emitted
this . finished = false ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// has it been destroyed
this . destroyed = false ;
2018-02-16 11:16:18 +01:00
// should we decode strings into buffers before passing to _write?
// this is here so that some node-core streams can optimize string
// handling at a lower level.
var noDecode = options . decodeStrings === false ;
this . decodeStrings = ! noDecode ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this . defaultEncoding = options . defaultEncoding || 'utf8' ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// not an actual buffer we keep track of, but a measurement
// of how much we're waiting to get pushed to some underlying
// socket or file.
this . length = 0 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// a flag to see when we're in the middle of a write.
this . writing = false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// when true all writes will be buffered until .uncork() call
this . corked = 0 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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, because any
// actions that shouldn't happen until "later" should generally also
// not happen before the first write call.
this . sync = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// a flag to know if we're processing previously buffered items, which
// may call the _write() callback in the same tick, so that we don't
// end up in an overlapped onwrite situation.
this . bufferProcessing = false ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// the callback that's passed to _write(chunk,cb)
this . onwrite = function ( er ) {
onwrite ( stream , er ) ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// the callback that the user supplies to write(chunk,encoding,cb)
this . writecb = null ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// the amount that is being written when _write is called.
this . writelen = 0 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
this . bufferedRequest = null ;
this . lastBufferedRequest = null ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// 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 ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return out ;
2016-11-29 11:09:07 +01:00
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
( function ( ) {
try {
Object . defineProperty ( WritableState . prototype , 'buffer' , {
get : internalUtil . deprecate ( function ( ) {
return this . getBuffer ( ) ;
2019-01-10 12:43:45 +01:00
} , '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.' , 'DEP0003' )
2018-02-16 11:16:18 +01:00
} ) ;
} catch ( _ ) { }
} ) ( ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ;
2019-01-10 12:43:45 +01:00
if ( this !== Writable ) return false ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return object && object . _writableState instanceof WritableState ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
} ) ;
} else {
realHasInstance = function ( object ) {
return object instanceof this ;
} ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function Writable ( options ) {
Duplex = Duplex || require ( './_stream_duplex' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Writable ctor is applied to Duplexes, too.
// `realHasInstance` is necessary because using plain `instanceof`
// would return false, as no `_writableState` property is attached.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 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 ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
this . _writableState = new WritableState ( options , this ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// legacy.
this . writable = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( options ) {
if ( typeof options . write === 'function' ) this . _write = options . write ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( typeof options . writev === 'function' ) this . _writev = options . writev ;
2019-01-10 12:43:45 +01:00
if ( typeof options . destroy === 'function' ) this . _destroy = options . destroy ;
if ( typeof options . final === 'function' ) this . _final = options . final ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Stream . call ( this ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Otherwise people can pipe Writable streams, which is just wrong.
Writable . prototype . pipe = function ( ) {
this . emit ( 'error' , new Error ( 'Cannot pipe, not readable' ) ) ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ) ;
2019-01-10 12:43:45 +01:00
pna . nextTick ( cb , er ) ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
// and undefined/non-string values are only allowed in object mode.
2018-02-16 11:16:18 +01:00
function validChunk ( stream , state , chunk , cb ) {
var valid = true ;
var er = false ;
2019-01-10 12:43:45 +01:00
2018-02-16 11:16:18 +01:00
if ( chunk === null ) {
er = new TypeError ( 'May not write null values to stream' ) ;
2019-01-10 12:43:45 +01:00
} else if ( typeof chunk !== 'string' && chunk !== undefined && ! state . objectMode ) {
2018-02-16 11:16:18 +01:00
er = new TypeError ( 'Invalid non-string/buffer chunk' ) ;
}
if ( er ) {
stream . emit ( 'error' , er ) ;
2019-01-10 12:43:45 +01:00
pna . nextTick ( cb , er ) ;
2018-02-16 11:16:18 +01:00
valid = false ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return valid ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
Writable . prototype . write = function ( chunk , encoding , cb ) {
var state = this . _writableState ;
var ret = false ;
2019-01-10 12:43:45 +01:00
var isBuf = ! state . objectMode && _isUint8Array ( chunk ) ;
if ( isBuf && ! Buffer . isBuffer ( chunk ) ) {
chunk = _uint8ArrayToBuffer ( chunk ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( typeof encoding === 'function' ) {
cb = encoding ;
encoding = null ;
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( isBuf ) encoding = 'buffer' ; else if ( ! encoding ) encoding = state . defaultEncoding ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( typeof cb !== 'function' ) cb = nop ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( state . ended ) writeAfterEnd ( this , cb ) ; else if ( isBuf || validChunk ( this , state , chunk , cb ) ) {
2018-02-16 11:16:18 +01:00
state . pendingcb ++ ;
2019-01-10 12:43:45 +01:00
ret = writeOrBuffer ( this , state , isBuf , chunk , encoding , cb ) ;
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return ret ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Writable . prototype . cork = function ( ) {
var state = this . _writableState ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
state . corked ++ ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Writable . prototype . uncork = function ( ) {
var state = this . _writableState ;
if ( state . corked ) {
state . corked -- ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( ! state . writing && ! state . corked && ! state . finished && ! state . bufferProcessing && state . bufferedRequest ) clearBuffer ( this , state ) ;
}
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function decodeChunk ( state , chunk , encoding ) {
if ( ! state . objectMode && state . decodeStrings !== false && typeof chunk === 'string' ) {
2019-01-10 12:43:45 +01:00
chunk = Buffer . from ( chunk , encoding ) ;
2018-02-16 11:16:18 +01:00
}
return chunk ;
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
Object . defineProperty ( Writable . prototype , 'writableHighWaterMark' , {
// making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable : false ,
get : function ( ) {
return this . _writableState . highWaterMark ;
}
} ) ;
2018-02-16 11:16:18 +01:00
// if we're already writing something, then just put this
// in the queue, and wait our turn. Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
2019-01-10 12:43:45 +01:00
function writeOrBuffer ( stream , state , isBuf , chunk , encoding , cb ) {
if ( ! isBuf ) {
var newChunk = decodeChunk ( state , chunk , encoding ) ;
if ( chunk !== newChunk ) {
isBuf = true ;
encoding = 'buffer' ;
chunk = newChunk ;
}
}
2018-02-16 11:16:18 +01:00
var len = state . objectMode ? 1 : chunk . length ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
state . length += len ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var ret = state . length < state . highWaterMark ;
// we must ensure that previous needDrain will not be reset to false.
if ( ! ret ) state . needDrain = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( state . writing || state . corked ) {
var last = state . lastBufferedRequest ;
2019-01-10 12:43:45 +01:00
state . lastBufferedRequest = {
chunk : chunk ,
encoding : encoding ,
isBuf : isBuf ,
callback : cb ,
next : null
} ;
2018-02-16 11:16:18 +01:00
if ( last ) {
last . next = state . lastBufferedRequest ;
} else {
state . bufferedRequest = state . lastBufferedRequest ;
}
state . bufferedRequestCount += 1 ;
} else {
doWrite ( stream , state , false , len , chunk , encoding , cb ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return ret ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function doWrite ( stream , state , writev , len , chunk , encoding , cb ) {
state . writelen = len ;
state . writecb = cb ;
state . writing = true ;
state . sync = true ;
if ( writev ) stream . _writev ( chunk , state . onwrite ) ; else stream . _write ( chunk , encoding , state . onwrite ) ;
state . sync = false ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function onwriteError ( stream , state , sync , er , cb ) {
-- state . pendingcb ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
if ( sync ) {
// defer the callback if we are being called synchronously
// to avoid piling up things on the stack
pna . nextTick ( cb , er ) ;
// this can emit finish, and it will always happen
// after error
pna . nextTick ( finishMaybe , stream , state ) ;
stream . _writableState . errorEmitted = true ;
stream . emit ( 'error' , er ) ;
} else {
// the caller expect this to happen before if
// it is async
cb ( er ) ;
stream . _writableState . errorEmitted = true ;
stream . emit ( 'error' , er ) ;
// this can emit finish, but finish must
// always follow error
finishMaybe ( stream , state ) ;
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function onwriteStateUpdate ( state ) {
state . writing = false ;
state . writecb = null ;
state . length -= state . writelen ;
state . writelen = 0 ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function onwrite ( stream , er ) {
var state = stream . _writableState ;
var sync = state . sync ;
var cb = state . writecb ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
onwriteStateUpdate ( state ) ;
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 ( state ) ;
if ( ! finished && ! state . corked && ! state . bufferProcessing && state . bufferedRequest ) {
clearBuffer ( stream , state ) ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( sync ) {
/*<replacement>*/
asyncWrite ( afterWrite , stream , state , finished , cb ) ;
/*</replacement>*/
} else {
2019-01-10 12:43:45 +01:00
afterWrite ( stream , state , finished , cb ) ;
}
2018-02-16 11:16:18 +01:00
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function afterWrite ( stream , state , finished , cb ) {
if ( ! finished ) onwriteDrain ( stream , state ) ;
state . pendingcb -- ;
cb ( ) ;
finishMaybe ( stream , state ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain ( stream , state ) {
if ( state . length === 0 && state . needDrain ) {
state . needDrain = false ;
stream . emit ( 'drain' ) ;
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// if there's something in the buffer waiting, then process it
function clearBuffer ( stream , state ) {
state . bufferProcessing = true ;
var entry = state . bufferedRequest ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ;
var count = 0 ;
2019-01-10 12:43:45 +01:00
var allBuffers = true ;
2018-02-16 11:16:18 +01:00
while ( entry ) {
buffer [ count ] = entry ;
2019-01-10 12:43:45 +01:00
if ( ! entry . isBuf ) allBuffers = false ;
2018-02-16 11:16:18 +01:00
entry = entry . next ;
count += 1 ;
2016-11-29 11:09:07 +01:00
}
2019-01-10 12:43:45 +01:00
buffer . allBuffers = allBuffers ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ) ;
2016-11-29 11:09:07 +01:00
}
2019-01-10 12:43:45 +01:00
state . bufferedRequestCount = 0 ;
2018-02-16 11:16:18 +01:00
} 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 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
doWrite ( stream , state , false , len , chunk , encoding , cb ) ;
entry = entry . next ;
2019-01-10 12:43:45 +01:00
state . bufferedRequestCount -- ;
2018-02-16 11:16:18 +01:00
// 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 ;
2016-11-29 11:09:07 +01:00
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( entry === null ) state . lastBufferedRequest = null ;
}
state . bufferedRequest = entry ;
state . bufferProcessing = false ;
}
Writable . prototype . _write = function ( chunk , encoding , cb ) {
cb ( new Error ( '_write() is not implemented' ) ) ;
2016-11-29 11:09:07 +01:00
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Writable . prototype . _writev = null ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Writable . prototype . end = function ( chunk , encoding , cb ) {
var state = this . _writableState ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( typeof chunk === 'function' ) {
cb = chunk ;
chunk = null ;
encoding = null ;
} else if ( typeof encoding === 'function' ) {
cb = encoding ;
encoding = null ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( chunk !== null && chunk !== undefined ) this . write ( chunk , encoding ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// .end() fully uncorks
if ( state . corked ) {
state . corked = 1 ;
this . uncork ( ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// ignore unnecessary end() calls.
if ( ! state . ending && ! state . finished ) endWritable ( this , state , cb ) ;
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function needFinish ( state ) {
return state . ending && state . length === 0 && state . bufferedRequest === null && ! state . finished && ! state . writing ;
}
2019-01-10 12:43:45 +01:00
function callFinal ( stream , state ) {
stream . _final ( function ( err ) {
state . pendingcb -- ;
if ( err ) {
stream . emit ( 'error' , err ) ;
}
2018-02-16 11:16:18 +01:00
state . prefinished = true ;
stream . emit ( 'prefinish' ) ;
2019-01-10 12:43:45 +01:00
finishMaybe ( stream , state ) ;
} ) ;
}
function prefinish ( stream , state ) {
if ( ! state . prefinished && ! state . finalCalled ) {
if ( typeof stream . _final === 'function' ) {
state . pendingcb ++ ;
state . finalCalled = true ;
pna . nextTick ( callFinal , stream , state ) ;
} else {
state . prefinished = true ;
stream . emit ( 'prefinish' ) ;
}
2018-02-16 11:16:18 +01:00
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function finishMaybe ( stream , state ) {
var need = needFinish ( state ) ;
if ( need ) {
2019-01-10 12:43:45 +01:00
prefinish ( stream , state ) ;
2018-02-16 11:16:18 +01:00
if ( state . pendingcb === 0 ) {
state . finished = true ;
stream . emit ( 'finish' ) ;
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
return need ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function endWritable ( stream , state , cb ) {
state . ending = true ;
finishMaybe ( stream , state ) ;
if ( cb ) {
2019-01-10 12:43:45 +01:00
if ( state . finished ) pna . nextTick ( cb ) ; else stream . once ( 'finish' , cb ) ;
2018-02-16 11:16:18 +01:00
}
state . ended = true ;
stream . writable = false ;
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
function onCorkedFinish ( corkReq , state , err ) {
var entry = corkReq . entry ;
corkReq . entry = null ;
while ( entry ) {
var cb = entry . callback ;
state . pendingcb -- ;
cb ( err ) ;
entry = entry . next ;
}
if ( state . corkedRequestsFree ) {
state . corkedRequestsFree . next = corkReq ;
} else {
state . corkedRequestsFree = corkReq ;
}
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
Object . defineProperty ( Writable . prototype , 'destroyed' , {
get : function ( ) {
if ( this . _writableState === undefined ) {
return false ;
2016-11-29 11:09:07 +01:00
}
2019-01-10 12:43:45 +01:00
return this . _writableState . destroyed ;
} ,
set : function ( value ) {
// we ignore the value if the stream
// has not been initialized yet
if ( ! this . _writableState ) {
return ;
2016-11-29 11:09:07 +01:00
}
2019-01-10 12:43:45 +01:00
// backward compatibility, the user is explicitly
// managing destroyed
this . _writableState . destroyed = value ;
}
} ) ;
Writable . prototype . destroy = destroyImpl . destroy ;
Writable . prototype . _undestroy = destroyImpl . undestroy ;
Writable . prototype . _destroy = function ( err , cb ) {
this . end ( ) ;
cb ( err ) ;
} ;
} ) . call ( this , require ( '_process' ) , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } , require ( "timers" ) . setImmediate )
} , { "./_stream_duplex" : 24 , "./internal/streams/destroy" : 30 , "./internal/streams/stream" : 31 , "_process" : 22 , "core-util-is" : 15 , "inherits" : 18 , "process-nextick-args" : 21 , "safe-buffer" : 37 , "timers" : 39 , "util-deprecate" : 40 } ] , 29 : [ function ( require , module , exports ) {
'use strict' ;
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
var Buffer = require ( 'safe-buffer' ) . Buffer ;
var util = require ( 'util' ) ;
function copyBuffer ( src , target , offset ) {
src . copy ( target , offset ) ;
}
module . exports = function ( ) {
function BufferList ( ) {
_classCallCheck ( this , BufferList ) ;
this . head = null ;
this . tail = null ;
this . length = 0 ;
}
BufferList . prototype . push = function push ( v ) {
var entry = { data : v , next : null } ;
if ( this . length > 0 ) this . tail . next = entry ; else this . head = entry ;
this . tail = entry ;
++ this . length ;
} ;
BufferList . prototype . unshift = function unshift ( v ) {
var entry = { data : v , next : this . head } ;
if ( this . length === 0 ) this . tail = entry ;
this . head = entry ;
++ this . length ;
} ;
BufferList . prototype . shift = function shift ( ) {
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 ;
} ;
BufferList . prototype . clear = function clear ( ) {
this . head = this . tail = null ;
this . length = 0 ;
} ;
BufferList . prototype . join = function join ( s ) {
if ( this . length === 0 ) return '' ;
var p = this . head ;
var ret = '' + p . data ;
while ( p = p . next ) {
ret += s + p . data ;
} return ret ;
} ;
BufferList . prototype . concat = function concat ( n ) {
if ( this . length === 0 ) return Buffer . alloc ( 0 ) ;
if ( this . length === 1 ) return this . head . data ;
var ret = Buffer . allocUnsafe ( n >>> 0 ) ;
var p = this . head ;
var i = 0 ;
while ( p ) {
copyBuffer ( p . data , ret , i ) ;
i += p . data . length ;
p = p . next ;
}
return ret ;
} ;
return BufferList ;
} ( ) ;
if ( util && util . inspect && util . inspect . custom ) {
module . exports . prototype [ util . inspect . custom ] = function ( ) {
var obj = util . inspect ( { length : this . length } ) ;
return this . constructor . name + ' ' + obj ;
2018-02-16 11:16:18 +01:00
} ;
}
2019-01-10 12:43:45 +01:00
} , { "safe-buffer" : 37 , "util" : 13 } ] , 30 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
'use strict' ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/*<replacement>*/
2019-01-10 12:43:45 +01:00
var pna = require ( 'process-nextick-args' ) ;
2018-02-16 11:16:18 +01:00
/*</replacement>*/
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// undocumented cb() API, needed for core, not for public API
function destroy ( err , cb ) {
var _this = this ;
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
var readableDestroyed = this . _readableState && this . _readableState . destroyed ;
var writableDestroyed = this . _writableState && this . _writableState . destroyed ;
if ( readableDestroyed || writableDestroyed ) {
if ( cb ) {
cb ( err ) ;
} else if ( err && ( ! this . _writableState || ! this . _writableState . errorEmitted ) ) {
pna . nextTick ( emitErrorNT , this , err ) ;
}
return this ;
}
// we set destroyed to true before firing error callbacks in order
// to make it re-entrance safe in case destroy() is called within callbacks
if ( this . _readableState ) {
this . _readableState . destroyed = true ;
}
// if this is a duplex stream mark the writable part as destroyed as well
if ( this . _writableState ) {
this . _writableState . destroyed = true ;
}
this . _destroy ( err || null , function ( err ) {
if ( ! cb && err ) {
pna . nextTick ( emitErrorNT , _this , err ) ;
if ( _this . _writableState ) {
_this . _writableState . errorEmitted = true ;
}
} else if ( cb ) {
cb ( err ) ;
}
} ) ;
return this ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
function undestroy ( ) {
if ( this . _readableState ) {
this . _readableState . destroyed = false ;
this . _readableState . reading = false ;
this . _readableState . ended = false ;
this . _readableState . endEmitted = false ;
}
if ( this . _writableState ) {
this . _writableState . destroyed = false ;
this . _writableState . ended = false ;
this . _writableState . ending = false ;
this . _writableState . finished = false ;
this . _writableState . errorEmitted = false ;
}
}
function emitErrorNT ( self , err ) {
self . emit ( 'error' , err ) ;
}
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
module . exports = {
destroy : destroy ,
undestroy : undestroy
2018-02-16 11:16:18 +01:00
} ;
2019-01-10 12:43:45 +01:00
} , { "process-nextick-args" : 21 } ] , 31 : [ function ( require , module , exports ) {
module . exports = require ( 'events' ) . EventEmitter ;
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
} , { "events" : 16 } ] , 32 : [ 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.
'use strict' ;
/*<replacement>*/
var Buffer = require ( 'safe-buffer' ) . Buffer ;
/*</replacement>*/
var isEncoding = Buffer . isEncoding || function ( encoding ) {
encoding = '' + encoding ;
switch ( encoding && encoding . toLowerCase ( ) ) {
case 'hex' : case 'utf8' : case 'utf-8' : case 'ascii' : case 'binary' : case 'base64' : case 'ucs2' : case 'ucs-2' : case 'utf16le' : case 'utf-16le' : case 'raw' :
return true ;
default :
return false ;
}
2018-02-16 11:16:18 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
function _normalizeEncoding ( enc ) {
if ( ! enc ) return 'utf8' ;
var retried ;
while ( true ) {
switch ( enc ) {
case 'utf8' :
case 'utf-8' :
return 'utf8' ;
case 'ucs2' :
case 'ucs-2' :
case 'utf16le' :
case 'utf-16le' :
return 'utf16le' ;
case 'latin1' :
case 'binary' :
return 'latin1' ;
case 'base64' :
case 'ascii' :
case 'hex' :
return enc ;
default :
if ( retried ) return ; // undefined
enc = ( '' + enc ) . toLowerCase ( ) ;
retried = true ;
}
}
2018-02-16 11:16:18 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Do not cache `Buffer.isEncoding` when checking encoding names as some
// modules monkey-patch it to support additional encodings
function normalizeEncoding ( enc ) {
var nenc = _normalizeEncoding ( enc ) ;
if ( typeof nenc !== 'string' && ( Buffer . isEncoding === isEncoding || ! isEncoding ( enc ) ) ) throw new Error ( 'Unknown encoding: ' + enc ) ;
return nenc || enc ;
}
// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters.
exports . StringDecoder = StringDecoder ;
function StringDecoder ( encoding ) {
this . encoding = normalizeEncoding ( encoding ) ;
var nb ;
switch ( this . encoding ) {
case 'utf16le' :
this . text = utf16Text ;
this . end = utf16End ;
nb = 4 ;
break ;
case 'utf8' :
this . fillLast = utf8FillLast ;
nb = 4 ;
break ;
case 'base64' :
this . text = base64Text ;
this . end = base64End ;
nb = 3 ;
break ;
default :
this . write = simpleWrite ;
this . end = simpleEnd ;
return ;
}
this . lastNeed = 0 ;
this . lastTotal = 0 ;
this . lastChar = Buffer . allocUnsafe ( nb ) ;
}
StringDecoder . prototype . write = function ( buf ) {
if ( buf . length === 0 ) return '' ;
var r ;
var i ;
if ( this . lastNeed ) {
r = this . fillLast ( buf ) ;
if ( r === undefined ) return '' ;
i = this . lastNeed ;
this . lastNeed = 0 ;
} else {
i = 0 ;
}
if ( i < buf . length ) return r ? r + this . text ( buf , i ) : this . text ( buf , i ) ;
return r || '' ;
2018-02-16 11:16:18 +01:00
} ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
StringDecoder . prototype . end = utf8End ;
// Returns only complete characters in a Buffer
StringDecoder . prototype . text = utf8Text ;
// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
StringDecoder . prototype . fillLast = function ( buf ) {
if ( this . lastNeed <= buf . length ) {
buf . copy ( this . lastChar , this . lastTotal - this . lastNeed , 0 , this . lastNeed ) ;
return this . lastChar . toString ( this . encoding , 0 , this . lastTotal ) ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
buf . copy ( this . lastChar , this . lastTotal - this . lastNeed , 0 , buf . length ) ;
this . lastNeed -= buf . length ;
2018-02-16 11:16:18 +01:00
} ;
2016-11-29 11:09:07 +01:00
2019-01-10 12:43:45 +01:00
// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
// continuation byte. If an invalid byte is detected, -2 is returned.
function utf8CheckByte ( byte ) {
if ( byte <= 0x7F ) return 0 ; else if ( byte >> 5 === 0x06 ) return 2 ; else if ( byte >> 4 === 0x0E ) return 3 ; else if ( byte >> 3 === 0x1E ) return 4 ;
return byte >> 6 === 0x02 ? - 1 : - 2 ;
}
// Checks at most 3 bytes at the end of a Buffer in order to detect an
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
// needed to complete the UTF-8 character (if applicable) are returned.
function utf8CheckIncomplete ( self , buf , i ) {
var j = buf . length - 1 ;
if ( j < i ) return 0 ;
var nb = utf8CheckByte ( buf [ j ] ) ;
if ( nb >= 0 ) {
if ( nb > 0 ) self . lastNeed = nb - 1 ;
return nb ;
}
if ( -- j < i || nb === - 2 ) return 0 ;
nb = utf8CheckByte ( buf [ j ] ) ;
if ( nb >= 0 ) {
if ( nb > 0 ) self . lastNeed = nb - 2 ;
return nb ;
}
if ( -- j < i || nb === - 2 ) return 0 ;
nb = utf8CheckByte ( buf [ j ] ) ;
if ( nb >= 0 ) {
if ( nb > 0 ) {
if ( nb === 2 ) nb = 0 ; else self . lastNeed = nb - 3 ;
}
return nb ;
}
return 0 ;
}
// Validates as many continuation bytes for a multi-byte UTF-8 character as
// needed or are available. If we see a non-continuation byte where we expect
// one, we "replace" the validated continuation bytes we've seen so far with
// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
// behavior. The continuation byte check is included three times in the case
// where all of the continuation bytes for a character exist in the same buffer.
// It is also done this way as a slight performance increase instead of using a
// loop.
function utf8CheckExtraBytes ( self , buf , p ) {
if ( ( buf [ 0 ] & 0xC0 ) !== 0x80 ) {
self . lastNeed = 0 ;
return '\ufffd' ;
}
if ( self . lastNeed > 1 && buf . length > 1 ) {
if ( ( buf [ 1 ] & 0xC0 ) !== 0x80 ) {
self . lastNeed = 1 ;
return '\ufffd' ;
}
if ( self . lastNeed > 2 && buf . length > 2 ) {
if ( ( buf [ 2 ] & 0xC0 ) !== 0x80 ) {
self . lastNeed = 2 ;
return '\ufffd' ;
}
}
}
}
// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
function utf8FillLast ( buf ) {
var p = this . lastTotal - this . lastNeed ;
var r = utf8CheckExtraBytes ( this , buf , p ) ;
if ( r !== undefined ) return r ;
if ( this . lastNeed <= buf . length ) {
buf . copy ( this . lastChar , p , 0 , this . lastNeed ) ;
return this . lastChar . toString ( this . encoding , 0 , this . lastTotal ) ;
}
buf . copy ( this . lastChar , p , 0 , buf . length ) ;
this . lastNeed -= buf . length ;
}
// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
// partial character, the character's bytes are buffered until the required
// number of bytes are available.
function utf8Text ( buf , i ) {
var total = utf8CheckIncomplete ( this , buf , i ) ;
if ( ! this . lastNeed ) return buf . toString ( 'utf8' , i ) ;
this . lastTotal = total ;
var end = buf . length - ( total - this . lastNeed ) ;
buf . copy ( this . lastChar , 0 , end ) ;
return buf . toString ( 'utf8' , i , end ) ;
}
// For UTF-8, a replacement character is added when ending on a partial
// character.
function utf8End ( buf ) {
var r = buf && buf . length ? this . write ( buf ) : '' ;
if ( this . lastNeed ) return r + '\ufffd' ;
return r ;
}
// UTF-16LE typically needs two bytes per character, but even if we have an even
// number of bytes available, we need to check if we end on a leading/high
// surrogate. In that case, we need to wait for the next two bytes in order to
// decode the last character properly.
function utf16Text ( buf , i ) {
if ( ( buf . length - i ) % 2 === 0 ) {
var r = buf . toString ( 'utf16le' , i ) ;
if ( r ) {
var c = r . charCodeAt ( r . length - 1 ) ;
if ( c >= 0xD800 && c <= 0xDBFF ) {
this . lastNeed = 2 ;
this . lastTotal = 4 ;
this . lastChar [ 0 ] = buf [ buf . length - 2 ] ;
this . lastChar [ 1 ] = buf [ buf . length - 1 ] ;
return r . slice ( 0 , - 1 ) ;
}
}
return r ;
}
this . lastNeed = 1 ;
this . lastTotal = 2 ;
this . lastChar [ 0 ] = buf [ buf . length - 1 ] ;
return buf . toString ( 'utf16le' , i , buf . length - 1 ) ;
}
// For UTF-16LE we do not explicitly append special replacement characters if we
// end on a partial character, we simply let v8 handle that.
function utf16End ( buf ) {
var r = buf && buf . length ? this . write ( buf ) : '' ;
if ( this . lastNeed ) {
var end = this . lastTotal - this . lastNeed ;
return r + this . lastChar . toString ( 'utf16le' , 0 , end ) ;
}
return r ;
}
function base64Text ( buf , i ) {
var n = ( buf . length - i ) % 3 ;
if ( n === 0 ) return buf . toString ( 'base64' , i ) ;
this . lastNeed = 3 - n ;
this . lastTotal = 3 ;
if ( n === 1 ) {
this . lastChar [ 0 ] = buf [ buf . length - 1 ] ;
} else {
this . lastChar [ 0 ] = buf [ buf . length - 2 ] ;
this . lastChar [ 1 ] = buf [ buf . length - 1 ] ;
}
return buf . toString ( 'base64' , i , buf . length - n ) ;
}
function base64End ( buf ) {
var r = buf && buf . length ? this . write ( buf ) : '' ;
if ( this . lastNeed ) return r + this . lastChar . toString ( 'base64' , 0 , 3 - this . lastNeed ) ;
return r ;
}
// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
function simpleWrite ( buf ) {
return buf . toString ( this . encoding ) ;
}
function simpleEnd ( buf ) {
return buf && buf . length ? this . write ( buf ) : '' ;
}
} , { "safe-buffer" : 37 } ] , 33 : [ function ( require , module , exports ) {
module . exports = require ( './readable' ) . PassThrough
} , { "./readable" : 34 } ] , 34 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
exports = module . exports = require ( './lib/_stream_readable.js' ) ;
2019-01-10 12:43:45 +01:00
exports . Stream = exports ;
2018-02-16 11:16:18 +01:00
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' ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "./lib/_stream_duplex.js" : 24 , "./lib/_stream_passthrough.js" : 25 , "./lib/_stream_readable.js" : 26 , "./lib/_stream_transform.js" : 27 , "./lib/_stream_writable.js" : 28 } ] , 35 : [ function ( require , module , exports ) {
module . exports = require ( './readable' ) . Transform
} , { "./readable" : 34 } ] , 36 : [ function ( require , module , exports ) {
module . exports = require ( './lib/_stream_writable.js' ) ;
} , { "./lib/_stream_writable.js" : 28 } ] , 37 : [ function ( require , module , exports ) {
/* eslint-disable node/no-deprecated-api */
var buffer = require ( 'buffer' )
var Buffer = buffer . Buffer
// alternative to using Object.keys for old browsers
function copyProps ( src , dst ) {
for ( var key in src ) {
dst [ key ] = src [ key ]
}
}
if ( Buffer . from && Buffer . alloc && Buffer . allocUnsafe && Buffer . allocUnsafeSlow ) {
module . exports = buffer
} else {
// Copy properties from require('buffer')
copyProps ( buffer , exports )
exports . Buffer = SafeBuffer
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
function SafeBuffer ( arg , encodingOrOffset , length ) {
return Buffer ( arg , encodingOrOffset , length )
}
// Copy static methods from Buffer
copyProps ( Buffer , SafeBuffer )
SafeBuffer . from = function ( arg , encodingOrOffset , length ) {
if ( typeof arg === 'number' ) {
throw new TypeError ( 'Argument must not be a number' )
}
return Buffer ( arg , encodingOrOffset , length )
}
SafeBuffer . alloc = function ( size , fill , encoding ) {
if ( typeof size !== 'number' ) {
throw new TypeError ( 'Argument must be a number' )
}
var buf = Buffer ( size )
if ( fill !== undefined ) {
if ( typeof encoding === 'string' ) {
buf . fill ( fill , encoding )
} else {
buf . fill ( fill )
}
} else {
buf . fill ( 0 )
}
return buf
}
SafeBuffer . allocUnsafe = function ( size ) {
if ( typeof size !== 'number' ) {
throw new TypeError ( 'Argument must be a number' )
}
return Buffer ( size )
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
SafeBuffer . allocUnsafeSlow = function ( size ) {
if ( typeof size !== 'number' ) {
throw new TypeError ( 'Argument must be a number' )
}
return buffer . SlowBuffer ( size )
}
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "buffer" : 14 } ] , 38 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
// 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.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
module . exports = Stream ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var EE = require ( 'events' ) . EventEmitter ;
var inherits = require ( 'inherits' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
inherits ( Stream , EE ) ;
Stream . Readable = require ( 'readable-stream/readable.js' ) ;
Stream . Writable = require ( 'readable-stream/writable.js' ) ;
Stream . Duplex = require ( 'readable-stream/duplex.js' ) ;
Stream . Transform = require ( 'readable-stream/transform.js' ) ;
Stream . PassThrough = require ( 'readable-stream/passthrough.js' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Backwards-compat with node 0.4.x
Stream . Stream = Stream ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// old-style streams. Note that the pipe method (the only relevant
// part of this class) is overridden in the Readable class.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function Stream ( ) {
EE . call ( this ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
Stream . prototype . pipe = function ( dest , options ) {
var source = this ;
function ondata ( chunk ) {
if ( dest . writable ) {
if ( false === dest . write ( chunk ) && source . pause ) {
source . pause ( ) ;
}
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
source . on ( 'data' , ondata ) ;
function ondrain ( ) {
if ( source . readable && source . resume ) {
source . resume ( ) ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
dest . on ( 'drain' , ondrain ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// If the 'end' option is not supplied, dest.end() will be called when
// source gets the 'end' or 'close' events. Only dest.end() once.
if ( ! dest . _isStdio && ( ! options || options . end !== false ) ) {
source . on ( 'end' , onend ) ;
source . on ( 'close' , onclose ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var didOnEnd = false ;
function onend ( ) {
if ( didOnEnd ) return ;
didOnEnd = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
dest . end ( ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function onclose ( ) {
if ( didOnEnd ) return ;
didOnEnd = true ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( typeof dest . destroy === 'function' ) dest . destroy ( ) ;
}
// don't leave dangling pipes when there are errors.
function onerror ( er ) {
cleanup ( ) ;
if ( EE . listenerCount ( this , 'error' ) === 0 ) {
throw er ; // Unhandled stream error in pipe.
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
source . on ( 'error' , onerror ) ;
dest . on ( 'error' , onerror ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// remove all the event listeners that were added.
function cleanup ( ) {
source . removeListener ( 'data' , ondata ) ;
dest . removeListener ( 'drain' , ondrain ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
source . removeListener ( 'end' , onend ) ;
source . removeListener ( 'close' , onclose ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
source . removeListener ( 'error' , onerror ) ;
dest . removeListener ( 'error' , onerror ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
source . removeListener ( 'end' , cleanup ) ;
source . removeListener ( 'close' , cleanup ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
dest . removeListener ( 'close' , cleanup ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
source . on ( 'end' , cleanup ) ;
source . on ( 'close' , cleanup ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
dest . on ( 'close' , cleanup ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
dest . emit ( 'pipe' , source ) ;
// Allow for unix-like usage: A.pipe(B).pipe(C)
return dest ;
2016-11-29 11:09:07 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
} , { "events" : 16 , "inherits" : 18 , "readable-stream/duplex.js" : 23 , "readable-stream/passthrough.js" : 33 , "readable-stream/readable.js" : 34 , "readable-stream/transform.js" : 35 , "readable-stream/writable.js" : 36 } ] , 39 : [ function ( require , module , exports ) {
( function ( setImmediate , clearImmediate ) {
var nextTick = require ( 'process/browser.js' ) . nextTick ;
var apply = Function . prototype . apply ;
var slice = Array . prototype . slice ;
var immediateIds = { } ;
var nextImmediateId = 0 ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// DOM APIs, for completeness
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
exports . setTimeout = function ( ) {
return new Timeout ( apply . call ( setTimeout , window , arguments ) , clearTimeout ) ;
} ;
exports . setInterval = function ( ) {
return new Timeout ( apply . call ( setInterval , window , arguments ) , clearInterval ) ;
} ;
exports . clearTimeout =
exports . clearInterval = function ( timeout ) { timeout . close ( ) ; } ;
2018-02-16 11:16:18 +01:00
2019-01-10 12:43:45 +01:00
function Timeout ( id , clearFn ) {
this . _id = id ;
this . _clearFn = clearFn ;
2018-02-16 11:16:18 +01:00
}
2019-01-10 12:43:45 +01:00
Timeout . prototype . unref = Timeout . prototype . ref = function ( ) { } ;
Timeout . prototype . close = function ( ) {
this . _clearFn . call ( window , this . _id ) ;
2018-02-16 11:16:18 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// Does not start the time, just sets up the members needed.
exports . enroll = function ( item , msecs ) {
clearTimeout ( item . _idleTimeoutId ) ;
item . _idleTimeout = msecs ;
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
exports . unenroll = function ( item ) {
clearTimeout ( item . _idleTimeoutId ) ;
item . _idleTimeout = - 1 ;
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
exports . _unrefActive = exports . active = function ( item ) {
clearTimeout ( item . _idleTimeoutId ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
var msecs = item . _idleTimeout ;
if ( msecs >= 0 ) {
item . _idleTimeoutId = setTimeout ( function onTimeout ( ) {
if ( item . _onTimeout )
item . _onTimeout ( ) ;
} , msecs ) ;
2018-02-16 11:16:18 +01:00
}
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
// That's not how node.js implements it but the exposed api is the same.
exports . setImmediate = typeof setImmediate === "function" ? setImmediate : function ( fn ) {
var id = nextImmediateId ++ ;
var args = arguments . length < 2 ? false : slice . call ( arguments , 1 ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
immediateIds [ id ] = true ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
nextTick ( function onNextTick ( ) {
if ( immediateIds [ id ] ) {
// fn.call() is faster so we optimize for the common use-case
// @see http://jsperf.com/call-apply-segu
if ( args ) {
fn . apply ( null , args ) ;
} else {
fn . call ( null ) ;
}
// Prevent ids from leaking
exports . clearImmediate ( id ) ;
2015-07-14 19:23:35 +02:00
}
2019-01-10 12:43:45 +01:00
} ) ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
return id ;
2018-02-16 11:16:18 +01:00
} ;
2015-07-14 19:23:35 +02:00
2019-01-10 12:43:45 +01:00
exports . clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function ( id ) {
delete immediateIds [ id ] ;
2018-02-16 11:16:18 +01:00
} ;
2019-01-10 12:43:45 +01:00
} ) . call ( this , require ( "timers" ) . setImmediate , require ( "timers" ) . clearImmediate )
} , { "process/browser.js" : 22 , "timers" : 39 } ] , 40 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
( function ( global ) {
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ * *
* Module exports .
* /
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
module . exports = deprecate ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ * *
* 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
* /
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function deprecate ( fn , msg ) {
if ( config ( 'noDeprecation' ) ) {
return fn ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return deprecated ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ * *
* Checks ` localStorage ` for boolean values for the given ` name ` .
*
* @ param { String } name
* @ returns { Boolean }
* @ api private
* /
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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' ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
} ) . call ( this , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } )
2019-01-10 12:43:45 +01:00
} , { } ] , 41 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
module . exports = function isBuffer ( arg ) {
return arg && typeof arg === 'object'
&& typeof arg . copy === 'function'
&& typeof arg . fill === 'function'
&& typeof arg . readUInt8 === 'function' ;
}
2019-01-10 12:43:45 +01:00
} , { } ] , 42 : [ function ( require , module , exports ) {
2018-02-16 11:16:18 +01:00
( function ( process , global ) {
// 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.
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var formatRegExp = /%[sdj%]/g ;
exports . format = function ( f ) {
if ( ! isString ( f ) ) {
var objects = [ ] ;
for ( var i = 0 ; i < arguments . length ; i ++ ) {
objects . push ( inspect ( arguments [ i ] ) ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return objects . join ( ' ' ) ;
}
var i = 1 ;
var args = arguments ;
var len = args . length ;
var str = String ( f ) . replace ( formatRegExp , function ( x ) {
if ( x === '%%' ) return '%' ;
if ( i >= len ) return x ;
switch ( x ) {
case '%s' : return String ( args [ i ++ ] ) ;
case '%d' : return Number ( args [ i ++ ] ) ;
case '%j' :
try {
return JSON . stringify ( args [ i ++ ] ) ;
} catch ( _ ) {
return '[Circular]' ;
}
default :
return x ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
} ) ;
for ( var x = args [ i ] ; i < len ; x = args [ ++ i ] ) {
if ( isNull ( x ) || ! isObject ( x ) ) {
str += ' ' + x ;
} else {
str += ' ' + inspect ( x ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
}
return str ;
} ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Mark that a method should not be used.
// Returns a modified function which warns once by default.
// If --no-deprecation is set, then it is a no-op.
exports . deprecate = function ( fn , msg ) {
// Allow for deprecating things in the process of starting up.
if ( isUndefined ( global . process ) ) {
return function ( ) {
return exports . deprecate ( fn , msg ) . apply ( this , arguments ) ;
} ;
}
if ( process . noDeprecation === true ) {
return fn ;
}
var warned = false ;
function deprecated ( ) {
if ( ! warned ) {
if ( process . throwDeprecation ) {
throw new Error ( msg ) ;
} else if ( process . traceDeprecation ) {
console . trace ( msg ) ;
} else {
console . error ( msg ) ;
}
warned = true ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
return fn . apply ( this , arguments ) ;
}
return deprecated ;
} ;
var debugs = { } ;
var debugEnviron ;
exports . debuglog = function ( set ) {
if ( isUndefined ( debugEnviron ) )
debugEnviron = process . env . NODE _DEBUG || '' ;
set = set . toUpperCase ( ) ;
if ( ! debugs [ set ] ) {
if ( new RegExp ( '\\b' + set + '\\b' , 'i' ) . test ( debugEnviron ) ) {
var pid = process . pid ;
debugs [ set ] = function ( ) {
var msg = exports . format . apply ( exports , arguments ) ;
console . error ( '%s %d: %s' , set , pid , msg ) ;
} ;
} else {
debugs [ set ] = function ( ) { } ;
2016-11-29 11:09:07 +01:00
}
2018-02-16 11:16:18 +01:00
}
return debugs [ set ] ;
2016-11-29 11:09:07 +01:00
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
/ * *
* Echos the value of a value . Trys to print the value out
* in the best way possible given the different types .
*
* @ param { Object } obj The object to print out .
* @ param { Object } opts Optional options object that alters the output .
* /
/* legacy: obj, showHidden, depth, colors*/
function inspect ( obj , opts ) {
// default options
var ctx = {
seen : [ ] ,
stylize : stylizeNoColor
} ;
// legacy...
if ( arguments . length >= 3 ) ctx . depth = arguments [ 2 ] ;
if ( arguments . length >= 4 ) ctx . colors = arguments [ 3 ] ;
if ( isBoolean ( opts ) ) {
// legacy...
ctx . showHidden = opts ;
} else if ( opts ) {
// got an "options" object
exports . _extend ( ctx , opts ) ;
}
// set default options
if ( isUndefined ( ctx . showHidden ) ) ctx . showHidden = false ;
if ( isUndefined ( ctx . depth ) ) ctx . depth = 2 ;
if ( isUndefined ( ctx . colors ) ) ctx . colors = false ;
if ( isUndefined ( ctx . customInspect ) ) ctx . customInspect = true ;
if ( ctx . colors ) ctx . stylize = stylizeWithColor ;
return formatValue ( ctx , obj , ctx . depth ) ;
}
exports . inspect = inspect ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
inspect . colors = {
'bold' : [ 1 , 22 ] ,
'italic' : [ 3 , 23 ] ,
'underline' : [ 4 , 24 ] ,
'inverse' : [ 7 , 27 ] ,
'white' : [ 37 , 39 ] ,
'grey' : [ 90 , 39 ] ,
'black' : [ 30 , 39 ] ,
'blue' : [ 34 , 39 ] ,
'cyan' : [ 36 , 39 ] ,
'green' : [ 32 , 39 ] ,
'magenta' : [ 35 , 39 ] ,
'red' : [ 31 , 39 ] ,
'yellow' : [ 33 , 39 ]
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Don't use 'blue' not visible on cmd.exe
inspect . styles = {
'special' : 'cyan' ,
'number' : 'yellow' ,
'boolean' : 'yellow' ,
'undefined' : 'grey' ,
'null' : 'bold' ,
'string' : 'green' ,
'date' : 'magenta' ,
// "name": intentionally not styling
'regexp' : 'red'
} ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function stylizeWithColor ( str , styleType ) {
var style = inspect . styles [ styleType ] ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( style ) {
return '\u001b[' + inspect . colors [ style ] [ 0 ] + 'm' + str +
'\u001b[' + inspect . colors [ style ] [ 1 ] + 'm' ;
} else {
return str ;
}
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function stylizeNoColor ( str , styleType ) {
return str ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function arrayToHash ( array ) {
var hash = { } ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
array . forEach ( function ( val , idx ) {
hash [ val ] = true ;
} ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
return hash ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function formatValue ( ctx , value , recurseTimes ) {
// Provide a hook for user-specified inspect functions.
// Check that value is an object with an inspect function on it
if ( ctx . customInspect &&
value &&
isFunction ( value . inspect ) &&
// Filter out the util module, it's inspect function is special
value . inspect !== exports . inspect &&
// Also filter out any prototype objects using the circular check.
! ( value . constructor && value . constructor . prototype === value ) ) {
var ret = value . inspect ( recurseTimes , ctx ) ;
if ( ! isString ( ret ) ) {
ret = formatValue ( ctx , ret , recurseTimes ) ;
}
return ret ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Primitive types cannot have properties
var primitive = formatPrimitive ( ctx , value ) ;
if ( primitive ) {
return primitive ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Look up the keys of the object.
var keys = Object . keys ( value ) ;
var visibleKeys = arrayToHash ( keys ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( ctx . showHidden ) {
keys = Object . getOwnPropertyNames ( value ) ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// IE doesn't make error fields non-enumerable
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
if ( isError ( value )
&& ( keys . indexOf ( 'message' ) >= 0 || keys . indexOf ( 'description' ) >= 0 ) ) {
return formatError ( value ) ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
// Some type of object without properties can be shortcutted.
if ( keys . length === 0 ) {
if ( isFunction ( value ) ) {
var name = value . name ? ': ' + value . name : '' ;
return ctx . stylize ( '[Function' + name + ']' , 'special' ) ;
}
if ( isRegExp ( value ) ) {
return ctx . stylize ( RegExp . prototype . toString . call ( value ) , 'regexp' ) ;
}
if ( isDate ( value ) ) {
return ctx . stylize ( Date . prototype . toString . call ( value ) , 'date' ) ;
}
if ( isError ( value ) ) {
return formatError ( value ) ;
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var base = '' , array = false , braces = [ '{' , '}' ] ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Make Array say that they are Array
if ( isArray ( value ) ) {
array = true ;
braces = [ '[' , ']' ] ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Make functions say that they are functions
if ( isFunction ( value ) ) {
var n = value . name ? ': ' + value . name : '' ;
base = ' [Function' + n + ']' ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Make RegExps say that they are RegExps
if ( isRegExp ( value ) ) {
base = ' ' + RegExp . prototype . toString . call ( value ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Make dates with properties first say the date
if ( isDate ( value ) ) {
base = ' ' + Date . prototype . toUTCString . call ( value ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// Make error with message first say the error
if ( isError ( value ) ) {
base = ' ' + formatError ( value ) ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
if ( keys . length === 0 && ( ! array || value . length == 0 ) ) {
return braces [ 0 ] + base + braces [ 1 ] ;
}
if ( recurseTimes < 0 ) {
if ( isRegExp ( value ) ) {
return ctx . stylize ( RegExp . prototype . toString . call ( value ) , 'regexp' ) ;
} else {
return ctx . stylize ( '[Object]' , 'special' ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
}
ctx . seen . push ( value ) ;
var output ;
if ( array ) {
output = formatArray ( ctx , value , recurseTimes , visibleKeys , keys ) ;
} else {
output = keys . map ( function ( key ) {
return formatProperty ( ctx , value , recurseTimes , visibleKeys , key , array ) ;
} ) ;
}
ctx . seen . pop ( ) ;
return reduceToSingleString ( output , base , braces ) ;
}
2015-07-14 19:23:35 +02:00
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function formatPrimitive ( ctx , value ) {
if ( isUndefined ( value ) )
return ctx . stylize ( 'undefined' , 'undefined' ) ;
if ( isString ( value ) ) {
var simple = '\'' + JSON . stringify ( value ) . replace ( /^"|"$/g , '' )
. replace ( /'/g , "\\'" )
. replace ( /\\"/g , '"' ) + '\'' ;
return ctx . stylize ( simple , 'string' ) ;
}
if ( isNumber ( value ) )
return ctx . stylize ( '' + value , 'number' ) ;
if ( isBoolean ( value ) )
return ctx . stylize ( '' + value , 'boolean' ) ;
// For some reason typeof null is "object", so special case here.
if ( isNull ( value ) )
return ctx . stylize ( 'null' , 'null' ) ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
function formatError ( value ) {
return '[' + Error . prototype . toString . call ( value ) + ']' ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function formatArray ( ctx , value , recurseTimes , visibleKeys , keys ) {
var output = [ ] ;
for ( var i = 0 , l = value . length ; i < l ; ++ i ) {
if ( hasOwnProperty ( value , String ( i ) ) ) {
output . push ( formatProperty ( ctx , value , recurseTimes , visibleKeys ,
String ( i ) , true ) ) ;
} else {
output . push ( '' ) ;
}
}
keys . forEach ( function ( key ) {
if ( ! key . match ( /^\d+$/ ) ) {
output . push ( formatProperty ( ctx , value , recurseTimes , visibleKeys ,
key , true ) ) ;
}
} ) ;
return output ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function formatProperty ( ctx , value , recurseTimes , visibleKeys , key , array ) {
var name , str , desc ;
desc = Object . getOwnPropertyDescriptor ( value , key ) || { value : value [ key ] } ;
if ( desc . get ) {
if ( desc . set ) {
str = ctx . stylize ( '[Getter/Setter]' , 'special' ) ;
} else {
str = ctx . stylize ( '[Getter]' , 'special' ) ;
}
} else {
if ( desc . set ) {
str = ctx . stylize ( '[Setter]' , 'special' ) ;
}
}
if ( ! hasOwnProperty ( visibleKeys , key ) ) {
name = '[' + key + ']' ;
}
if ( ! str ) {
if ( ctx . seen . indexOf ( desc . value ) < 0 ) {
if ( isNull ( recurseTimes ) ) {
str = formatValue ( ctx , desc . value , null ) ;
} else {
str = formatValue ( ctx , desc . value , recurseTimes - 1 ) ;
}
if ( str . indexOf ( '\n' ) > - 1 ) {
if ( array ) {
str = str . split ( '\n' ) . map ( function ( line ) {
return ' ' + line ;
} ) . join ( '\n' ) . substr ( 2 ) ;
} else {
str = '\n' + str . split ( '\n' ) . map ( function ( line ) {
return ' ' + line ;
} ) . join ( '\n' ) ;
}
}
} else {
str = ctx . stylize ( '[Circular]' , 'special' ) ;
}
}
if ( isUndefined ( name ) ) {
if ( array && key . match ( /^\d+$/ ) ) {
return str ;
}
name = JSON . stringify ( '' + key ) ;
if ( name . match ( /^"([a-zA-Z_][a-zA-Z_0-9]*)"$/ ) ) {
name = name . substr ( 1 , name . length - 2 ) ;
name = ctx . stylize ( name , 'name' ) ;
} else {
name = name . replace ( /'/g , "\\'" )
. replace ( /\\"/g , '"' )
. replace ( /(^"|"$)/g , "'" ) ;
name = ctx . stylize ( name , 'string' ) ;
}
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return name + ': ' + str ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function reduceToSingleString ( output , base , braces ) {
var numLinesEst = 0 ;
var length = output . reduce ( function ( prev , cur ) {
numLinesEst ++ ;
if ( cur . indexOf ( '\n' ) >= 0 ) numLinesEst ++ ;
return prev + cur . replace ( /\u001b\[\d\d?m/g , '' ) . length + 1 ;
} , 0 ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
if ( length > 60 ) {
return braces [ 0 ] +
( base === '' ? '' : base + '\n ' ) +
' ' +
output . join ( ',\n ' ) +
' ' +
braces [ 1 ] ;
2016-11-29 11:09:07 +01:00
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
return braces [ 0 ] + base + ' ' + output . join ( ', ' ) + ' ' + braces [ 1 ] ;
2015-07-14 19:23:35 +02:00
}
2018-02-16 11:16:18 +01:00
// 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 ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function isBoolean ( arg ) {
return typeof arg === 'boolean' ;
}
exports . isBoolean = isBoolean ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isNull ( arg ) {
return arg === null ;
}
exports . isNull = isNull ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isNullOrUndefined ( arg ) {
return arg == null ;
}
exports . isNullOrUndefined = isNullOrUndefined ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isNumber ( arg ) {
return typeof arg === 'number' ;
}
exports . isNumber = isNumber ;
function isString ( arg ) {
return typeof arg === 'string' ;
}
exports . isString = isString ;
function isSymbol ( arg ) {
return typeof arg === 'symbol' ;
}
exports . isSymbol = isSymbol ;
function isUndefined ( arg ) {
return arg === void 0 ;
}
exports . isUndefined = isUndefined ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isRegExp ( re ) {
return isObject ( re ) && objectToString ( re ) === '[object RegExp]' ;
}
exports . isRegExp = isRegExp ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isObject ( arg ) {
return typeof arg === 'object' && arg !== null ;
}
exports . isObject = isObject ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isDate ( d ) {
return isObject ( d ) && objectToString ( d ) === '[object Date]' ;
}
exports . isDate = isDate ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isError ( e ) {
return isObject ( e ) &&
( objectToString ( e ) === '[object Error]' || e instanceof Error ) ;
}
exports . isError = isError ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function isFunction ( arg ) {
return typeof arg === 'function' ;
}
exports . isFunction = isFunction ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
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 ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
exports . isBuffer = require ( './support/isBuffer' ) ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
function objectToString ( o ) {
return Object . prototype . toString . call ( o ) ;
}
2015-07-14 19:23:35 +02:00
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
function pad ( n ) {
return n < 10 ? '0' + n . toString ( 10 ) : n . toString ( 10 ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
var months = [ 'Jan' , 'Feb' , 'Mar' , 'Apr' , 'May' , 'Jun' , 'Jul' , 'Aug' , 'Sep' ,
'Oct' , 'Nov' , 'Dec' ] ;
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// 26 Feb 16:19:34
function timestamp ( ) {
var d = new Date ( ) ;
var time = [ pad ( d . getHours ( ) ) ,
pad ( d . getMinutes ( ) ) ,
pad ( d . getSeconds ( ) ) ] . join ( ':' ) ;
return [ d . getDate ( ) , months [ d . getMonth ( ) ] , time ] . join ( ' ' ) ;
}
2015-07-14 19:23:35 +02:00
2018-02-16 11:16:18 +01:00
// log is just a thin wrapper to console.log that prepends a timestamp
exports . log = function ( ) {
console . log ( '%s - %s' , timestamp ( ) , exports . format . apply ( exports , arguments ) ) ;
2015-07-14 19:23:35 +02:00
} ;
2018-02-16 11:16:18 +01:00
/ * *
* Inherit the prototype methods from one constructor into another .
*
* The Function . prototype . inherits from lang . js rewritten as a standalone
* function ( not on Function . prototype ) . NOTE : If this file is to be loaded
* during bootstrapping this function needs to be rewritten using some native
* functions as prototype setup using normal JavaScript does not work as
* expected during bootstrapping ( see mirror . js in r114903 ) .
*
* @ param { function } ctor Constructor function which needs to inherit the
* prototype .
* @ param { function } superCtor Constructor function to inherit prototype from .
* /
exports . inherits = require ( 'inherits' ) ;
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
exports . _extend = function ( origin , add ) {
// Don't do anything if add isn't an object
if ( ! add || ! isObject ( add ) ) return origin ;
var keys = Object . keys ( add ) ;
var i = keys . length ;
while ( i -- ) {
origin [ keys [ i ] ] = add [ keys [ i ] ] ;
}
return origin ;
} ;
function hasOwnProperty ( obj , prop ) {
return Object . prototype . hasOwnProperty . call ( obj , prop ) ;
}
2016-11-29 11:09:07 +01:00
2018-02-16 11:16:18 +01:00
} ) . call ( this , require ( '_process' ) , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } )
2019-01-10 12:43:45 +01:00
} , { "./support/isBuffer" : 41 , "_process" : 22 , "inherits" : 18 } ] } , { } , [ 1 ] ) ;