webruby 0.2.2 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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
+ });