webruby 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/config.rb +4 -9
  3. data/lib/webruby/rake/files.rake +2 -2
  4. data/modules/emscripten/AUTHORS +9 -1
  5. data/modules/emscripten/CONTRIBUTING.markdown +5 -0
  6. data/modules/emscripten/ChangeLog +435 -0
  7. data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
  8. data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
  9. data/modules/emscripten/em++ +0 -2
  10. data/modules/emscripten/emcc +92 -32
  11. data/modules/emscripten/emlink.py +16 -13
  12. data/modules/emscripten/emmake +1 -1
  13. data/modules/emscripten/emrun +918 -0
  14. data/modules/emscripten/emrun.bat +2 -0
  15. data/modules/emscripten/emscripten.py +545 -20
  16. data/modules/emscripten/src/analyzer.js +6 -1
  17. data/modules/emscripten/src/compiler.js +25 -16
  18. data/modules/emscripten/src/emrun_postjs.js +20 -0
  19. data/modules/emscripten/{tests → src}/hello_world.js +0 -0
  20. data/modules/emscripten/src/intertyper.js +45 -16
  21. data/modules/emscripten/src/jsifier.js +78 -48
  22. data/modules/emscripten/src/library.js +381 -96
  23. data/modules/emscripten/src/library_browser.js +50 -53
  24. data/modules/emscripten/src/library_egl.js +66 -24
  25. data/modules/emscripten/src/library_fs.js +122 -90
  26. data/modules/emscripten/src/library_gl.js +739 -353
  27. data/modules/emscripten/src/library_glfw.js +9 -3
  28. data/modules/emscripten/src/library_glut.js +10 -5
  29. data/modules/emscripten/src/library_idbfs.js +14 -14
  30. data/modules/emscripten/src/library_memfs.js +65 -41
  31. data/modules/emscripten/src/library_nodefs.js +61 -9
  32. data/modules/emscripten/src/library_openal.js +4 -4
  33. data/modules/emscripten/src/library_path.js +9 -13
  34. data/modules/emscripten/src/library_sdl.js +301 -64
  35. data/modules/emscripten/src/library_sockfs.js +7 -5
  36. data/modules/emscripten/src/modules.js +62 -22
  37. data/modules/emscripten/src/parseTools.js +135 -102
  38. data/modules/emscripten/src/postamble.js +3 -4
  39. data/modules/emscripten/src/preamble.js +49 -29
  40. data/modules/emscripten/src/proxyClient.js +1 -1
  41. data/modules/emscripten/src/proxyWorker.js +10 -10
  42. data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
  43. data/modules/emscripten/src/runtime.js +32 -8
  44. data/modules/emscripten/src/settings.js +25 -8
  45. data/modules/emscripten/src/shell.html +6 -3
  46. data/modules/emscripten/src/shell.js +13 -11
  47. data/modules/emscripten/src/simd.js +602 -432
  48. data/modules/emscripten/src/struct_info.json +22 -2
  49. data/modules/emscripten/src/utility.js +32 -17
  50. data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
  51. data/modules/emscripten/system/include/compat/ctype.h +17 -0
  52. data/modules/emscripten/system/include/compat/wchar.h +23 -0
  53. data/modules/emscripten/system/include/compat/wctype.h +23 -0
  54. data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
  55. data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
  56. data/modules/emscripten/system/include/emscripten/vector.h +29 -1
  57. data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
  58. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
  59. data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
  60. data/modules/emscripten/system/include/libcxx/__config +95 -17
  61. data/modules/emscripten/system/include/libcxx/__debug +25 -4
  62. data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
  63. data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
  64. data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
  65. data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
  66. data/modules/emscripten/system/include/libcxx/__locale +21 -19
  67. data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
  68. data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
  69. data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
  70. data/modules/emscripten/system/include/libcxx/__tree +35 -26
  71. data/modules/emscripten/system/include/libcxx/__tuple +15 -15
  72. data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
  73. data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
  74. data/modules/emscripten/system/include/libcxx/algorithm +121 -110
  75. data/modules/emscripten/system/include/libcxx/array +15 -15
  76. data/modules/emscripten/system/include/libcxx/bitset +4 -4
  77. data/modules/emscripten/system/include/libcxx/chrono +51 -17
  78. data/modules/emscripten/system/include/libcxx/cmath +25 -23
  79. data/modules/emscripten/system/include/libcxx/codecvt +21 -18
  80. data/modules/emscripten/system/include/libcxx/complex +48 -7
  81. data/modules/emscripten/system/include/libcxx/cstddef +1 -1
  82. data/modules/emscripten/system/include/libcxx/cstdio +8 -1
  83. data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
  84. data/modules/emscripten/system/include/libcxx/cwchar +1 -1
  85. data/modules/emscripten/system/include/libcxx/deque +26 -12
  86. data/modules/emscripten/system/include/libcxx/dynarray +311 -0
  87. data/modules/emscripten/system/include/libcxx/exception +4 -4
  88. data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
  89. data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
  90. data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
  91. data/modules/emscripten/system/include/libcxx/forward_list +33 -7
  92. data/modules/emscripten/system/include/libcxx/fstream +4 -4
  93. data/modules/emscripten/system/include/libcxx/functional +200 -170
  94. data/modules/emscripten/system/include/libcxx/future +83 -39
  95. data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
  96. data/modules/emscripten/system/include/libcxx/iomanip +147 -0
  97. data/modules/emscripten/system/include/libcxx/ios +24 -16
  98. data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
  99. data/modules/emscripten/system/include/libcxx/istream +13 -8
  100. data/modules/emscripten/system/include/libcxx/iterator +108 -417
  101. data/modules/emscripten/system/include/libcxx/limits +8 -4
  102. data/modules/emscripten/system/include/libcxx/list +28 -8
  103. data/modules/emscripten/system/include/libcxx/locale +153 -390
  104. data/modules/emscripten/system/include/libcxx/map +280 -100
  105. data/modules/emscripten/system/include/libcxx/memory +49 -97
  106. data/modules/emscripten/system/include/libcxx/mutex +2 -2
  107. data/modules/emscripten/system/include/libcxx/new +43 -14
  108. data/modules/emscripten/system/include/libcxx/numeric +2 -2
  109. data/modules/emscripten/system/include/libcxx/optional +697 -0
  110. data/modules/emscripten/system/include/libcxx/ostream +17 -8
  111. data/modules/emscripten/system/include/libcxx/queue +5 -5
  112. data/modules/emscripten/system/include/libcxx/random +53 -51
  113. data/modules/emscripten/system/include/libcxx/ratio +11 -11
  114. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  115. data/modules/emscripten/system/include/libcxx/regex +23 -20
  116. data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
  117. data/modules/emscripten/system/include/libcxx/set +166 -2
  118. data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
  119. data/modules/emscripten/system/include/libcxx/sstream +4 -4
  120. data/modules/emscripten/system/include/libcxx/stack +3 -3
  121. data/modules/emscripten/system/include/libcxx/streambuf +5 -5
  122. data/modules/emscripten/system/include/libcxx/string +372 -324
  123. data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
  124. data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
  125. data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
  126. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
  127. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
  128. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
  129. data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
  130. data/modules/emscripten/system/include/libcxx/system_error +14 -8
  131. data/modules/emscripten/system/include/libcxx/thread +7 -8
  132. data/modules/emscripten/system/include/libcxx/tuple +29 -88
  133. data/modules/emscripten/system/include/libcxx/type_traits +253 -209
  134. data/modules/emscripten/system/include/libcxx/typeindex +3 -3
  135. data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
  136. data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
  137. data/modules/emscripten/system/include/libcxx/utility +20 -20
  138. data/modules/emscripten/system/include/libcxx/valarray +23 -23
  139. data/modules/emscripten/system/include/libcxx/vector +114 -91
  140. data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
  141. data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
  142. data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
  143. data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
  144. data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
  145. data/modules/emscripten/system/lib/libcextra.symbols +7 -0
  146. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
  147. data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
  148. data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
  149. data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
  150. data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
  151. data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
  152. data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
  153. data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
  154. data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
  155. data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
  156. data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
  157. data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
  158. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  159. data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
  160. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
  161. data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
  162. data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
  163. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
  164. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
  165. data/modules/emscripten/system/lib/libcxx/symbols +187 -168
  166. data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
  167. data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
  168. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
  169. data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
  170. data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
  171. data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
  172. data/modules/emscripten/tools/cache.py +5 -7
  173. data/modules/emscripten/tools/cache.pyc +0 -0
  174. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
  175. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
  176. data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
  177. data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
  178. data/modules/emscripten/tools/file_packager.py +93 -50
  179. data/modules/emscripten/tools/js-optimizer.js +98 -48
  180. data/modules/emscripten/tools/js_optimizer.py +4 -4
  181. data/modules/emscripten/tools/js_optimizer.pyc +0 -0
  182. data/modules/emscripten/tools/jsrun.py +1 -1
  183. data/modules/emscripten/tools/jsrun.pyc +0 -0
  184. data/modules/emscripten/tools/response_file.py +6 -0
  185. data/modules/emscripten/tools/response_file.pyc +0 -0
  186. data/modules/emscripten/tools/settings_template_readonly.py +2 -0
  187. data/modules/emscripten/tools/shared.py +88 -34
  188. data/modules/emscripten/tools/shared.pyc +0 -0
  189. data/modules/emscripten/tools/split.py +21 -13
  190. data/modules/mruby/build_config.rb +7 -1
  191. data/modules/mruby/doc/compile/README.md +5 -9
  192. data/modules/mruby/include/mrbconf.h +5 -2
  193. data/modules/mruby/include/mruby/array.h +1 -0
  194. data/modules/mruby/include/mruby/compile.h +2 -4
  195. data/modules/mruby/include/mruby/dump.h +7 -16
  196. data/modules/mruby/include/mruby/hash.h +1 -1
  197. data/modules/mruby/include/mruby/irep.h +14 -2
  198. data/modules/mruby/include/mruby/khash.h +8 -7
  199. data/modules/mruby/include/mruby/string.h +1 -0
  200. data/modules/mruby/include/mruby/value.h +5 -2
  201. data/modules/mruby/include/mruby.h +12 -13
  202. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
  203. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
  204. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
  205. data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
  206. data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
  207. data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
  208. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
  209. data/modules/mruby/mrblib/numeric.rb +99 -33
  210. data/modules/mruby/src/array.c +11 -4
  211. data/modules/mruby/src/backtrace.c +2 -2
  212. data/modules/mruby/src/class.c +49 -30
  213. data/modules/mruby/src/codegen.c +131 -79
  214. data/modules/mruby/src/debug.c +1 -1
  215. data/modules/mruby/src/dump.c +213 -163
  216. data/modules/mruby/src/error.c +17 -17
  217. data/modules/mruby/src/error.h +1 -1
  218. data/modules/mruby/src/etc.c +10 -0
  219. data/modules/mruby/src/gc.c +35 -17
  220. data/modules/mruby/src/hash.c +5 -5
  221. data/modules/mruby/src/kernel.c +36 -14
  222. data/modules/mruby/src/load.c +238 -296
  223. data/modules/mruby/src/numeric.c +18 -98
  224. data/modules/mruby/src/object.c +3 -5
  225. data/modules/mruby/src/parse.y +63 -56
  226. data/modules/mruby/src/proc.c +8 -5
  227. data/modules/mruby/src/re.h +0 -1
  228. data/modules/mruby/src/state.c +65 -27
  229. data/modules/mruby/src/string.c +3 -31
  230. data/modules/mruby/src/symbol.c +3 -3
  231. data/modules/mruby/src/variable.c +12 -5
  232. data/modules/mruby/src/vm.c +90 -72
  233. data/modules/mruby/tasks/mruby_build.rake +10 -1
  234. data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
  235. data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
  236. data/modules/mruby/test/driver.c +3 -3
  237. data/modules/mruby/test/t/array.rb +5 -5
  238. data/modules/mruby/test/t/class.rb +14 -1
  239. data/modules/mruby/test/t/kernel.rb +4 -0
  240. data/modules/mruby/test/t/module.rb +4 -4
  241. data/modules/mruby/test/t/nameerror.rb +1 -1
  242. data/modules/mruby/tools/mrbc/mrbc.c +23 -17
  243. data/modules/mruby/travis_config.rb +10 -1
  244. metadata +28 -5
  245. data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
