opal 1.6.1 → 1.7.0

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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +17 -0
  3. data/CHANGELOG.md +35 -1
  4. data/Gemfile +1 -0
  5. data/HACKING.md +47 -26
  6. data/benchmark/benchmarks +415 -103
  7. data/benchmark/bm_call_overhead.yml +28 -0
  8. data/benchmark/run.rb +61 -40
  9. data/docs/cdp_common.json +3364 -0
  10. data/docs/cdp_common.md +18 -0
  11. data/docs/{headless_chrome.md → headless_browsers.md} +31 -12
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/builder.rb +6 -1
  14. data/lib/opal/builder_processors.rb +5 -3
  15. data/lib/opal/cache.rb +1 -7
  16. data/lib/opal/cli_options.rb +72 -58
  17. data/lib/opal/cli_runners/chrome.rb +47 -9
  18. data/lib/opal/cli_runners/chrome_cdp_interface.rb +238 -112
  19. data/lib/opal/cli_runners/compiler.rb +146 -13
  20. data/lib/opal/cli_runners/deno.rb +32 -0
  21. data/lib/opal/cli_runners/firefox.rb +350 -0
  22. data/lib/opal/cli_runners/firefox_cdp_interface.rb +212 -0
  23. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.cmd +17 -0
  24. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.ps1 +28 -0
  25. data/lib/opal/cli_runners/node_modules/.package-lock.json +41 -0
  26. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +1 -1
  27. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +322 -182
  28. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +99 -114
  29. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +1 -11
  30. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +16 -11
  31. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +41 -33
  32. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +224 -214
  33. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +71 -191
  34. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +26 -6
  35. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +20788 -9049
  36. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +10 -3
  37. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +59 -123
  38. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +25 -32
  39. data/lib/opal/cli_runners/node_modules/commander/History.md +298 -0
  40. data/lib/opal/cli_runners/node_modules/commander/LICENSE +22 -0
  41. data/lib/opal/cli_runners/node_modules/commander/Readme.md +217 -61
  42. data/lib/opal/cli_runners/node_modules/commander/index.js +431 -145
  43. data/lib/opal/cli_runners/node_modules/commander/package.json +16 -79
  44. data/lib/opal/cli_runners/node_modules/ws/README.md +334 -98
  45. data/lib/opal/cli_runners/node_modules/ws/browser.js +8 -0
  46. data/lib/opal/cli_runners/node_modules/ws/index.js +5 -10
  47. data/lib/opal/cli_runners/node_modules/ws/lib/buffer-util.js +129 -0
  48. data/lib/opal/cli_runners/node_modules/ws/lib/constants.js +10 -0
  49. data/lib/opal/cli_runners/node_modules/ws/lib/event-target.js +184 -0
  50. data/lib/opal/cli_runners/node_modules/ws/lib/extension.js +223 -0
  51. data/lib/opal/cli_runners/node_modules/ws/lib/limiter.js +55 -0
  52. data/lib/opal/cli_runners/node_modules/ws/lib/permessage-deflate.js +518 -0
  53. data/lib/opal/cli_runners/node_modules/ws/lib/receiver.js +607 -0
  54. data/lib/opal/cli_runners/node_modules/ws/lib/sender.js +409 -0
  55. data/lib/opal/cli_runners/node_modules/ws/lib/stream.js +180 -0
  56. data/lib/opal/cli_runners/node_modules/ws/lib/validation.js +104 -0
  57. data/lib/opal/cli_runners/node_modules/ws/lib/websocket-server.js +447 -0
  58. data/lib/opal/cli_runners/node_modules/ws/lib/websocket.js +1195 -0
  59. data/lib/opal/cli_runners/node_modules/ws/package.json +40 -106
  60. data/lib/opal/cli_runners/package-lock.json +62 -0
  61. data/lib/opal/cli_runners/package.json +1 -1
  62. data/lib/opal/cli_runners.rb +26 -4
  63. data/lib/opal/nodes/args/prepare_post_args.rb +2 -2
  64. data/lib/opal/nodes/def.rb +8 -8
  65. data/lib/opal/nodes/iter.rb +12 -12
  66. data/lib/opal/nodes/logic.rb +1 -1
  67. data/lib/opal/nodes/masgn.rb +2 -2
  68. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  69. data/lib/opal/paths.rb +14 -0
  70. data/lib/opal/rewriter.rb +2 -0
  71. data/lib/opal/rewriters/forward_args.rb +52 -4
  72. data/lib/opal/rewriters/targeted_patches.rb +94 -0
  73. data/lib/opal/version.rb +1 -1
  74. data/opal/corelib/basic_object.rb +1 -1
  75. data/opal/corelib/boolean.rb +2 -2
  76. data/opal/corelib/class.rb +11 -0
  77. data/opal/corelib/constants.rb +3 -3
  78. data/opal/corelib/enumerable.rb +4 -0
  79. data/opal/corelib/enumerator.rb +1 -1
  80. data/opal/corelib/hash.rb +2 -2
  81. data/opal/corelib/helpers.rb +1 -1
  82. data/opal/corelib/kernel.rb +3 -3
  83. data/opal/corelib/method.rb +1 -1
  84. data/opal/corelib/module.rb +29 -8
  85. data/opal/corelib/proc.rb +7 -5
  86. data/opal/corelib/runtime.js +141 -78
  87. data/opal/corelib/set.rb +252 -0
  88. data/opal/corelib/string.rb +2 -1
  89. data/opal/corelib/time.rb +2 -2
  90. data/opal/opal.rb +1 -0
  91. data/opal.gemspec +1 -0
  92. data/spec/filters/bugs/array.rb +22 -13
  93. data/spec/filters/bugs/base64.rb +5 -5
  94. data/spec/filters/bugs/basicobject.rb +16 -8
  95. data/spec/filters/bugs/bigdecimal.rb +161 -160
  96. data/spec/filters/bugs/binding.rb +10 -10
  97. data/spec/filters/bugs/class.rb +8 -8
  98. data/spec/filters/bugs/complex.rb +2 -1
  99. data/spec/filters/bugs/date.rb +79 -81
  100. data/spec/filters/bugs/datetime.rb +29 -29
  101. data/spec/filters/bugs/delegate.rb +1 -3
  102. data/spec/filters/bugs/encoding.rb +69 -69
  103. data/spec/filters/bugs/enumerable.rb +22 -20
  104. data/spec/filters/bugs/enumerator.rb +88 -85
  105. data/spec/filters/bugs/exception.rb +46 -40
  106. data/spec/filters/bugs/file.rb +32 -32
  107. data/spec/filters/bugs/float.rb +26 -21
  108. data/spec/filters/bugs/freeze.rb +88 -0
  109. data/spec/filters/bugs/hash.rb +39 -38
  110. data/spec/filters/bugs/integer.rb +57 -44
  111. data/spec/filters/bugs/io.rb +1 -1
  112. data/spec/filters/bugs/kernel.rb +349 -269
  113. data/spec/filters/bugs/language.rb +220 -188
  114. data/spec/filters/bugs/main.rb +5 -3
  115. data/spec/filters/bugs/marshal.rb +38 -38
  116. data/spec/filters/bugs/math.rb +2 -1
  117. data/spec/filters/bugs/method.rb +73 -62
  118. data/spec/filters/bugs/module.rb +163 -143
  119. data/spec/filters/bugs/numeric.rb +6 -6
  120. data/spec/filters/bugs/objectspace.rb +16 -16
  121. data/spec/filters/bugs/openstruct.rb +1 -1
  122. data/spec/filters/bugs/pack_unpack.rb +51 -51
  123. data/spec/filters/bugs/pathname.rb +7 -7
  124. data/spec/filters/bugs/proc.rb +63 -63
  125. data/spec/filters/bugs/random.rb +7 -6
  126. data/spec/filters/bugs/range.rb +12 -9
  127. data/spec/filters/bugs/rational.rb +8 -7
  128. data/spec/filters/bugs/regexp.rb +49 -48
  129. data/spec/filters/bugs/ruby-32.rb +56 -0
  130. data/spec/filters/bugs/set.rb +30 -30
  131. data/spec/filters/bugs/singleton.rb +4 -4
  132. data/spec/filters/bugs/string.rb +187 -99
  133. data/spec/filters/bugs/stringio.rb +7 -0
  134. data/spec/filters/bugs/stringscanner.rb +68 -68
  135. data/spec/filters/bugs/struct.rb +11 -9
  136. data/spec/filters/bugs/symbol.rb +1 -1
  137. data/spec/filters/bugs/time.rb +78 -63
  138. data/spec/filters/bugs/trace_point.rb +4 -4
  139. data/spec/filters/bugs/unboundmethod.rb +32 -17
  140. data/spec/filters/bugs/warnings.rb +8 -12
  141. data/spec/filters/unsupported/array.rb +24 -107
  142. data/spec/filters/unsupported/basicobject.rb +12 -12
  143. data/spec/filters/unsupported/bignum.rb +27 -52
  144. data/spec/filters/unsupported/class.rb +1 -2
  145. data/spec/filters/unsupported/delegator.rb +3 -3
  146. data/spec/filters/unsupported/enumerable.rb +2 -9
  147. data/spec/filters/unsupported/enumerator.rb +2 -11
  148. data/spec/filters/unsupported/file.rb +1 -1
  149. data/spec/filters/unsupported/float.rb +28 -47
  150. data/spec/filters/unsupported/hash.rb +8 -14
  151. data/spec/filters/unsupported/integer.rb +75 -91
  152. data/spec/filters/unsupported/kernel.rb +17 -35
  153. data/spec/filters/unsupported/language.rb +11 -19
  154. data/spec/filters/unsupported/marshal.rb +22 -41
  155. data/spec/filters/unsupported/matchdata.rb +28 -52
  156. data/spec/filters/unsupported/math.rb +1 -1
  157. data/spec/filters/unsupported/privacy.rb +229 -285
  158. data/spec/filters/unsupported/range.rb +1 -5
  159. data/spec/filters/unsupported/regexp.rb +40 -66
  160. data/spec/filters/unsupported/set.rb +2 -2
  161. data/spec/filters/unsupported/singleton.rb +4 -4
  162. data/spec/filters/unsupported/string.rb +305 -508
  163. data/spec/filters/unsupported/struct.rb +3 -4
  164. data/spec/filters/unsupported/symbol.rb +15 -18
  165. data/spec/filters/unsupported/thread.rb +1 -7
  166. data/spec/filters/unsupported/time.rb +159 -202
  167. data/spec/filters/unsupported/usage_of_files.rb +170 -259
  168. data/spec/lib/builder_spec.rb +4 -4
  169. data/spec/lib/rewriters/forward_args_spec.rb +32 -12
  170. data/spec/mspec-opal/runner.rb +2 -0
  171. data/spec/ruby_specs +4 -0
  172. data/stdlib/deno/base.rb +28 -0
  173. data/stdlib/deno/file.rb +340 -0
  174. data/stdlib/{headless_chrome.rb → headless_browser/base.rb} +1 -1
  175. data/stdlib/headless_browser/file.rb +15 -0
  176. data/stdlib/headless_browser.rb +4 -0
  177. data/stdlib/native.rb +1 -1
  178. data/stdlib/nodejs/file.rb +5 -0
  179. data/stdlib/opal/platform.rb +8 -6
  180. data/stdlib/opal-platform.rb +14 -8
  181. data/stdlib/set.rb +1 -258
  182. data/tasks/benchmarking.rake +62 -19
  183. data/tasks/performance.rake +1 -1
  184. data/tasks/testing.rake +5 -3
  185. data/test/nodejs/test_file.rb +29 -10
  186. data/test/opal/http_server.rb +28 -11
  187. data/test/opal/unsupported_and_bugs.rb +2 -1
  188. metadata +89 -50
  189. data/lib/opal/cli_runners/node_modules/ultron/LICENSE +0 -22
  190. data/lib/opal/cli_runners/node_modules/ultron/index.js +0 -138
  191. data/lib/opal/cli_runners/node_modules/ultron/package.json +0 -112
  192. data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +0 -33
  193. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +0 -56
  194. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +0 -15
  195. data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +0 -28
  196. data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +0 -158
  197. data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +0 -69
  198. data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +0 -339
  199. data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +0 -520
  200. data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +0 -438
  201. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +0 -9
  202. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +0 -17
  203. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +0 -705
  204. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +0 -336
  205. data/spec/filters/bugs/boolean.rb +0 -3
  206. data/spec/filters/bugs/matrix.rb +0 -3
  207. data/spec/filters/unsupported/fixnum.rb +0 -15
  208. data/spec/filters/unsupported/freeze.rb +0 -102
  209. data/spec/filters/unsupported/pathname.rb +0 -4
  210. data/spec/filters/unsupported/proc.rb +0 -4
  211. data/spec/filters/unsupported/random.rb +0 -5
  212. data/spec/filters/unsupported/taint.rb +0 -162
