@scratch/scratch-vm 11.0.0-UEPR-176

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 (178) hide show
  1. package/LICENSE +12 -0
  2. package/README.md +120 -0
  3. package/dist/node/extension-worker.js +2 -0
  4. package/dist/node/extension-worker.js.map +1 -0
  5. package/dist/node/scratch-vm.js +3 -0
  6. package/dist/node/scratch-vm.js.LICENSE.txt +205 -0
  7. package/dist/node/scratch-vm.js.map +1 -0
  8. package/dist/web/extension-worker.js +2 -0
  9. package/dist/web/extension-worker.js.map +1 -0
  10. package/dist/web/scratch-vm.js +3 -0
  11. package/dist/web/scratch-vm.js.LICENSE.txt +42 -0
  12. package/dist/web/scratch-vm.js.map +1 -0
  13. package/package.json +108 -0
  14. package/src/.eslintrc.js +7 -0
  15. package/src/blocks/scratch3_control.js +206 -0
  16. package/src/blocks/scratch3_core_example.js +69 -0
  17. package/src/blocks/scratch3_data.js +257 -0
  18. package/src/blocks/scratch3_event.js +137 -0
  19. package/src/blocks/scratch3_looks.js +612 -0
  20. package/src/blocks/scratch3_motion.js +288 -0
  21. package/src/blocks/scratch3_operators.js +154 -0
  22. package/src/blocks/scratch3_procedures.js +79 -0
  23. package/src/blocks/scratch3_sensing.js +336 -0
  24. package/src/blocks/scratch3_sound.js +350 -0
  25. package/src/dispatch/central-dispatch.js +143 -0
  26. package/src/dispatch/shared-dispatch.js +235 -0
  27. package/src/dispatch/worker-dispatch.js +110 -0
  28. package/src/engine/adapter.js +176 -0
  29. package/src/engine/block-utility.js +242 -0
  30. package/src/engine/blocks-execute-cache.js +19 -0
  31. package/src/engine/blocks-runtime-cache.js +78 -0
  32. package/src/engine/blocks.js +1299 -0
  33. package/src/engine/comment.js +56 -0
  34. package/src/engine/execute.js +580 -0
  35. package/src/engine/monitor-record.js +23 -0
  36. package/src/engine/mutation-adapter.js +48 -0
  37. package/src/engine/profiler.js +390 -0
  38. package/src/engine/runtime.js +2686 -0
  39. package/src/engine/scratch-blocks-constants.js +27 -0
  40. package/src/engine/sequencer.js +361 -0
  41. package/src/engine/stage-layering.js +29 -0
  42. package/src/engine/target.js +799 -0
  43. package/src/engine/thread.js +404 -0
  44. package/src/engine/variable.js +70 -0
  45. package/src/extension-support/argument-type.js +47 -0
  46. package/src/extension-support/block-type.js +50 -0
  47. package/src/extension-support/define-messages.js +18 -0
  48. package/src/extension-support/extension-manager.js +440 -0
  49. package/src/extension-support/extension-metadata.js +64 -0
  50. package/src/extension-support/extension-worker.js +59 -0
  51. package/src/extension-support/reporter-scope.js +18 -0
  52. package/src/extension-support/target-type.js +17 -0
  53. package/src/extensions/scratch3_boost/index.js +2113 -0
  54. package/src/extensions/scratch3_ev3/index.js +1355 -0
  55. package/src/extensions/scratch3_gdx_for/index.js +981 -0
  56. package/src/extensions/scratch3_gdx_for/scratch-link-device-adapter.js +44 -0
  57. package/src/extensions/scratch3_makeymakey/index.js +396 -0
  58. package/src/extensions/scratch3_microbit/index.js +984 -0
  59. package/src/extensions/scratch3_music/assets/drums/1-snare.mp3 +0 -0
  60. package/src/extensions/scratch3_music/assets/drums/10-wood-block.mp3 +0 -0
  61. package/src/extensions/scratch3_music/assets/drums/11-cowbell.mp3 +0 -0
  62. package/src/extensions/scratch3_music/assets/drums/12-triangle.mp3 +0 -0
  63. package/src/extensions/scratch3_music/assets/drums/13-bongo.mp3 +0 -0
  64. package/src/extensions/scratch3_music/assets/drums/14-conga.mp3 +0 -0
  65. package/src/extensions/scratch3_music/assets/drums/15-cabasa.mp3 +0 -0
  66. package/src/extensions/scratch3_music/assets/drums/16-guiro.mp3 +0 -0
  67. package/src/extensions/scratch3_music/assets/drums/17-vibraslap.mp3 +0 -0
  68. package/src/extensions/scratch3_music/assets/drums/18-cuica.mp3 +0 -0
  69. package/src/extensions/scratch3_music/assets/drums/2-bass-drum.mp3 +0 -0
  70. package/src/extensions/scratch3_music/assets/drums/3-side-stick.mp3 +0 -0
  71. package/src/extensions/scratch3_music/assets/drums/4-crash-cymbal.mp3 +0 -0
  72. package/src/extensions/scratch3_music/assets/drums/5-open-hi-hat.mp3 +0 -0
  73. package/src/extensions/scratch3_music/assets/drums/6-closed-hi-hat.mp3 +0 -0
  74. package/src/extensions/scratch3_music/assets/drums/7-tambourine.mp3 +0 -0
  75. package/src/extensions/scratch3_music/assets/drums/8-hand-clap.mp3 +0 -0
  76. package/src/extensions/scratch3_music/assets/drums/9-claves.mp3 +0 -0
  77. package/src/extensions/scratch3_music/assets/instruments/1-piano/108.mp3 +0 -0
  78. package/src/extensions/scratch3_music/assets/instruments/1-piano/24.mp3 +0 -0
  79. package/src/extensions/scratch3_music/assets/instruments/1-piano/36.mp3 +0 -0
  80. package/src/extensions/scratch3_music/assets/instruments/1-piano/48.mp3 +0 -0
  81. package/src/extensions/scratch3_music/assets/instruments/1-piano/60.mp3 +0 -0
  82. package/src/extensions/scratch3_music/assets/instruments/1-piano/72.mp3 +0 -0
  83. package/src/extensions/scratch3_music/assets/instruments/1-piano/84.mp3 +0 -0
  84. package/src/extensions/scratch3_music/assets/instruments/1-piano/96.mp3 +0 -0
  85. package/src/extensions/scratch3_music/assets/instruments/10-clarinet/48.mp3 +0 -0
  86. package/src/extensions/scratch3_music/assets/instruments/10-clarinet/60.mp3 +0 -0
  87. package/src/extensions/scratch3_music/assets/instruments/11-saxophone/36.mp3 +0 -0
  88. package/src/extensions/scratch3_music/assets/instruments/11-saxophone/60.mp3 +0 -0
  89. package/src/extensions/scratch3_music/assets/instruments/11-saxophone/84.mp3 +0 -0
  90. package/src/extensions/scratch3_music/assets/instruments/12-flute/60.mp3 +0 -0
  91. package/src/extensions/scratch3_music/assets/instruments/12-flute/72.mp3 +0 -0
  92. package/src/extensions/scratch3_music/assets/instruments/13-wooden-flute/60.mp3 +0 -0
  93. package/src/extensions/scratch3_music/assets/instruments/13-wooden-flute/72.mp3 +0 -0
  94. package/src/extensions/scratch3_music/assets/instruments/14-bassoon/36.mp3 +0 -0
  95. package/src/extensions/scratch3_music/assets/instruments/14-bassoon/48.mp3 +0 -0
  96. package/src/extensions/scratch3_music/assets/instruments/14-bassoon/60.mp3 +0 -0
  97. package/src/extensions/scratch3_music/assets/instruments/15-choir/48.mp3 +0 -0
  98. package/src/extensions/scratch3_music/assets/instruments/15-choir/60.mp3 +0 -0
  99. package/src/extensions/scratch3_music/assets/instruments/15-choir/72.mp3 +0 -0
  100. package/src/extensions/scratch3_music/assets/instruments/16-vibraphone/60.mp3 +0 -0
  101. package/src/extensions/scratch3_music/assets/instruments/16-vibraphone/72.mp3 +0 -0
  102. package/src/extensions/scratch3_music/assets/instruments/17-music-box/60.mp3 +0 -0
  103. package/src/extensions/scratch3_music/assets/instruments/18-steel-drum/60.mp3 +0 -0
  104. package/src/extensions/scratch3_music/assets/instruments/19-marimba/60.mp3 +0 -0
  105. package/src/extensions/scratch3_music/assets/instruments/2-electric-piano/60.mp3 +0 -0
  106. package/src/extensions/scratch3_music/assets/instruments/20-synth-lead/60.mp3 +0 -0
  107. package/src/extensions/scratch3_music/assets/instruments/21-synth-pad/60.mp3 +0 -0
  108. package/src/extensions/scratch3_music/assets/instruments/3-organ/60.mp3 +0 -0
  109. package/src/extensions/scratch3_music/assets/instruments/4-guitar/60.mp3 +0 -0
  110. package/src/extensions/scratch3_music/assets/instruments/5-electric-guitar/60.mp3 +0 -0
  111. package/src/extensions/scratch3_music/assets/instruments/6-bass/36.mp3 +0 -0
  112. package/src/extensions/scratch3_music/assets/instruments/6-bass/48.mp3 +0 -0
  113. package/src/extensions/scratch3_music/assets/instruments/7-pizzicato/60.mp3 +0 -0
  114. package/src/extensions/scratch3_music/assets/instruments/8-cello/36.mp3 +0 -0
  115. package/src/extensions/scratch3_music/assets/instruments/8-cello/48.mp3 +0 -0
  116. package/src/extensions/scratch3_music/assets/instruments/8-cello/60.mp3 +0 -0
  117. package/src/extensions/scratch3_music/assets/instruments/9-trombone/36.mp3 +0 -0
  118. package/src/extensions/scratch3_music/assets/instruments/9-trombone/48.mp3 +0 -0
  119. package/src/extensions/scratch3_music/assets/instruments/9-trombone/60.mp3 +0 -0
  120. package/src/extensions/scratch3_music/index.js +1333 -0
  121. package/src/extensions/scratch3_music/manifest.js +63 -0
  122. package/src/extensions/scratch3_pen/index.js +770 -0
  123. package/src/extensions/scratch3_speech2text/index.js +700 -0
  124. package/src/extensions/scratch3_text2speech/index.js +766 -0
  125. package/src/extensions/scratch3_translate/index.js +286 -0
  126. package/src/extensions/scratch3_video_sensing/debug.js +13 -0
  127. package/src/extensions/scratch3_video_sensing/index.js +594 -0
  128. package/src/extensions/scratch3_video_sensing/library.js +384 -0
  129. package/src/extensions/scratch3_video_sensing/math.js +76 -0
  130. package/src/extensions/scratch3_video_sensing/view.js +509 -0
  131. package/src/extensions/scratch3_wedo2/index.js +1616 -0
  132. package/src/import/load-costume.js +416 -0
  133. package/src/import/load-sound.js +116 -0
  134. package/src/index.js +10 -0
  135. package/src/io/ble.js +256 -0
  136. package/src/io/bt.js +202 -0
  137. package/src/io/clock.js +39 -0
  138. package/src/io/cloud.js +169 -0
  139. package/src/io/keyboard.js +146 -0
  140. package/src/io/mouse.js +145 -0
  141. package/src/io/mouseWheel.js +28 -0
  142. package/src/io/userData.js +24 -0
  143. package/src/io/video.js +210 -0
  144. package/src/playground/benchmark.css +83 -0
  145. package/src/playground/benchmark.js +753 -0
  146. package/src/playground/index.html +111 -0
  147. package/src/playground/suite.css +78 -0
  148. package/src/playground/suite.html +25 -0
  149. package/src/playground/suite.js +544 -0
  150. package/src/playground/video-sensing.html +18 -0
  151. package/src/playground/video-sensing.js +133 -0
  152. package/src/serialization/deserialize-assets.js +178 -0
  153. package/src/serialization/sb2.js +1295 -0
  154. package/src/serialization/sb2_specmap.js +1818 -0
  155. package/src/serialization/sb3.js +1320 -0
  156. package/src/serialization/serialize-assets.js +60 -0
  157. package/src/sprites/rendered-target.js +1115 -0
  158. package/src/sprites/sprite.js +177 -0
  159. package/src/util/base64-util.js +48 -0
  160. package/src/util/cast.js +218 -0
  161. package/src/util/clone.js +17 -0
  162. package/src/util/color.js +204 -0
  163. package/src/util/fetch-with-timeout.js +53 -0
  164. package/src/util/get-monitor-id.js +33 -0
  165. package/src/util/jsonrpc.js +114 -0
  166. package/src/util/log.js +4 -0
  167. package/src/util/math-util.js +122 -0
  168. package/src/util/maybe-format-message.js +18 -0
  169. package/src/util/new-block-ids.js +33 -0
  170. package/src/util/rateLimiter.js +73 -0
  171. package/src/util/scratch-link-websocket.js +133 -0
  172. package/src/util/string-util.js +94 -0
  173. package/src/util/task-queue.js +203 -0
  174. package/src/util/timer.js +103 -0
  175. package/src/util/uid.js +29 -0
  176. package/src/util/variable-util.js +48 -0
  177. package/src/util/xml-escape.js +33 -0
  178. package/src/virtual-machine.js +1586 -0