@@ -75,6 +75,7 @@ var LibrarySDL = {
75
75
  textInput: false,
76
76
 
77
77
  startTime: null,
78
+ initFlags: 0, // The flags passed to SDL_Init
78
79
  buttonState: 0,
79
80
  modState: 0,
80
81
  DOMButtons: [0, 0, 0],
@@ -153,24 +154,30 @@ var LibrarySDL = {
153
154
  120: 27,
154
155
  121: 28,
155
156
  122: 29, // Z
156
- 44: 54, // comma
157
- 46: 55, // period
158
- 47: 56, // slash
159
- 49: 30, // 1
160
- 50: 31,
161
- 51: 32,
162
- 52: 33,
163
- 53: 34,
164
- 54: 35,
165
- 55: 36,
166
- 56: 37,
167
- 57: 38, // 9
168
- 48: 39, // 0
169
- 13: 40, // return
170
- 9: 43, // tab
171
- 27: 41, // escape
172
- 32: 44, // space
173
- 92: 49, // backslash
157
+ 49: 30, // 1
158
+ 50: 31,
159
+ 51: 32,
160
+ 52: 33,
161
+ 53: 34,
162
+ 54: 35,
163
+ 55: 36,
164
+ 56: 37,
165
+ 57: 38, // 9
166
+ 48: 39, // 0
167
+ 13: 40, // return
168
+ 27: 41, // escape
169
+ 8: 42, // backspace
170
+ 9: 43, // tab
171
+ 32: 44, // space
172
+ 61: 46, // equals
173
+ 91: 47, // left bracket
174
+ 93: 48, // right bracket
175
+ 92: 49, // backslash
176
+ 59: 51, // ;
177
+ 96: 52, // apostrophe
178
+ 44: 54, // comma
179
+ 46: 55, // period
180
+ 47: 56, // slash
174
181
  305: 224, // ctrl
175
182
  308: 226, // alt
176
183
  },
@@ -254,9 +261,13 @@ var LibrarySDL = {
254
261
  }
255
262
 
256
263
  var webGLContextAttributes = {
257
- antialias: ((SDL.glAttributes[13 /*SDL_GL_MULTISAMPLEBUFFERS*/] != 0) && (SDL.glAttributes[14 /*SDL_GL_MULTISAMPLESAMPLES*/] > 1))
264
+ antialias: ((SDL.glAttributes[13 /*SDL_GL_MULTISAMPLEBUFFERS*/] != 0) && (SDL.glAttributes[14 /*SDL_GL_MULTISAMPLESAMPLES*/] > 1)),
265
+ depth: (SDL.glAttributes[6 /*SDL_GL_DEPTH_SIZE*/] > 0),
266
+ stencil: (SDL.glAttributes[7 /*SDL_GL_STENCIL_SIZE*/] > 0)
258
267
  };
268
+
259
269
  var ctx = Browser.createContext(canvas, useWebGL, usePageCanvas, webGLContextAttributes);
270
+
260
271
  SDL.surfaces[surf] = {
261
272
  width: width,
262
273
  height: height,
@@ -629,6 +640,21 @@ var LibrarySDL = {
629
640
  {{{ makeSetValue('ptr', C_STRUCTS.SDL_ResizeEvent.h, 'event.h', 'i32') }}};
630
641
  break;
631
642
  }
643
+ case 'joystick_button_up': case 'joystick_button_down': {
644
+ var state = event.type === 'joystick_button_up' ? 0 : 1;
645
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyButtonEvent.type, 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}};
646
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyButtonEvent.which, 'event.index', 'i8') }}};
647
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyButtonEvent.button, 'event.button', 'i8') }}};
648
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyButtonEvent.state, 'state', 'i8') }}};
649
+ break;
650
+ }
651
+ case 'joystick_axis_motion': {
652
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyAxisEvent.type, 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}};
653
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyAxisEvent.which, 'event.index', 'i8') }}};
654
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyAxisEvent.axis, 'event.axis', 'i8') }}};
655
+ {{{ makeSetValue('ptr', C_STRUCTS.SDL_JoyAxisEvent.value, 'SDL.joystickAxisValueConversion(event.value)', 'i32') }}};
656
+ break;
657
+ }
632
658
  default: throw 'Unhandled SDL event: ' + event.type;