@@ -3,243 +3,123 @@
3
3
  const http = require('http');
4
4
  const https = require('https');
5
5
 
6
- const defaults = require('./defaults');
7
- const externalRequest = require('./external-request');
6
+ const defaults = require('./defaults.js');
7
+ const externalRequest = require('./external-request.js');
8
8
 
9
- // callback(err, protocol)
10
- module.exports.Protocol = promisesWrapper(function (options, callback) {
9
+ // options.path must be specified; callback(err, data)
10
+ function devToolsInterface(path, options, callback) {
11
+ const transport = options.secure ? https : http;
12
+ const requestOptions = {
13
+ host: options.host || defaults.HOST,
14
+ port: options.port || defaults.PORT,
15
+ useHostName: options.useHostName,
16
+ path: (options.alterPath ? options.alterPath(path) : path)
17
+ };
18
+ externalRequest(transport, requestOptions, callback);
19
+ }
20
+
21
+ // wrapper that allows to return a promise if the callback is omitted, it works
22
+ // for DevTools methods
23
+ function promisesWrapper(func) {
24
+ return (options, callback) => {
25
+ // options is an optional argument
26
+ if (typeof options === 'function') {
27
+ callback = options;
28
+ options = undefined;
29
+ }
30
+ options = options || {};
31
+ // just call the function otherwise wrap a promise around its execution
32
+ if (typeof callback === 'function') {
33
+ func(options, callback);
34
+ return undefined;
35
+ } else {
36
+ return new Promise((fulfill, reject) => {
37
+ func(options, (err, result) => {
38
+ if (err) {
39
+ reject(err);
40
+ } else {
41
+ fulfill(result);
42
+ }
43
+ });
44
+ });
45
+ }
46
+ };
47
+ }
48
+
49
+ function Protocol(options, callback) {
11
50
  // if the local protocol is requested
12
- if (!options.remote) {
51
+ if (options.local) {
13
52
  const localDescriptor = require('./protocol.json');
14
- callback(null, {
15
- 'remote': false,
16
- 'descriptor': localDescriptor
17
- });
53
+ callback(null, localDescriptor);
18
54
  return;
19
55
  }
20
- // try to fecth the browser version information and the protocol (remotely)
21
- module.exports.Version(options, function (err, info) {
56
+ // try to fetch the protocol remotely
57
+ devToolsInterface('/json/protocol', options, (err, descriptor) => {
22
58
  if (err) {
23
59
  callback(err);
24
- return;
25
- }
26
- // fetch the reported browser info (Node.js returns an array)
27
- const browser = (info[0] || info).Browser;
28
- // use the proper protocol fetcher
29
- let fetcher;
30
- if (browser.match(/^(Headless)?Chrome\//)) {
31
- // https://bugs.chromium.org/p/chromium/issues/detail?id=538300#c10
32
- const firstJsonProtocolVersion = '60.0.3097.0';
33
- const firstJsonProtocolBuild = explodeChromeVersion(firstJsonProtocolVersion)[2];
34
- const chromeBuild = explodeChromeVersion(info.Browser.split('/')[1])[2];
35
- if (chromeBuild < firstJsonProtocolBuild) {
36
- fetcher = fetchFromChromeRepo;
37
- } else {
38
- fetcher = fetchFromHttpEndpoint;
39
- }
40
- } else if (browser.match(/^Microsoft Edge /)) {
41
- fetcher = fetchFromHttpEndpoint;
42
- } else if (browser.match(/^node.js\//)) {
43
- fetcher = fetchFromHttpEndpoint;
44
60
  } else {
45
- callback(new Error('Unknown implementation'));
46
- return;
61
+ callback(null, JSON.parse(descriptor));
47
62
  }
48
- fetcher(options, info, function (err, descriptor) {
49
- if (err) {
50
- callback(err);
51
- return;
52
- }
53
- // use the remotely fetched descriptor
54
- callback(null, {
55
- 'remote': true,
56
- 'descriptor': descriptor
57
- });
58
- });
59
63
  });
60
- });
64
+ }
61
65
 
62
- module.exports.List = promisesWrapper(function (options, callback) {
63
- options.path = '/json/list';
64
- devToolsInterface(options, function (err, tabs) {
66
+ function List(options, callback) {
67
+ devToolsInterface('/json/list', options, (err, tabs) => {
65
68
  if (err) {
66
69
  callback(err);
67
70
  } else {
68
71
  callback(null, JSON.parse(tabs));
69
72
  }
70
73
  });
71
- });
74
+ }
72
75
 
73
- module.exports.New = promisesWrapper(function (options, callback) {
74
- options.path = '/json/new';
76
+ function New(options, callback) {
77
+ let path = '/json/new';
75
78
  if (Object.prototype.hasOwnProperty.call(options, 'url')) {
76
- options.path += '?' + options.url;
79
+ path += `?${options.url}`;
77
80
  }
78
- devToolsInterface(options, function (err, tab) {
81
+ devToolsInterface(path, options, (err, tab) => {
79
82
  if (err) {
80
83
  callback(err);
81
84
  } else {
82
85
  callback(null, JSON.parse(tab));
83
86
  }
84
87
  });
85
- });
88
+ }
86
89
 
87
- module.exports.Activate = promisesWrapper(function (options, callback) {
88
- options.path = '/json/activate/' + options.id;
89
- devToolsInterface(options, function (err) {
90
+ function Activate(options, callback) {
91
+ devToolsInterface('/json/activate/' + options.id, options, (err) => {
90
92
  if (err) {
91
93
  callback(err);
92
94
  } else {
93
95
  callback(null);
94
96
  }
95
97
  });
96
- });
98
+ }
97
99
 
98
- module.exports.Close = promisesWrapper(function (options, callback) {
99
- options.path = '/json/close/' + options.id;
100
- devToolsInterface(options, function (err) {
100
+ function Close(options, callback) {
101
+ devToolsInterface('/json/close/' + options.id, options, (err) => {
101
102
  if (err) {
102
103
  callback(err);
103
104
  } else {
104
105
  callback(null);
105
106
  }
106
107
  });
107
- });
108
+ }
108
109
 
109
- module.exports.Version = promisesWrapper(function (options, callback) {
110
- options.path = '/json/version';
111
- devToolsInterface(options, function (err, versionInfo) {
110
+ function Version(options, callback) {
111
+ devToolsInterface('/json/version', options, (err, versionInfo) => {
112
112
  if (err) {
113
113
  callback(err);
114
114
  } else {
115
115
  callback(null, JSON.parse(versionInfo));
116
116
  }
117
117
  });
118
- });
119
-
120
- // options.path must be specified; callback(err, data)
121
- function devToolsInterface(options, callback) {
122
- options.host = options.host || defaults.HOST;
123
- options.port = options.port || defaults.PORT;
124
- options.secure = !!(options.secure);
125
- externalRequest(options.secure ? https : http, options, callback);
126
118
  }
127
119
 
128
- // wrapper that allows to return a promise if the callback is omitted, it works
129
- // for DevTools methods
130
- function promisesWrapper(func) {
131
- return function (options, callback) {
132
- // options is an optional argument
133
- if (typeof options === 'function') {
134
- callback = options;
135
- options = undefined;
136
- }
137
- options = options || {};
138
- // just call the function otherwise wrap a promise around its execution
139
- if (typeof callback === 'function') {
140
- func(options, callback);
141
- } else {
142
- return new Promise(function (fulfill, reject) {
143
- func(options, function (err, result) {
144
- if (err) {
145
- reject(err);
146
- } else {
147
- fulfill(result);
148
- }
149
- });
150
- });
151
- }
152
- };
153
- }
154
-
155
- function explodeChromeVersion(v) {
156
- return v.split('.').map(function (x) {
157
- return parseInt(x);
158
- });
159
- }
160
-
161
- // callback(err, descriptor)
162
- // XXX this function needs a proper refactor but the inconsistency of the
163
- // fetching process makes it useless for now
164
- function fetchFromChromeRepo(options, info, callback) {
165
- // attempt to fetch the protocol directly from the Chromium repository
166
- // according to the current version
167
- //
168
- // Thanks to Paul Irish.
169
- // (see https://github.com/cyrus-and/chrome-remote-interface/issues/10#issuecomment-146032907)
170
- const webKitVersion = info['WebKit-Version'];
171
- const v8Version = info['V8-Version'];
172
- const match = webKitVersion.match(/\s\(@(\b[0-9a-f]{5,40}\b)/);
173
- const hash = match[1];
174
- const fromChromiumDotOrg = (hash <= 202666);
175
- let urls;
176
- if (fromChromiumDotOrg) {
177
- urls = [`https://src.chromium.org/blink/trunk/Source/devtools/protocol.json?p=${hash}`];
178
- } else {
179
- const lastBeforeSplitChromeVersion = '53.0.2758.1'; // before the split (https://crbug.com/580337)
180
- const lastBeforeV8ChromeVersion = '55.0.2854.3'; // before using the JSON from the V8 repo
181
- const chromeVersion = explodeChromeVersion(info.Browser.split('/')[1]);
182
- // according to https://www.chromium.org/developers/version-numbers (patch not meaningful)
183
- const beforeSplit = (chromeVersion[2] <= explodeChromeVersion(lastBeforeSplitChromeVersion)[2]);
184
- const beforeFromV8 = (chromeVersion[2] <= explodeChromeVersion(lastBeforeV8ChromeVersion)[2]);
185
- if (beforeSplit) {
186
- urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/devtools/protocol.json?format=TEXT`];
187
- } else if (beforeFromV8) {
188
- urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
189
- `https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json?format=TEXT`];
190
- } else if (v8Version) {
191
- urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
192
- `https://chromium.googlesource.com/v8/v8/+/${v8Version}/src/inspector/js_protocol.json?format=TEXT`];
193
- } else {
194
- console.error('Warning: the protocol might be outdated, see: https://groups.google.com/d/topic/chrome-debugging-protocol/HjyOKainKus/discussion');
195
- // releases which do not provide a V8 version get an old version of the V8 protocol
196
- urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
197
- `https://chromium.googlesource.com/chromium/src/+/${lastBeforeV8ChromeVersion}/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json?format=TEXT`];
198
- }
199
- }
200
- const descriptors = [];
201
- urls.forEach(function (url) {
202
- externalRequest(https, url, function (err, data) {
203
- let descriptor;
204
- if (!err) {
205
- try {
206
- // the file is served base64 encoded from googlesource.com
207
- if (!fromChromiumDotOrg) {
208
- data = new Buffer(data, 'base64').toString();
209
- }
210
- descriptor = JSON.parse(data);
211
- } catch (_) {
212
- // abort later
213
- }
214
- }
215
- descriptors.push(descriptor);
216
- if (descriptors.length === urls.length) {
217
- // all must be defined
218
- if (descriptors.indexOf(undefined) !== -1) {
219
- callback(new Error('Cannot fetch from Chromium repo'));
220
- return;
221
- }
222
- // merge the domains
223
- descriptors.forEach(function (descriptor, i) {
224
- if (i === 0) {
225
- return;
226
- }
227
- Array.prototype.push.apply(descriptors[0].domains, descriptor.domains);
228
- });
229
- callback(null, descriptors[0]);
230
- }
231
- });
232
- });
233
- }
234
-
235
- // callback(err, descriptor)
236
- function fetchFromHttpEndpoint(options, info, callback) {
237
- options.path = '/json/protocol';
238
- devToolsInterface(options, function (err, descriptor) {
239
- if (err) {
240
- callback(err);
241
- } else {
242
- callback(null, JSON.parse(descriptor));
243
- }
244
- });
245
- }
120
+ module.exports.Protocol = promisesWrapper(Protocol);
121
+ module.exports.List = promisesWrapper(List);
122
+ module.exports.New = promisesWrapper(New);
123
+ module.exports.Activate = promisesWrapper(Activate);
124
+ module.exports.Close = promisesWrapper(Close);
125
+ module.exports.Version = promisesWrapper(Version);
@@ -1,13 +1,32 @@
1
1
  'use strict';
2
2
 
3
+ const dns = require('dns');
4
+ const util = require('util');
5
+
6
+ const REQUEST_TIMEOUT = 10000;
7
+
3
8
  // callback(err, data)
4
- function externalRequest(transport, options, callback) {
5
- const request = transport.get(options, function (response) {
9
+ async function externalRequest(transport, options, callback) {
10
+ // perform the DNS lookup manually so that the HTTP host header generated by
11
+ // http.get will contain the IP address, this is needed because since Chrome
12
+ // 66 the host header cannot contain an host name different than localhost
13
+ // (see https://github.com/cyrus-and/chrome-remote-interface/issues/340)
14
+ if (!options.useHostName) {
15
+ try {
16
+ const {address} = await util.promisify(dns.lookup)(options.host);
17
+ options.host = address;
18
+ } catch (err) {
19
+ callback(err);
20
+ return;
21
+ }
22
+ }
23
+ // perform the actual request
24
+ const request = transport.get(options, (response) => {
6
25
  let data = '';
7
- response.on('data', function (chunk) {
26
+ response.on('data', (chunk) => {
8
27
  data += chunk;
9
28
  });
10
- response.on('end', function () {
29
+ response.on('end', () => {
11
30
  if (response.statusCode === 200) {
12
31
  callback(null, data);
13
32
  } else {
@@ -15,9 +34,10 @@ function externalRequest(transport, options, callback) {
15
34
  }
16
35
  });
17
36
  });
18
- request.on('error', function (err) {
19
- callback(err);
37
+ request.setTimeout(REQUEST_TIMEOUT, () => {
38
+ request.abort();
20
39
  });
40
+ request.on('error', callback);
21
41
  }
22
42
 
23
43
  module.exports = externalRequest;