UNPKG

1.99 kBtext/coffeescriptView Raw
1EventEmitter = require('events').EventEmitter
2Promise = require('bluebird')
3
4class Buffer extends EventEmitter
5 @_defaultBufferSize: 10
6
7 @defaultBufferSize: (size) ->
8 return Buffer._defaultBufferSize if !size?
9 Buffer._defaultBufferSize = size
10
11 constructor: (options = {}) ->
12 @content = options.content ? []
13 @size = options.size ? Buffer._defaultBufferSize
14 @_sealed = options.sealed ? false
15
16 isEmpty: ->
17 @content.length == 0
18
19 isFull: ->
20 @content.length >= @size
21
22 getContent: ->
23 @content
24
25 write: (data) ->
26 throw new Error('Cannot write sealed buffer') if @_sealed == true
27 throw new Error('Buffer is full') if @isFull()
28 @content.push data
29 @emit 'write', data
30 @emit 'full' if @isFull()
31 @
32
33 append: (data) ->
34 @appendArray [ data ]
35 @
36
37 appendArray: (dataArray) ->
38 newSize = @content.length + dataArray.length
39 @size = newSize if newSize > @size
40 @write data for data in dataArray
41 @
42
43 writeAsync: (data) ->
44 if !@isFull()
45 Promise.resolve @write data
46 else
47 new Promise (resolve, reject) =>
48 @once 'release', =>
49 resolve @writeAsync data
50
51 writeArrayAsync: (dataArray) ->
52 return Promise.resolve() if !dataArray.length
53 first = dataArray.shift()
54 @writeAsync first
55 .then => @writeArrayAsync dataArray if dataArray.length > 0
56
57 read: ->
58 throw new Error('Buffer is empty') if @isEmpty()
59 result = @content.shift()
60 @emit 'release', result
61 if @isEmpty()
62 @emit 'empty'
63 @emit 'end' if @_sealed == true
64 result
65
66 readAsync: ->
67 if !@isEmpty()
68 Promise.resolve(@read())
69 else
70 new Promise (resolve, reject) =>
71 @once 'write', => resolve @readAsync()
72
73 seal: ->
74 throw new Error('Buffer already sealed') if @_sealed == true
75 @_sealed = true
76 @emit 'sealed'
77 @emit 'end' if @isEmpty()
78 @
79
80 isSealed: ->
81 @_sealed == true
82
83 isEnded: ->
84 @isSealed() && @isEmpty()
85
86module.exports = Buffer