@@ -0,0 +1,178 @@
1
+ const JSZip = require('jszip');
2
+ const log = require('../util/log');
3
+
4
+ /**
5
+ * Deserializes sound from file into storage cache so that it can
6
+ * be loaded into the runtime.
7
+ * @param {object} sound Descriptor for sound from sb3 file
8
+ * @param {Runtime} runtime The runtime containing the storage to cache the sounds in
9
+ * @param {JSZip} zip The zip containing the sound file being described by `sound`
10
+ * @param {string} assetFileName Optional file name for the given asset
11
+ * (sb2 files have filenames of the form [int].[ext],
12
+ * sb3 files have filenames of the form [md5].[ext])
13
+ * @return {Promise} Promise that resolves after the described sound has been stored
14
+ * into the runtime storage cache, the sound was already stored, or an error has
15
+ * occurred.
16
+ */
17
+ const deserializeSound = function (sound, runtime, zip, assetFileName) {
18
+ const fileName = assetFileName ? assetFileName : sound.md5;
19
+ const storage = runtime.storage;
20
+ if (!storage) {
21
+ log.warn('No storage module present; cannot load sound asset: ', fileName);
22
+ return Promise.resolve(null);
23
+ }
24
+
25
+ if (!zip) { // Zip will not be provided if loading project json from server
26
+ return Promise.resolve(null);
27
+ }
28
+
29
+ let soundFile = zip.file(fileName);
30
+ if (!soundFile) {
31
+ // look for assetfile in a flat list of files, or in a folder
32
+ const fileMatch = new RegExp(`^([^/]*/)?${fileName}$`);
33
+ soundFile = zip.file(fileMatch)[0]; // use first matching file
34
+ }
35
+
36
+ if (!soundFile) {
37
+ log.error(`Could not find sound file associated with the ${sound.name} sound.`);
38
+ return Promise.resolve(null);
39
+ }
40
+
41
+ if (!JSZip.support.uint8array) {
42
+ log.error('JSZip uint8array is not supported in this browser.');
43
+ return Promise.resolve(null);
44
+ }
45
+
46
+ const dataFormat = sound.dataFormat.toLowerCase() === 'mp3' ?
47
+ storage.DataFormat.MP3 : storage.DataFormat.WAV;
48
+ return soundFile.async('uint8array').then(data => storage.createAsset(
49
+ storage.AssetType.Sound,
50
+ dataFormat,
51
+ data,
52
+ null,
53
+ true
54
+ ))
55
+ .then(asset => {
56
+ sound.asset = asset;
57
+ sound.assetId = asset.assetId;
58
+ sound.md5 = `${asset.assetId}.${asset.dataFormat}`;
59
+ });
60
+ };
61
+
62
+ /**
63
+ * Deserializes costume from file into storage cache so that it can
64
+ * be loaded into the runtime.
65
+ * @param {object} costume Descriptor for costume from sb3 file
66
+ * @param {Runtime} runtime The runtime containing the storage to cache the costumes in
67
+ * @param {JSZip} zip The zip containing the costume file being described by `costume`
68
+ * @param {string} assetFileName Optional file name for the given asset
69
+ * (sb2 files have filenames of the form [int].[ext],
70
+ * sb3 files have filenames of the form [md5].[ext])
71
+ * @param {string} textLayerFileName Optional file name for the given asset's text layer
72
+ * (sb2 only; files have filenames of the form [int].png)
73
+ * @return {Promise} Promise that resolves after the described costume has been stored
74
+ * into the runtime storage cache, the costume was already stored, or an error has
75
+ * occurred.
76
+ */
77
+ const deserializeCostume = function (costume, runtime, zip, assetFileName, textLayerFileName) {
78
+ const storage = runtime.storage;
79
+ const assetId = costume.assetId;
80
+ const fileName = assetFileName ? assetFileName :
81
+ `${assetId}.${costume.dataFormat}`;
82
+
83
+ if (!storage) {
84
+ log.warn('No storage module present; cannot load costume asset: ', fileName);
85
+ return Promise.resolve(null);
86
+ }
87
+
88
+ if (costume.asset) {
89
+ // When uploading a sprite from an image file, the asset data will be provided
90
+ // @todo Cache the asset data somewhere and pull it out here
91
+ return Promise.resolve(storage.createAsset(
92
+ costume.asset.assetType,
93
+ costume.asset.dataFormat,
94
+ new Uint8Array(Object.keys(costume.asset.data).map(key => costume.asset.data[key])),
95
+ null,
96
+ true
97
+ )).then(asset => {
98
+ costume.asset = asset;
99
+ costume.assetId = asset.assetId;
100
+ costume.md5 = `${asset.assetId}.${asset.dataFormat}`;
101
+ });
102
+ }
103
+
104
+ if (!zip) {
105
+ // Zip will not be provided if loading project json from server
106
+ return Promise.resolve(null);
107
+ }
108
+
109
+ let costumeFile = zip.file(fileName);
110
+ if (!costumeFile) {
111
+ // look for assetfile in a flat list of files, or in a folder
112
+ const fileMatch = new RegExp(`^([^/]*/)?${fileName}$`);
113
+ costumeFile = zip.file(fileMatch)[0]; // use the first matched file
114
+ }
115
+
116
+ if (!costumeFile) {
117
+ log.error(`Could not find costume file associated with the ${costume.name} costume.`);
118
+ return Promise.resolve(null);
119
+ }
120
+ let assetType = null;
121
+ const costumeFormat = costume.dataFormat.toLowerCase();
122
+ if (costumeFormat === 'svg') {
123
+ assetType = storage.AssetType.ImageVector;
124
+ } else if (['png', 'bmp', 'jpeg', 'jpg', 'gif'].indexOf(costumeFormat) >= 0) {
125
+ assetType = storage.AssetType.ImageBitmap;
126
+ } else {
127
+ log.error(`Unexpected file format for costume: ${costumeFormat}`);
128
+ }
129
+ if (!JSZip.support.uint8array) {
130
+ log.error('JSZip uint8array is not supported in this browser.');
131
+ return Promise.resolve(null);
132
+ }
133
+
134
+ // textLayerMD5 exists if there is a text layer, which is a png of text from Scratch 1.4
135
+ // that was opened in Scratch 2.0. In this case, set costume.textLayerAsset.
136
+ let textLayerFilePromise;
137
+ if (costume.textLayerMD5) {
138
+ const textLayerFile = zip.file(textLayerFileName);
139
+ if (!textLayerFile) {
140
+ log.error(`Could not find text layer file associated with the ${costume.name} costume.`);
141
+ return Promise.resolve(null);
142
+ }
143
+ textLayerFilePromise = textLayerFile.async('uint8array')
144
+ .then(data => storage.createAsset(
145
+ storage.AssetType.ImageBitmap,
146
+ 'png',
147
+ data,
148
+ costume.textLayerMD5
149
+ ))
150
+ .then(asset => {
151
+ costume.textLayerAsset = asset;
152
+ });
153
+ } else {
154
+ textLayerFilePromise = Promise.resolve(null);
155
+ }
156
+
157
+ return Promise.all([textLayerFilePromise,
158
+ costumeFile.async('uint8array')
159
+ .then(data => storage.createAsset(
160
+ assetType,
161
+ // TODO eventually we want to map non-png's to their actual file types?
162
+ costumeFormat,
163
+ data,
164
+ null,
165
+ true
166
+ ))
167
+ .then(asset => {
168
+ costume.asset = asset;
169
+ costume.assetId = asset.assetId;
170
+ costume.md5 = `${asset.assetId}.${asset.dataFormat}`;
171
+ })
172
+ ]);
173
+ };
174
+
175
+ module.exports = {
176
+ deserializeSound,
177
+ deserializeCostume
178
+ };