633
659
  }
634
660
  },
@@ -685,7 +711,109 @@ var LibrarySDL = {
685
711
  for (var i = 0; i < num; i++) {
686
712
  console.log(' diagonal ' + i + ':' + [data[i*surfData.width*4 + i*4 + 0], data[i*surfData.width*4 + i*4 + 1], data[i*surfData.width*4 + i*4 + 2], data[i*surfData.width*4 + i*4 + 3]]);
687
713
  }
688
- }
714
+ },
715
+
716
+ // Joystick helper methods and state
717
+
718
+ joystickEventState: 1, // SDL_ENABLE
719
+ lastJoystickState: {}, // Map from SDL_Joystick* to their last known state. Required to determine if a change has occurred.
720
+ // Maps Joystick names to pointers. Allows us to avoid reallocating memory for
721
+ // joystick names each time this function is called.
722
+ joystickNamePool: {},
723
+ recordJoystickState: function(joystick, state) {
724
+ // Standardize button state.
725
+ var buttons = new Array(state.buttons.length);
726
+ for (var i = 0; i < state.buttons.length; i++) {
727
+ buttons[i] = SDL.getJoystickButtonState(state.buttons[i]);
728
+ }
729
+
730
+ SDL.lastJoystickState[joystick] = {
731
+ buttons: buttons,
732
+ axes: state.axes.slice(0),
733
+ timestamp: state.timestamp,
734
+ index: state.index,
735
+ id: state.id
736
+ };
737
+ },
738
+ // Retrieves the button state of the given gamepad button.
739
+ // Abstracts away implementation differences.
740
+ // Returns 'true' if pressed, 'false' otherwise.
741
+ getJoystickButtonState: function(button) {
742
+ if (typeof button === 'object') {
743
+ // Current gamepad API editor's draft (Firefox Nightly)
744
+ // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#idl-def-GamepadButton
745
+ return button.pressed;
746
+ } else {
747
+ // Current gamepad API working draft (Firefox / Chrome Stable)
748
+ // http://www.w3.org/TR/2012/WD-gamepad-20120529/#gamepad-interface
749
+ return button > 0;
750
+ }
751
+ },
752
+ // Queries for and inserts controller events into the SDL queue.
753
+ queryJoysticks: function() {
754
+ for (var joystick in SDL.lastJoystickState) {
755
+ var state = SDL.getGamepad(joystick - 1);
756
+ var prevState = SDL.lastJoystickState[joystick];
757
+ // Check only if the timestamp has differed.
758
+ // NOTE: Timestamp is not available in Firefox.
759
+ if (typeof state.timestamp !== 'number' || state.timestamp !== prevState.timestamp) {
760
+ var i;
761
+ for (i = 0; i < state.buttons.length; i++) {
762
+ var buttonState = SDL.getJoystickButtonState(state.buttons[i]);
763
+ // NOTE: The previous state already has a boolean representation of
764
+ // its button, so no need to standardize its button state here.
765
+ if (buttonState !== prevState.buttons[i]) {
766
+ // Insert button-press event.
767
+ SDL.events.push({
768
+ type: buttonState ? 'joystick_button_down' : 'joystick_button_up',
769
+ joystick: joystick,
770
+ index: joystick - 1,
771
+ button: i
772
+ });
773
+ }
774
+ }
775
+ for (i = 0; i < state.axes.length; i++) {
776
+ if (state.axes[i] !== prevState.axes[i]) {
777
+ // Insert axes-change event.
778
+ SDL.events.push({
779
+ type: 'joystick_axis_motion',
780
+ joystick: joystick,
781
+ index: joystick - 1,
782
+ axis: i,
783
+ value: state.axes[i]
784
+ });
785
+ }
786
+ }
787
+
788
+ SDL.recordJoystickState(joystick, state);
789
+ }
790
+ }
791
+ },
792
+ // Converts the double-based browser axis value [-1, 1] into SDL's 16-bit
793
+ // value [-32768, 32767]
794
+ joystickAxisValueConversion: function(value) {
795
+ // Ensures that 0 is 0, 1 is 32767, and -1 is 32768.
796
+ return Math.ceil(((value+1) * 32767.5) - 32768);
797
+ },
798
+
799
+ getGamepads: function() {
800
+ var fcn = navigator.getGamepads || navigator.webkitGamepads || navigator.mozGamepads || navigator.gamepads || navigator.webkitGetGamepads;
801
+ if (fcn !== undefined) {
802
+ // The function must be applied on the navigator object.
803
+ return fcn.apply(navigator);
804
+ } else {
805
+ return [];
806
+ }
807
+ },
808
+
809
+ // Helper function: Returns the gamepad if available, or null if not.
810
+ getGamepad: function(deviceIndex) {
811
+ var gamepads = SDL.getGamepads();
812
+ if (gamepads.length > deviceIndex && deviceIndex >= 0) {
813
+ return gamepads[deviceIndex];
814
+ }
815
+ return null;
816
+ },
689
817
  },
