Working Web Worker version :)

openid
Marcin Kulik 12 years ago
parent a1c33fdd59
commit 59567921db

@ -0,0 +1,3 @@
console = {
log: function(t) { postMessage({ log: t }); }
};

@ -0,0 +1,47 @@
vt = undefined
movie = undefined
@onmessage = (e) =>
d = e.data
if d.objectName
switch d.objectName
when 'vt'
vt[d.message](d.args[0], d.args[1], d.args[2])
when 'movie'
movie[d.message](d.args[0], d.args[1], d.args[2])
else if d.cmd
switch d.cmd
when 'init'
initialize d
initialize = (options) ->
vt = new AsciiIo.VT options.cols, options.lines
vt.on 'all', (event) -> postMessage evt: event, src: 'vt'
movie = new AsciiIo.Movie(
timing: options.timing
stdout_data: options.stdout_data
duration: options.duration
speed: options.speed
benchmark: options.benchmark
cols: options.cols
lines: options.lines
)
movie.on 'all', (event, arg1) -> postMessage evt: event, src: 'movie', arg1: arg1
movie.on 'reset', => vt.reset()
movie.on 'finished', => vt.stopCursorBlink()
movie.on 'wakeup', => vt.restartCursorBlink()
movie.on 'data', (data) =>
vt.feed data
state = vt.state()
# console.log state
vt.clearChanges()
movie.trigger 'render', state
console.log 'inited!'

@ -0,0 +1,3 @@
class AsciiIo.MovieWorkerProxy extends AsciiIo.WorkerProxy
togglePlay: ->
@sendMessage 'togglePlay'

@ -6,4 +6,5 @@
//= require ./vt
//= require ./hud_view
//= require ./player_view
//= require ./worker_proxy
//= require_tree .

@ -30,15 +30,7 @@ class AsciiIo.PlayerView extends Backbone.View
@model.fetch success: => @onModelFetched()
onModelFetched: ->
data = @model.get 'escaped_stdout_data'
data = atob data
if typeof window.Worker == 'function'
@unpackModelDataViaWorker data
else
@unpackModelDataHere data
unpackModelDataViaWorker: (data) ->
data = atob @model.get('escaped_stdout_data')
worker = new Worker(window.worker_unpack_path)
worker.onmessage = (event) =>
@ -47,14 +39,41 @@ class AsciiIo.PlayerView extends Backbone.View
worker.postMessage data
unpackModelDataHere: (data) ->
@model.set stdout_data: ArchUtils.bz2.decode(data)
@onModelReady()
# worker = new Worker(window.worker_path)
# worker.onmessage = (event) =>
# @model.set stdout_data: event.data
# @onModelReady()
# # console.log event.data
# worker.postMessage
# cmd: 'fetch'
# data: data
# data = atob data
# if typeof window.Worker == 'function'
# @unpackModelDataViaWorker data
# else
# @unpackModelDataHere data
# unpackModelDataViaWorker: (data) ->
# worker = new Worker(window.worker_unpack_path)
# worker.onmessage = (event) =>
# @model.set stdout_data: event.data
# @onModelReady()
# worker.postMessage data
# unpackModelDataHere: (data) ->
# @model.set stdout_data: ArchUtils.bz2.decode(data)
# @onModelReady()
onModelReady: ->
@hideLoadingIndicator()
@hudView.setDuration @model.get('duration') if @options.hud
@createMovie()
@createMainWorker()
@bindEvents()
if @options.autoPlay
@ -62,35 +81,30 @@ class AsciiIo.PlayerView extends Backbone.View
else
@showToggleOverlay()
createMovie: ->
@vt = new AsciiIo.VT(@options.cols, @options.lines)
createMainWorker: ->
@worker = new Worker(window.worker_path)
@movie = new AsciiIo.Movie(
@worker.postMessage
cmd: 'init'
timing: @model.get 'stdout_timing_data'
stdout_data: @model.get 'stdout_data'
duration: @model.get 'duration'
speed: @options.speed,
speed: @options.speed
benchmark: @options.benchmark
cols: @options.cols
lines: @options.lines
)
bindEvents: ->
@movie.on 'reset', => @vt.reset()
@movie.on 'finished', => @vt.stopCursorBlink()
@movie.on 'wakeup', => @vt.restartCursorBlink()
@vt = new AsciiIo.VTWorkerProxy @worker, 'vt'
@movie = new AsciiIo.MovieWorkerProxy @worker, 'movie'
bindEvents: ->
if @options.hud
@movie.on 'paused', => @hudView.onPause()
@movie.on 'resumed', => @hudView.onResume()
@movie.on 'time', (time) => @hudView.updateTime(time)
@movie.on 'started', => @$el.removeClass('not-started')
@movie.on 'data', (data) =>
@vt.feed data
@rendererView.render @vt.state()
@vt.clearChanges()
@movie.on 'render', (state) => @rendererView.render state
@vt.on 'cursor:blink:restart', => @rendererView.restartCursorBlink()
@vt.on 'cursor:blink:stop', => @rendererView.stopCursorBlink()

@ -56,6 +56,8 @@ class AsciiIo.Renderer.Pre extends AsciiIo.Renderer.Base
text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
spanFromBrush: (brush) ->
brush = AsciiIo.Brush.create brush
key = brush.hash()
span = @cachedSpans[key]

@ -0,0 +1,3 @@
class AsciiIo.VTWorkerProxy extends AsciiIo.WorkerProxy
feed: (data) ->
@sendMessage 'feed', data

@ -0,0 +1,19 @@
class AsciiIo.WorkerProxy
constructor: (@worker, @objectName) ->
_.extend(this, Backbone.Events)
@worker.onmessage = @onMessage
onMessage: (e) =>
if e.data.log
console.log "log message from #{@objectName}: #{e.data.log}"
else if e.data.evt
if e.data.src == @objectName
# console.log e.data.evt
# console.log e.data.arg1
@trigger e.data.evt, e.data.arg1
sendMessage: (msg, arg1, arg2, arg3) ->
@worker.postMessage
objectName: @objectName
message: msg
args: [arg1, arg2, arg3]

@ -0,0 +1,16 @@
//= require_self
//= include console-shim
//= include vendor/underscore-min
//= include vendor/backbone-min
//= include player/sgr_interpreter
//= include player/brush
//= include player/special_charset
//= include player/scroll_region
//= include player/tab_stops
//= include player/screen_buffer
//= include player/utf8
//= include player/vt
//= include player/movie
//= include player/background
AsciiIo = {};

@ -21,6 +21,7 @@
<script>
window.worker_unpack_path = '<%= javascript_path "worker-unpack" %>';
window.worker_path = '<%= javascript_path "worker" %>';
</script>
</head>
<body>

@ -0,0 +1,3 @@
console.log('Hello')
console.log('World')
console.printf('a')
Loading…
Cancel
Save