1 | EventEmitter = require('events').EventEmitter
|
2 | Promise = require('bluebird')
|
3 |
|
4 | class 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 |
|
86 | module.exports = Buffer
|