690
818
 
691
819
  SDL_Linked_Version: function() {
@@ -698,8 +826,10 @@ var LibrarySDL = {
698
826
  return SDL.version;
699
827
  },
700
828
 
701
- SDL_Init: function(what) {
829
+ SDL_Init: function(initFlags) {
702
830
  SDL.startTime = Date.now();
831
+ SDL.initFlags = initFlags;
832
+
703
833
  // capture all key events. we just keep down and up, but also capture press to prevent default actions
704
834
  if (!Module['doNotCaptureKeyboard']) {
705
835
  document.addEventListener("keydown", SDL.receiveEvent);
@@ -708,6 +838,15 @@ var LibrarySDL = {
708
838
  window.addEventListener("blur", SDL.receiveEvent);
709
839
  document.addEventListener("visibilitychange", SDL.receiveEvent);
710
840
  }
841
+
842
+ if (initFlags & 0x200) {
843
+ // SDL_INIT_JOYSTICK
844
+ // Firefox will not give us Joystick data unless we register this NOP
845
+ // callback.
846
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=936104
847
+ addEventListener("gamepadconnected", function() {});
848
+ }
849
+
711
850
  window.addEventListener("unload", SDL.receiveEvent);
712
851
  SDL.keyboardState = _malloc(0x10000); // Our SDL needs 512, but 64K is safe for older SDLs
713
852
  _memset(SDL.keyboardState, 0, 0x10000);
@@ -720,6 +859,12 @@ var LibrarySDL = {
720
859
  SDL.DOMEventToSDLEvent['mousemove'] = 0x400 /* SDL_MOUSEMOTION */;
721
860
  SDL.DOMEventToSDLEvent['unload'] = 0x100 /* SDL_QUIT */;
722
861
  SDL.DOMEventToSDLEvent['resize'] = 0x7001 /* SDL_VIDEORESIZE/SDL_EVENT_COMPAT2 */;
862
+ // These are not technically DOM events; the HTML gamepad API is poll-based.
863
+ // However, we define them here, as the rest of the SDL code assumes that
864
+ // all SDL events originate as DOM events.
865
+ SDL.DOMEventToSDLEvent['joystick_axis_motion'] = 0x600 /* SDL_JOYAXISMOTION */;
866
+ SDL.DOMEventToSDLEvent['joystick_button_down'] = 0x603 /* SDL_JOYBUTTONDOWN */;
867
+ SDL.DOMEventToSDLEvent['joystick_button_up'] = 0x604 /* SDL_JOYBUTTONUP */;
723
868
  return 0; // success
724
869
  },
725
870
 
@@ -786,6 +931,14 @@ var LibrarySDL = {
786
931
  ['mousedown', 'mouseup', 'mousemove', 'DOMMouseScroll', 'mousewheel', 'mouseout'].forEach(function(event) {
787
932
  Module['canvas'].addEventListener(event, SDL.receiveEvent, true);
788
933
  });
934
+
935
+ // (0,0) means 'use fullscreen' in native; in Emscripten, use the current canvas size.
936
+ if (width == 0 && height == 0) {
937
+ var canvas = Module['canvas'];
938
+ width = canvas.width;
939
+ height = canvas.height;
940
+ }
941
+
789
942
  Browser.setCanvasSize(width, height, true);
790
943
  // Free the old surface first.
791
944
  if (SDL.screen) {
@@ -1094,6 +1247,8 @@ var LibrarySDL = {
1094
1247
  return 0;
1095
1248
  },
1096
1249
 
1250
+ SDL_LowerBlit: 'SDL_UpperBlit',
1251
+
1097
1252
  SDL_FillRect: function(surf, rect, color) {
1098
1253
  var surfData = SDL.surfaces[surf];
1099
1254
  assert(!surfData.locked); // but we could unlock and re-lock if we must..
@@ -1171,6 +1326,11 @@ var LibrarySDL = {
1171
1326
  },
1172
1327
 
1173
1328
  SDL_PollEvent: function(ptr) {
1329
+ if (SDL.initFlags & 0x200 && SDL.joystickEventState) {
1330
+ // If SDL_INIT_JOYSTICK was supplied AND the joystick system is configured
1331
+ // to automatically query for events, query for joystick events.
1332
+ SDL.queryJoysticks();
1333
+ }
1174
1334
  if (SDL.events.length === 0) return 0;
1175
1335
  if (ptr) {
1176
1336
  SDL.makeCEvent(SDL.events.shift(), ptr);
@@ -1219,11 +1379,11 @@ var LibrarySDL = {
1219
1379
  surfData.colors = new Uint8Array(256 * 3); //256 RGB colors
1220
1380
  }
1221
1381
 
1222
- for (var i = firstColor; i < firstColor + nColors; i++) {
1223
- var index = i *3;
1382
+ for (var i = 0; i < nColors; ++i) {
1383
+ var index = (firstColor + i) * 3;
1224
1384
  surfData.colors[index] = {{{ makeGetValue('colors', 'i*4', 'i8', null, true) }}};
1225
- surfData.colors[index +1] = {{{ makeGetValue('colors', 'i*4 +1', 'i8', null, true) }}};
1226
- surfData.colors[index +2] = {{{ makeGetValue('colors', 'i*4 +2', 'i8', null, true) }}};
1385
+ surfData.colors[index + 1] = {{{ makeGetValue('colors', 'i*4 + 1', 'i8', null, true) }}};
1386
+ surfData.colors[index + 2] = {{{ makeGetValue('colors', 'i*4 + 2', 'i8', null, true) }}};
1227
1387
  }
1228
1388
 
1229
1389
  return 1;
@@ -1283,12 +1443,12 @@ var LibrarySDL = {
1283
1443
  IMG_Load_RW: function(rwopsID, freeSrc) {
1284
1444
  try {
1285
1445
  // stb_image integration support
1286
- var cleanup = function() {
1446
+ function cleanup() {
1287
1447
  if (rwops && freeSrc) _SDL_FreeRW(rwopsID);
1288
1448
  };
1289
1449
  function addCleanup(func) {
1290
1450
  var old = cleanup;
1291
- cleanup = function() {
1451
+ cleanup = function added_cleanup() {
1292
1452
  old();
1293
1453
  func();
1294
1454
  }
@@ -1451,7 +1611,7 @@ var LibrarySDL = {
1451
1611
  } else if (SDL.audio.channels != 1 && SDL.audio.channels != 2) { // Unsure what SDL audio spec supports. Web Audio spec supports up to 32 channels.
1452
1612
  console.log('Warning: Using untested number of audio channels ' + SDL.audio.channels);
1453
1613
  }
1454
- if (SDL.audio.samples < 1024 || SDL.audio.samples > 524288 /* arbitrary cap */) {
1614
+ if (SDL.audio.samples < 128 || SDL.audio.samples > 524288 /* arbitrary cap */) {
1455
1615
  throw 'Unsupported audio callback buffer size ' + SDL.audio.samples + '!';
1456
1616
  } else if ((SDL.audio.samples & (SDL.audio.samples-1)) != 0) {
1457
1617
  throw 'Audio callback buffer size ' + SDL.audio.samples + ' must be a power-of-two!';
@@ -1462,8 +1622,12 @@ var LibrarySDL = {
1462
1622
  SDL.audio.bufferSize = totalSamples*SDL.audio.bytesPerSample;
1463
1623
  SDL.audio.buffer = _malloc(SDL.audio.bufferSize);
1464
1624
 
1625
+ // To account for jittering in frametimes, always have multiple audio buffers queued up for the audio output device.
1626
+ // This helps that we won't starve that easily if a frame takes long to complete.
1627
+ SDL.audio.numSimultaneouslyQueuedBuffers = Module['SDL_numSimultaneouslyQueuedBuffers'] || 3;
1628
+
1465
1629
  // Create a callback function that will be routinely called to ask more audio data from the user application.
1466
- SDL.audio.caller = function() {
1630
+ SDL.audio.caller = function SDL_audio_caller() {
1467
1631
  if (!SDL.audio) {
1468
1632
  return;
1469
1633
  }
@@ -1477,7 +1641,8 @@ var LibrarySDL = {
1477
1641
  SDL.audio.audioOutput['mozSetup'](SDL.audio.channels, SDL.audio.freq); // use string attributes on mozOutput for closure compiler
1478
1642
  SDL.audio.mozBuffer = new Float32Array(totalSamples);
1479
1643
  SDL.audio.nextPlayTime = 0;
1480
- SDL.audio.pushAudio = function(ptr, size) {
1644
+ SDL.audio.pushAudio = function SDL_audio_pushAudio(ptr, size) {
1645
+ --SDL.audio.numAudioTimersPending;
1481
1646
  var mozBuffer = SDL.audio.mozBuffer;
1482
1647
  // The input audio data for SDL audio is either 8-bit or 16-bit interleaved across channels, output for Mozilla Audio Data API
1483
1648
  // needs to be Float32 interleaved, so perform a sample conversion.
@@ -1496,14 +1661,22 @@ var LibrarySDL = {
1496
1661
 
1497
1662
  // Compute when the next audio callback should be called.
1498
1663
  var curtime = Date.now() / 1000.0 - SDL.audio.startTime;
1664
+ #if ASSERTIONS
1499
1665
  if (curtime > SDL.audio.nextPlayTime && SDL.audio.nextPlayTime != 0) {
1500
1666
  console.log('warning: Audio callback had starved sending audio by ' + (curtime - SDL.audio.nextPlayTime) + ' seconds.');
1501
1667
  }
1668
+ #endif
1502
1669
  var playtime = Math.max(curtime, SDL.audio.nextPlayTime);
1503
1670
  var buffer_duration = SDL.audio.samples / SDL.audio.freq;
1504
1671
  SDL.audio.nextPlayTime = playtime + buffer_duration;
1505
- // Schedule the next audio callback call.
1672
+ // Schedule the next audio callback call to occur when the current one finishes.
1506
1673
  SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, 1000.0 * (playtime-curtime));
1674
+ ++SDL.audio.numAudioTimersPending;
1675
+ // And also schedule extra buffers _now_ if we have too few in queue.
1676
+ if (SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) {
1677
+ ++SDL.audio.numAudioTimersPending;
1678
+ Browser.safeSetTimeout(SDL.audio.caller, 1.0);
1679
+ }
1507
1680
  }
1508
1681
  } else {
1509
1682
  // Initialize Web Audio API if we haven't done so yet. Note: Only initialize Web Audio context ever once on the web page,
@@ -1566,9 +1739,11 @@ var LibrarySDL = {
1566
1739
  // Schedule the generated sample buffer to be played out at the correct time right after the previously scheduled
1567
1740
  // sample buffer has finished.
1568
1741
  var curtime = SDL.audioContext['currentTime'];
1569
- // if (curtime > SDL.audio.nextPlayTime && SDL.audio.nextPlayTime != 0) {
1570
- // console.log('warning: Audio callback had starved sending audio by ' + (curtime - SDL.audio.nextPlayTime) + ' seconds.');
1571
- // }
1742
+ #if ASSERTIONS
1743
+ if (curtime > SDL.audio.nextPlayTime && SDL.audio.nextPlayTime != 0) {
1744
+ console.log('warning: Audio callback had starved sending audio by ' + (curtime - SDL.audio.nextPlayTime) + ' seconds.');
1745
+ }
1746
+ #endif
1572
1747
  var playtime = Math.max(curtime, SDL.audio.nextPlayTime);
1573
1748
  SDL.audio.soundSource[SDL.audio.nextSoundSource]['start'](playtime);
1574
1749
  var buffer_duration = sizeSamplesPerChannel / SDL.audio.freq;
@@ -1583,8 +1758,8 @@ var LibrarySDL = {
1583
1758
  ++SDL.audio.numAudioTimersPending;
1584
1759
  }
1585
1760
 
1586
- // If we are risking starving, immediately queue an extra second buffer.
1587
- if (secsUntilNextCall <= buffer_duration && SDL.audio.numAudioTimersPending <= 1) {
1761
+ // If we are risking starving, immediately queue extra buffers.
1762
+ if (secsUntilNextCall <= buffer_duration && SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) {
1588
1763
  ++SDL.audio.numAudioTimersPending;
1589
1764
  Browser.safeSetTimeout(SDL.audio.caller, 1.0);
1590
1765
  }
@@ -1737,23 +1912,19 @@ var LibrarySDL = {
1737
1912
  var filename = '';
1738
1913
  var audio;
1739
1914
  var bytes;
1740
-
1915
+
1741
1916
  if (rwops.filename !== undefined) {
1742
1917
  filename = PATH.resolve(rwops.filename);
1743
1918
  var raw = Module["preloadedAudios"][filename];
1744
1919
  if (!raw) {
1745
1920
  if (raw === null) Module.printErr('Trying to reuse preloaded audio, but freePreloadedMediaOnUse is set!');
1746
1921
  Runtime.warnOnce('Cannot find preloaded audio ' + filename);
1747
-
1922
+
1748
1923
  // see if we can read the file-contents from the in-memory FS
1749
- var fileObject = FS.findObject(filename);
1750
-
1751
- if (fileObject === null) Module.printErr('Couldn\'t find file for: ' + filename);
1752
-
1753
- // We found the file. Load the contents
1754
- if (fileObject && !fileObject.isFolder && fileObject.read) {
1755
- bytes = fileObject.contents;
1756
- } else {
1924
+ try {
1925
+ bytes = FS.readFile(filename);
1926
+ } catch (e) {
1927
+ Module.printErr('Couldn\'t find file for: ' + filename);
1757
1928
  return 0;
1758
1929
  }
1759
1930
  }
@@ -1768,16 +1939,16 @@ var LibrarySDL = {
1768
1939
  else {
1769
1940
  return 0;
1770
1941
  }
1771
-
1942
+
1772
1943
  // Here, we didn't find a preloaded audio but we either were passed a filepath for
1773
1944
  // which we loaded bytes, or we were passed some bytes
1774
1945
  if (audio === undefined && bytes) {
1775
- var blob = new Blob([new Uint8Array(bytes)], {type: rwops.mimetype});
1946
+ var blob = new Blob([bytes], {type: rwops.mimetype});
1776
1947
  var url = URL.createObjectURL(blob);
1777
1948
  audio = new Audio();
1778
1949
  audio.src = url;
1779
1950
  }
1780
-
1951
+
1781
1952
  var id = SDL.audios.length;
1782
1953
  // Keep the loaded audio in the audio arrays, ready for playback
1783
1954
  SDL.audios.push({
@@ -1844,7 +2015,7 @@ var LibrarySDL = {
1844
2015
  audio.frequency = info.audio.frequency;
1845
2016
  // TODO: handle N loops. Behavior matches Mix_PlayMusic
1846
2017
  audio.loop = loops != 0;
1847
- audio['onended'] = function() { // TODO: cache these
2018
+ audio['onended'] = function SDL_audio_onended() { // TODO: cache these
1848
2019
  channelInfo.audio = null;
1849
2020
  if (SDL.channelFinished) {
1850
2021
  Runtime.getFuncWrapper(SDL.channelFinished, 'vi')(channel);
@@ -1871,7 +2042,7 @@ var LibrarySDL = {
1871
2042
  source.loop = false;
1872
2043
  source.buffer = context.createBuffer(numChannels, 1, audio.frequency);
1873
2044
  var jsNode = context.createJavaScriptNode(2048, numChannels, numChannels);
1874
- jsNode.onaudioprocess = function(event) {
2045
+ jsNode.onaudioprocess = function jsNode_onaudioprocess(event) {
1875
2046
  var buffers = new Array(numChannels);
1876
2047
  for (var i = 0; i < numChannels; ++i) {
1877
2048
  buffers[i] = event.outputBuffer.getChannelData(i);
@@ -2357,37 +2528,103 @@ var LibrarySDL = {
2357
2528
 
2358
2529
  // Joysticks
2359
2530
 
2360
- SDL_NumJoysticks: function() { return 0; },
2531
+ SDL_NumJoysticks: function() {
2532
+ var count = 0;
2533
+ var gamepads = SDL.getGamepads();
2534
+ // The length is not the number of gamepads; check which ones are defined.
2535
+ for (var i = 0; i < gamepads.length; i++) {
2536
+ if (gamepads[i] !== undefined) count++;
2537
+ }
2538
+ return count;
2539
+ },
2361
2540
 
2362
- SDL_JoystickName: function(deviceIndex) { return 0; },
2541
+ SDL_JoystickName: function(deviceIndex) {
2542
+ var gamepad = SDL.getGamepad(deviceIndex);
2543
+ if (gamepad) {
2544
+ var name = gamepad.id;
2545
+ if (SDL.joystickNamePool.hasOwnProperty(name)) {
2546
+ return SDL.joystickNamePool[name];
2547
+ }
2548
+ return SDL.joystickNamePool[name] = allocate(intArrayFromString(name), 'i8', ALLOC_NORMAL);
2549
+ }
2550
+ return 0;
2551
+ },
2363
2552
 
2364
- SDL_JoystickOpen: function(deviceIndex) { return 0; },
2553
+ SDL_JoystickOpen: function(deviceIndex) {
2554
+ var gamepad = SDL.getGamepad(deviceIndex);
2555
+ if (gamepad) {
2556
+ // Use this as a unique 'pointer' for this joystick.
2557
+ var joystick = deviceIndex+1;
2558
+ SDL.recordJoystickState(joystick, gamepad);
2559
+ return joystick;
2560
+ }
2561
+ return 0;
2562
+ },
2365
2563
 
2366
- SDL_JoystickOpened: function(deviceIndex) { return 0; },
2564
+ SDL_JoystickOpened: function(deviceIndex) {
2565
+ return SDL.lastJoystickState.hasOwnProperty(deviceIndex+1) ? 1 : 0;
2566
+ },
2367
2567
 
2368
- SDL_JoystickIndex: function(joystick) { return 0; },
2568
+ SDL_JoystickIndex: function(joystick) {
2569
+ // joystick pointers are simply the deviceIndex+1.
2570
+ return joystick - 1;
2571
+ },
2369
2572
 
2370
- SDL_JoystickNumAxes: function(joystick) { return 0; },
2573
+ SDL_JoystickNumAxes: function(joystick) {
2574
+ var gamepad = SDL.getGamepad(joystick - 1);
2575
+ if (gamepad) {
2576
+ return gamepad.axes.length;
2577
+ }
2578
+ return 0;
2579
+ },
2371
2580
 
2372
2581
  SDL_JoystickNumBalls: function(joystick) { return 0; },
2373
2582
 
2374
2583
  SDL_JoystickNumHats: function(joystick) { return 0; },
2375
2584
 
2376
- SDL_JoystickNumButtons: function(joystick) { return 0; },
2585
+ SDL_JoystickNumButtons: function(joystick) {
2586
+ var gamepad = SDL.getGamepad(joystick - 1);
2587
+ if (gamepad) {
2588
+ return gamepad.buttons.length;
2589
+ }
2590
+ return 0;
2591
+ },
2377
2592
 
2378
- SDL_JoystickUpdate: function() {},
2593
+ SDL_JoystickUpdate: function() {
2594
+ SDL.queryJoysticks();
2595
+ },
2379
2596
 
2380
- SDL_JoystickEventState: function(state) { return 0; },
2597
+ SDL_JoystickEventState: function(state) {
2598
+ if (state < 0) {
2599
+ // SDL_QUERY: Return current state.
2600
+ return SDL.joystickEventState;
2601
+ }
2602
+ return SDL.joystickEventState = state;
2603
+ },
2381
2604
 
2382
- SDL_JoystickGetAxis: function(joystick, axis) { return 0; },
2605
+ SDL_JoystickGetAxis: function(joystick, axis) {
2606
+ var gamepad = SDL.getGamepad(joystick - 1);
2607
+ if (gamepad && gamepad.axes.length > axis) {
2608
+ return SDL.joystickAxisValueConversion(gamepad.axes[axis]);
2609
+ }
2610
+ return 0;
2611
+ },
2383
2612
 
2384
2613
  SDL_JoystickGetHat: function(joystick, hat) { return 0; },
2385
2614
 
2386
2615
  SDL_JoystickGetBall: function(joystick, ball, dxptr, dyptr) { return -1; },
2387
2616
 
2388
- SDL_JoystickGetButton: function(joystick, button) { return 0; },
2617
+ SDL_JoystickGetButton: function(joystick, button) {
2618
+ var gamepad = SDL.getGamepad(joystick - 1);
2619
+ if (gamepad && gamepad.buttons.length > button) {
2620
+ return SDL.getJoystickButtonState(gamepad.buttons[button]) ? 1 : 0;
2621
+ }
2622
+ return 0;
2623
+ },
2389
2624
 
2390
- SDL_JoystickClose: function(joystick) {},
2625
+ SDL_JoystickClose: function(joystick) {
2626
+ delete SDL.lastJoystickState[joystick];
2627
+ },
2391
2628
 
2392
2629
  // Misc
2393
2630
 
@@ -2436,7 +2673,7 @@ var LibrarySDL = {
2436
2673
 
2437
2674
  SDL_WaitThread: function() { throw 'SDL_WaitThread' },
2438
2675
  SDL_GetThreadID: function() { throw 'SDL_GetThreadID' },
2439
- SDL_ThreadID: function() { throw 'SDL_ThreadID' },
2676
+ SDL_ThreadID: function() { return 0; },
2440
2677
  SDL_AllocRW: function() { throw 'SDL_AllocRW: TODO' },
2441
2678
  SDL_CondBroadcast: function() { throw 'SDL_CondBroadcast: TODO' },
2442
2679
  SDL_CondWaitTimeout: function() { throw 'SDL_CondWaitTimeout: TODO' },
@@ -1,6 +1,6 @@
1
1
  mergeInto(LibraryManager.library, {
2
2
  $SOCKFS__postset: '__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });',
3
- $SOCKFS__deps: ['$FS'],
3
+ $SOCKFS__deps: ['$FS', 'mkport'],
4
4
  $SOCKFS: {
5
5
  mount: function(mount) {
6
6
  return FS.createNode(null, '/', {{{ cDefine('S_IFDIR') }}} | 0777, 0);
@@ -138,7 +138,9 @@ mergeInto(LibraryManager.library, {
138
138
  console.log('connect: ' + url);
139
139
  #endif
140
140
  // the node ws library API is slightly different than the browser's
141
- var opts = ENVIRONMENT_IS_NODE ? {} : ['binary'];
141
+ var opts = ENVIRONMENT_IS_NODE ? {headers: {'websocket-protocol': ['binary']}} : ['binary'];
142
+ // If node we use the ws library.
143
+ var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];
142
144
  ws = new WebSocket(url, opts);
143
145
  ws.binaryType = 'arraybuffer';
144
146
  } catch (e) {
@@ -208,7 +210,7 @@ mergeInto(LibraryManager.library, {
208
210
  }
209
211
  };
210
212
 
211
- var handleMessage = function(data) {
213
+ function handleMessage(data) {
212
214
  assert(typeof data !== 'string' && data.byteLength !== undefined); // must receive an ArrayBuffer
213
215
  data = new Uint8Array(data); // make a typed array view on the array buffer
214
216
 
@@ -247,7 +249,7 @@ mergeInto(LibraryManager.library, {
247
249
  });
248
250
  } else {
249
251
  peer.socket.onopen = handleOpen;
250
- peer.socket.onmessage = function(event) {
252
+ peer.socket.onmessage = function peer_socket_onmessage(event) {
251
253
  handleMessage(event.data);
252
254
  };
253
255
  }
@@ -573,4 +575,4 @@ mergeInto(LibraryManager.library, {
573
575
  }
574
576
  }
575
577
  }
576
- });
578
+ });