Skip to content

Instantly share code, notes, and snippets.

@geta6
Last active December 19, 2015 11:09
Show Gist options
  • Save geta6/5945918 to your computer and use it in GitHub Desktop.
Save geta6/5945918 to your computer and use it in GitHub Desktop.
socket.io readable stream
socket.current = null
socket.on 'start', (query) ->
socket.current = query.name
($ '#main').html ' '
console.log 'start'
socket.on 'data', (query, data) ->
if socket.current is query.name
($ '#main').append (_.template ($ '#template').html()) data
socket.on 'end', (query) ->
console.log 'end'
query = 'filename' # とか
query = { name: /hoge/i } # とか
socket.emit 'fetch', query
Stream = require 'stream'
class WritableSocketStream extends Stream.Writable
constructor: (@socket, options = {}) ->
@socket.emit 'start'
write: (chunk, encoding, callback) ->
@socket.emit 'data', chunk.toString(encoding)
end: (chunk, encoding, callback) ->
@socket.emit 'data', chunk.toString(encoding) if chunk
@socket.emit 'end'
io.sockets.on 'connection', (socket) ->
socket.on 'fetch', (query) ->
stream = fs.createReadStream path.resolve 'public', query
stream.pipe new WritableSocketStream socket
# あるいは
stream = Data.find(query).stream()
stream.pipe new WritableSocketStream socket
socket.current = null
socket.on 'fetch', (query) ->
socket.current = query.name # Blocking 処理
Data.find(query).exec (err, data) ->
socket.emit 'start', query
for d, i in data
do (d, i, data, query) ->
setTimeout ->
if socket.current is query.name
socket.emit 'data', query, data
if i+1 is data.length
socket.emit 'end', query
, 4 * i # 4msでデータ順序が保たれる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment