@jbrowse/core 1.7.11 → 2.1.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 (204) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +20 -4
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +313 -558
  3. package/BaseFeatureWidget/SequenceFeatureDetails.js +213 -473
  4. package/BaseFeatureWidget/index.d.ts +2 -2
  5. package/BaseFeatureWidget/index.js +88 -124
  6. package/BaseFeatureWidget/types.d.ts +1 -0
  7. package/BaseFeatureWidget/types.js +1 -4
  8. package/BaseFeatureWidget/util.js +40 -75
  9. package/CorePlugin.js +55 -94
  10. package/Plugin.js +9 -34
  11. package/PluginLoader.js +153 -422
  12. package/PluginManager.d.ts +84 -117
  13. package/PluginManager.js +377 -666
  14. package/ReExports/Attributes.d.ts +2 -0
  15. package/ReExports/Attributes.js +5 -0
  16. package/ReExports/BaseCard.d.ts +2 -0
  17. package/ReExports/BaseCard.js +5 -0
  18. package/ReExports/DataGrid.d.ts +2 -0
  19. package/ReExports/DataGrid.js +6 -0
  20. package/ReExports/FeatureDetails.d.ts +2 -0
  21. package/ReExports/FeatureDetails.js +5 -0
  22. package/ReExports/index.js +6 -12
  23. package/ReExports/list.d.ts +5 -0
  24. package/ReExports/list.js +271 -7
  25. package/ReExports/material-ui-colors.d.ts +1 -19
  26. package/ReExports/material-ui-colors.js +16 -158
  27. package/ReExports/modules.d.ts +68 -109
  28. package/ReExports/modules.js +455 -244
  29. package/TextSearch/BaseResults.js +51 -123
  30. package/TextSearch/TextSearchManager.d.ts +3 -1
  31. package/TextSearch/TextSearchManager.js +66 -144
  32. package/assemblyManager/assembly.js +280 -554
  33. package/assemblyManager/assemblyConfigSchema.js +47 -64
  34. package/assemblyManager/assemblyManager.d.ts +12 -10
  35. package/assemblyManager/assemblyManager.js +126 -270
  36. package/assemblyManager/index.js +9 -22
  37. package/configuration/configurationSchema.js +167 -203
  38. package/configuration/configurationSlot.js +248 -326
  39. package/configuration/index.js +19 -35
  40. package/configuration/util.d.ts +1 -1
  41. package/configuration/util.js +131 -173
  42. package/data_adapters/BaseAdapter.d.ts +2 -2
  43. package/data_adapters/BaseAdapter.js +132 -521
  44. package/data_adapters/CytobandAdapter.js +40 -126
  45. package/data_adapters/dataAdapterCache.js +77 -158
  46. package/package.json +16 -18
  47. package/pluggableElementTypes/AdapterType.js +24 -79
  48. package/pluggableElementTypes/AddTrackWorkflowType.d.ts +17 -0
  49. package/pluggableElementTypes/AddTrackWorkflowType.js +20 -0
  50. package/pluggableElementTypes/ConnectionType.js +22 -65
  51. package/pluggableElementTypes/DisplayType.js +35 -82
  52. package/pluggableElementTypes/InternetAccountType.js +23 -64
  53. package/pluggableElementTypes/PluggableElementBase.js +8 -20
  54. package/pluggableElementTypes/RpcMethodType.js +85 -427
  55. package/pluggableElementTypes/TextSearchAdapterType.js +16 -55
  56. package/pluggableElementTypes/TrackType.js +26 -70
  57. package/pluggableElementTypes/ViewType.js +21 -63
  58. package/pluggableElementTypes/WidgetType.js +21 -64
  59. package/pluggableElementTypes/index.d.ts +4 -3
  60. package/pluggableElementTypes/index.js +42 -125
  61. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +28 -43
  62. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +10 -10
  63. package/pluggableElementTypes/models/BaseDisplayModel.js +58 -95
  64. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
  65. package/pluggableElementTypes/models/BaseTrackModel.js +139 -200
  66. package/pluggableElementTypes/models/BaseViewModel.js +24 -40
  67. package/pluggableElementTypes/models/InternetAccountModel.js +116 -263
  68. package/pluggableElementTypes/models/baseConnectionConfig.js +14 -25
  69. package/pluggableElementTypes/models/baseInternetAccountConfig.js +29 -38
  70. package/pluggableElementTypes/models/baseTrackConfig.js +106 -133
  71. package/pluggableElementTypes/models/index.js +21 -70
  72. package/pluggableElementTypes/renderers/BoxRendererType.js +132 -291
  73. package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -38
  74. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +60 -192
  75. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -2
  76. package/pluggableElementTypes/renderers/FeatureRendererType.js +89 -255
  77. package/pluggableElementTypes/renderers/RendererType.js +31 -105
  78. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +61 -72
  79. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +2 -2
  80. package/pluggableElementTypes/renderers/ServerSideRendererType.js +112 -265
  81. package/pluggableElementTypes/renderers/index.js +19 -62
  82. package/pluggableElementTypes/renderers/util/serializableFilterChain.js +27 -65
  83. package/rpc/BaseRpcDriver.js +169 -405
  84. package/rpc/MainThreadRpcDriver.js +27 -150
  85. package/rpc/RpcManager.js +58 -159
  86. package/rpc/WebWorkerRpcDriver.js +54 -171
  87. package/rpc/configSchema.js +25 -49
  88. package/rpc/coreRpcMethods.d.ts +1 -3
  89. package/rpc/coreRpcMethods.js +221 -959
  90. package/rpc/remoteAbortSignals.js +46 -70
  91. package/tsconfig.build.tsbuildinfo +1 -1
  92. package/ui/AboutDialog.js +107 -158
  93. package/ui/App.js +157 -261
  94. package/ui/AssemblySelector.d.ts +1 -1
  95. package/ui/AssemblySelector.js +59 -115
  96. package/ui/CascadingMenu.js +100 -199
  97. package/ui/ColorPicker.d.ts +16 -0
  98. package/ui/ColorPicker.js +97 -0
  99. package/ui/Drawer.js +28 -58
  100. package/ui/DrawerWidget.js +109 -209
  101. package/ui/DropDownMenu.d.ts +0 -8
  102. package/ui/DropDownMenu.js +60 -97
  103. package/ui/EditableTypography.d.ts +1 -1
  104. package/ui/EditableTypography.js +87 -155
  105. package/ui/ErrorMessage.js +41 -66
  106. package/ui/FactoryResetDialog.js +24 -57
  107. package/ui/FatalErrorDialog.js +59 -91
  108. package/ui/FileSelector/FileSelector.js +123 -189
  109. package/ui/FileSelector/LocalFileChooser.js +44 -71
  110. package/ui/FileSelector/UrlChooser.js +17 -38
  111. package/ui/FileSelector/index.js +6 -12
  112. package/ui/Icons.d.ts +1 -1
  113. package/ui/Icons.js +45 -69
  114. package/ui/Logo.js +57 -110
  115. package/ui/Menu.d.ts +1 -1
  116. package/ui/Menu.js +232 -355
  117. package/ui/PrerenderedCanvas.js +63 -78
  118. package/ui/ResizeHandle.js +87 -114
  119. package/ui/ReturnToImportFormDialog.js +32 -59
  120. package/ui/SanitizedHTML.js +63 -52
  121. package/ui/Snackbar.js +74 -99
  122. package/ui/SnackbarModel.js +37 -51
  123. package/ui/Tooltip.d.ts +3 -1
  124. package/ui/Tooltip.js +49 -74
  125. package/ui/ViewContainer.js +113 -183
  126. package/ui/colors.d.ts +10 -0
  127. package/ui/colors.js +78 -0
  128. package/ui/index.js +51 -181
  129. package/ui/react-colorful.d.ts +17 -0
  130. package/ui/react-colorful.js +455 -0
  131. package/ui/theme.d.ts +279 -131
  132. package/ui/theme.js +197 -225
  133. package/util/Base1DUtils.d.ts +32 -0
  134. package/util/Base1DUtils.js +174 -0
  135. package/util/Base1DViewModel.d.ts +16 -37
  136. package/util/Base1DViewModel.js +116 -295
  137. package/util/QuickLRU.js +84 -332
  138. package/util/TimeTraveller.d.ts +19 -0
  139. package/util/TimeTraveller.js +86 -0
  140. package/util/aborting.js +49 -127
  141. package/util/analytics.js +91 -154
  142. package/util/blockTypes.js +106 -240
  143. package/util/calculateDynamicBlocks.js +98 -128
  144. package/util/calculateStaticBlocks.js +105 -125
  145. package/util/color/cssColorsLevel4.js +156 -160
  146. package/util/color/index.js +33 -55
  147. package/util/compositeMap.js +49 -333
  148. package/util/formatFastaStrings.js +9 -14
  149. package/util/idMaker.js +18 -31
  150. package/util/index.d.ts +18 -39
  151. package/util/index.js +743 -1236
  152. package/util/io/RemoteFileWithRangeCache.js +88 -257
  153. package/util/io/index.js +95 -169
  154. package/util/jexl.js +60 -115
  155. package/util/jexlStrings.js +24 -29
  156. package/util/layouts/BaseLayout.js +1 -4
  157. package/util/layouts/GranularRectLayout.js +388 -557
  158. package/util/layouts/MultiLayout.js +41 -109
  159. package/util/layouts/PrecomputedLayout.js +56 -114
  160. package/util/layouts/PrecomputedMultiLayout.js +22 -59
  161. package/util/layouts/SceneGraph.js +127 -197
  162. package/util/layouts/index.js +29 -66
  163. package/util/mst-reflection.js +55 -71
  164. package/util/offscreenCanvasPonyfill.js +66 -134
  165. package/util/offscreenCanvasUtils.d.ts +2 -7
  166. package/util/offscreenCanvasUtils.js +49 -146
  167. package/util/range.js +29 -40
  168. package/util/rxjs.js +20 -27
  169. package/util/simpleFeature.js +88 -152
  170. package/util/stats.js +91 -151
  171. package/util/tracks.js +130 -171
  172. package/util/types/index.d.ts +3 -3
  173. package/util/types/index.js +110 -179
  174. package/util/types/mst.d.ts +3 -3
  175. package/util/types/mst.js +91 -142
  176. package/util/types/util.js +1 -4
  177. package/util/when.js +54 -101
  178. package/BaseFeatureWidget/SequenceFeatureDetails.test.js +0 -122
  179. package/BaseFeatureWidget/index.test.js +0 -51
  180. package/TextSearch/BaseResults.test.js +0 -42
  181. package/configuration/configurationSchema.test.js +0 -266
  182. package/configuration/configurationSlot.test.js +0 -69
  183. package/configuration/util.test.js +0 -39
  184. package/data_adapters/BaseAdapter.test.js +0 -200
  185. package/declare.d.js +0 -1
  186. package/pluggableElementTypes/RpcMethodType.test.js +0 -118
  187. package/pluggableElementTypes/renderers/declare.d.js +0 -1
  188. package/pluggableElementTypes/renderers/util/serializableFilterChain.test.js +0 -20
  189. package/rpc/BaseRpcDriver.test.js +0 -540
  190. package/rpc/declaration.d.js +0 -1
  191. package/ui/FatalErrorDialog.test.js +0 -82
  192. package/ui/SanitizedHTML.test.js +0 -36
  193. package/ui/theme.test.js +0 -111
  194. package/util/Base1DViewModel.test.js +0 -130
  195. package/util/calculateDynamicBlocks.test.js +0 -74
  196. package/util/calculateStaticBlocks.test.js +0 -297
  197. package/util/declare.d.js +0 -1
  198. package/util/formatFastaStrings.test.js +0 -40
  199. package/util/index.test.js +0 -213
  200. package/util/jexlStrings.test.js +0 -48
  201. package/util/layouts/GranularRectLayout.test.js +0 -99
  202. package/util/range.test.js +0 -64
  203. package/util/simpleFeature.test.js +0 -34
  204. package/util/stats.test.js +0 -172
@@ -1,424 +1,188 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
- exports.watchWorker = watchWorker;
10
-
11
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
-
13
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14
-
15
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
16
-
17
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
18
-
19
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
20
-
21
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
22
-
23
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
24
-
25
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
26
-
27
- var _mobxStateTree = require("mobx-state-tree");
28
-
29
- var _util = require("../util");
30
-
31
- var _remoteAbortSignals = require("./remoteAbortSignals");
32
-
33
- var _configuration = require("../configuration");
34
-
35
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
36
-
37
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
38
-
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.watchWorker = void 0;
4
+ const mobx_state_tree_1 = require("mobx-state-tree");
5
+ const util_1 = require("../util");
6
+ const remoteAbortSignals_1 = require("./remoteAbortSignals");
7
+ const configuration_1 = require("../configuration");
39
8
  function isClonable(thing) {
40
- if (typeof thing === 'function') {
41
- return false;
42
- }
43
-
44
- if (thing instanceof Error) {
45
- return false;
46
- }
47
-
48
- return true;
49
- } // watches the given worker object, returns a promise that will be rejected if
50
- // the worker times out
51
-
52
-
53
- function watchWorker(_x, _x2, _x3) {
54
- return _watchWorker.apply(this, arguments);
9
+ if (typeof thing === 'function') {
10
+ return false;
11
+ }
12
+ if (thing instanceof Error) {
13
+ return false;
14
+ }
15
+ return true;
55
16
  }
56
-
57
- function _watchWorker() {
58
- _watchWorker = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(worker, pingTime, rpcDriverClassName) {
59
- return _regenerator.default.wrap(function _callee6$(_context6) {
60
- while (1) {
61
- switch (_context6.prev = _context6.next) {
62
- case 0:
63
- return _context6.abrupt("return", new Promise(function (_resolve, reject) {
64
- function delay() {
65
- setTimeout( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
66
- return _regenerator.default.wrap(function _callee5$(_context5) {
67
- while (1) {
68
- switch (_context5.prev = _context5.next) {
69
- case 0:
70
- _context5.prev = 0;
71
- _context5.next = 3;
72
- return worker.call('ping', [], {
73
- timeout: pingTime * 2,
74
- rpcDriverClassName: rpcDriverClassName
75
- });
76
-
77
- case 3:
78
- delay();
79
- _context5.next = 9;
80
- break;
81
-
82
- case 6:
83
- _context5.prev = 6;
84
- _context5.t0 = _context5["catch"](0);
85
- reject(_context5.t0);
86
-
87
- case 9:
88
- case "end":
89
- return _context5.stop();
90
- }
91
- }
92
- }, _callee5, null, [[0, 6]]);
93
- })), pingTime);
94
- }
95
-
96
- delay();
97
- }));
98
-
99
- case 1:
100
- case "end":
101
- return _context6.stop();
17
+ // watches the given worker object, returns a promise that will be rejected if
18
+ // the worker times out
19
+ async function watchWorker(worker, pingTime, rpcDriverClassName) {
20
+ // after first ping succeeds, apply wait for timeout
21
+ return new Promise((_resolve, reject) => {
22
+ function delay() {
23
+ setTimeout(async () => {
24
+ try {
25
+ await worker.call('ping', [], {
26
+ timeout: pingTime * 2,
27
+ rpcDriverClassName,
28
+ });
29
+ delay();
30
+ }
31
+ catch (e) {
32
+ reject(e);
33
+ }
34
+ }, pingTime);
102
35
  }
103
- }
104
- }, _callee6);
105
- }));
106
- return _watchWorker.apply(this, arguments);
36
+ delay();
37
+ });
107
38
  }
108
-
39
+ exports.watchWorker = watchWorker;
109
40
  function detectHardwareConcurrency() {
110
- var mainThread = typeof window !== 'undefined';
111
- var canDetect = mainThread && 'hardwareConcurrency' in window.navigator;
112
-
113
- if (mainThread && canDetect) {
114
- return window.navigator.hardwareConcurrency;
115
- }
116
-
117
- return 1;
41
+ const mainThread = typeof window !== 'undefined';
42
+ const canDetect = mainThread && 'hardwareConcurrency' in window.navigator;
43
+ if (mainThread && canDetect) {
44
+ return window.navigator.hardwareConcurrency;
45
+ }
46
+ return 1;
118
47
  }
119
-
120
- var LazyWorker = /*#__PURE__*/function () {
121
- function LazyWorker(driver) {
122
- (0, _classCallCheck2.default)(this, LazyWorker);
123
- this.driver = driver;
124
- (0, _defineProperty2.default)(this, "workerP", void 0);
125
- }
126
-
127
- (0, _createClass2.default)(LazyWorker, [{
128
- key: "getWorker",
129
- value: function () {
130
- var _getWorker = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
131
- var _this = this;
132
-
133
- return _regenerator.default.wrap(function _callee$(_context) {
134
- while (1) {
135
- switch (_context.prev = _context.next) {
136
- case 0:
137
- if (!this.workerP) {
138
- this.workerP = this.driver.makeWorker().then(function (worker) {
139
- watchWorker(worker, _this.driver.maxPingTime, _this.driver.name).catch(function (error) {
140
- if (worker) {
48
+ class LazyWorker {
49
+ constructor(driver) {
50
+ this.driver = driver;
51
+ }
52
+ async getWorker() {
53
+ if (!this.workerP) {
54
+ this.workerP = this.driver
55
+ .makeWorker()
56
+ .then(worker => {
57
+ watchWorker(worker, this.driver.maxPingTime, this.driver.name).catch(error => {
58
+ if (worker) {
141
59
  console.error('worker did not respond, killing and generating new one');
142
60
  console.error(error);
143
61
  worker.destroy();
144
62
  worker.status = 'killed';
145
63
  worker.error = error;
146
- _this.workerP = undefined;
147
- }
148
- });
149
- return worker;
150
- }).catch(function (e) {
151
- _this.workerP = undefined;
152
- throw e;
153
- });
154
- }
155
-
156
- return _context.abrupt("return", this.workerP);
157
-
158
- case 2:
159
- case "end":
160
- return _context.stop();
161
- }
162
- }
163
- }, _callee, this);
164
- }));
165
-
166
- function getWorker() {
167
- return _getWorker.apply(this, arguments);
168
- }
169
-
170
- return getWorker;
171
- }()
172
- }]);
173
- return LazyWorker;
174
- }();
175
-
176
- var BaseRpcDriver = /*#__PURE__*/function () {
177
- function BaseRpcDriver(args) {
178
- (0, _classCallCheck2.default)(this, BaseRpcDriver);
179
- (0, _defineProperty2.default)(this, "name", void 0);
180
- (0, _defineProperty2.default)(this, "lastWorkerAssignment", -1);
181
- (0, _defineProperty2.default)(this, "workerAssignments", new Map());
182
- (0, _defineProperty2.default)(this, "workerPool", void 0);
183
- (0, _defineProperty2.default)(this, "maxPingTime", 30000);
184
- (0, _defineProperty2.default)(this, "workerCheckFrequency", 5000);
185
- (0, _defineProperty2.default)(this, "config", void 0);
186
- this.config = args.config;
187
- } // filter the given object and just remove any non-clonable things from it
188
-
189
-
190
- (0, _createClass2.default)(BaseRpcDriver, [{
191
- key: "filterArgs",
192
- value: function filterArgs(thing, sessionId) {
193
- var _this2 = this;
194
-
195
- if (Array.isArray(thing)) {
196
- return thing.filter(isClonable).map(function (t) {
197
- return _this2.filterArgs(t, sessionId);
198
- });
199
- }
200
-
201
- if ((0, _typeof2.default)(thing) === 'object' && thing !== null) {
202
- // AbortSignals are specially handled
203
- if (thing instanceof AbortSignal) {
204
- return (0, _remoteAbortSignals.serializeAbortSignal)(thing, this.remoteAbort.bind(this, sessionId));
205
- }
206
-
207
- if ((0, _mobxStateTree.isStateTreeNode)(thing) && !(0, _mobxStateTree.isAlive)(thing)) {
208
- throw new Error('dead state tree node passed to RPC call');
209
- } // special case, don't try to iterate the file's subelements as the
210
- // object entries below would
211
-
212
-
213
- if (thing instanceof File) {
214
- return thing;
64
+ this.workerP = undefined;
65
+ }
66
+ });
67
+ return worker;
68
+ })
69
+ .catch(e => {
70
+ this.workerP = undefined;
71
+ throw e;
72
+ });
215
73
  }
216
-
217
- return (0, _util.objectFromEntries)(Object.entries(thing).filter(function (e) {
218
- return isClonable(e[1]);
219
- }).map(function (_ref) {
220
- var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
221
- k = _ref2[0],
222
- v = _ref2[1];
223
-
224
- return [k, _this2.filterArgs(v, sessionId)];
225
- }));
226
- }
227
-
228
- return thing;
74
+ return this.workerP;
229
75
  }
230
- }, {
231
- key: "remoteAbort",
232
- value: function () {
233
- var _remoteAbort = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(sessionId, functionName, signalId) {
234
- var worker;
235
- return _regenerator.default.wrap(function _callee2$(_context2) {
236
- while (1) {
237
- switch (_context2.prev = _context2.next) {
238
- case 0:
239
- _context2.next = 2;
240
- return this.getWorker(sessionId);
241
-
242
- case 2:
243
- worker = _context2.sent;
244
- worker.call(functionName, {
245
- signalId: signalId
246
- }, {
247
- timeout: 1000000,
248
- rpcDriverClassName: this.name
249
- });
250
-
251
- case 4:
252
- case "end":
253
- return _context2.stop();
76
+ }
77
+ class BaseRpcDriver {
78
+ constructor(args) {
79
+ this.lastWorkerAssignment = -1;
80
+ this.workerAssignments = new Map(); // sessionId -> worker number
81
+ this.maxPingTime = 30000;
82
+ this.workerCheckFrequency = 5000;
83
+ this.config = args.config;
84
+ }
85
+ // filter the given object and just remove any non-clonable things from it
86
+ filterArgs(thing, sessionId) {
87
+ if (Array.isArray(thing)) {
88
+ return thing
89
+ .filter(isClonable)
90
+ .map(t => this.filterArgs(t, sessionId));
91
+ }
92
+ if (typeof thing === 'object' && thing !== null) {
93
+ // AbortSignals are specially handled
94
+ if (thing instanceof AbortSignal) {
95
+ return (0, remoteAbortSignals_1.serializeAbortSignal)(thing, this.remoteAbort.bind(this, sessionId));
96
+ }
97
+ if ((0, mobx_state_tree_1.isStateTreeNode)(thing) && !(0, mobx_state_tree_1.isAlive)(thing)) {
98
+ throw new Error('dead state tree node passed to RPC call');
99
+ }
100
+ // special case, don't try to iterate the file's subelements as the
101
+ // object entries below would
102
+ if (thing instanceof File) {
103
+ return thing;
254
104
  }
255
- }
256
- }, _callee2, this);
257
- }));
258
-
259
- function remoteAbort(_x4, _x5, _x6) {
260
- return _remoteAbort.apply(this, arguments);
261
- }
262
-
263
- return remoteAbort;
264
- }()
265
- }, {
266
- key: "createWorkerPool",
267
- value: function createWorkerPool() {
268
- var _this3 = this;
269
-
270
- var hardwareConcurrency = detectHardwareConcurrency();
271
- var workerCount = (0, _configuration.readConfObject)(this.config, 'workerCount') || (0, _util.clamp)(1, Math.max(1, hardwareConcurrency - 1), 5);
272
- return (0, _toConsumableArray2.default)(new Array(workerCount)).map(function () {
273
- return new LazyWorker(_this3);
274
- });
105
+ return Object.fromEntries(Object.entries(thing)
106
+ .filter(e => isClonable(e[1]))
107
+ .map(([k, v]) => [k, this.filterArgs(v, sessionId)]));
108
+ }
109
+ return thing;
110
+ }
111
+ async remoteAbort(sessionId, functionName, signalId) {
112
+ const worker = await this.getWorker(sessionId);
113
+ worker.call(functionName, { signalId }, { timeout: 1000000, rpcDriverClassName: this.name });
114
+ }
115
+ createWorkerPool() {
116
+ const hardwareConcurrency = detectHardwareConcurrency();
117
+ const workerCount = (0, configuration_1.readConfObject)(this.config, 'workerCount') ||
118
+ (0, util_1.clamp)(1, Math.max(1, hardwareConcurrency - 1), 5);
119
+ return [...new Array(workerCount)].map(() => new LazyWorker(this));
120
+ }
121
+ getWorkerPool() {
122
+ if (!this.workerPool) {
123
+ const res = this.createWorkerPool();
124
+ this.workerPool = res;
125
+ return res; // making this several steps makes TS happy
126
+ }
127
+ return this.workerPool;
275
128
  }
276
- }, {
277
- key: "getWorkerPool",
278
- value: function getWorkerPool() {
279
- if (!this.workerPool) {
280
- var res = this.createWorkerPool();
281
- this.workerPool = res;
282
- return res; // making this several steps makes TS happy
283
- }
284
-
285
- return this.workerPool;
129
+ async getWorker(sessionId) {
130
+ const workers = this.getWorkerPool();
131
+ let workerNumber = this.workerAssignments.get(sessionId);
132
+ if (workerNumber === undefined) {
133
+ const workerAssignment = (this.lastWorkerAssignment + 1) % workers.length;
134
+ this.workerAssignments.set(sessionId, workerAssignment);
135
+ this.lastWorkerAssignment = workerAssignment;
136
+ workerNumber = workerAssignment;
137
+ }
138
+ // console.log(`${sessionId} -> worker ${workerNumber}`)
139
+ const worker = workers[workerNumber].getWorker();
140
+ if (!worker) {
141
+ throw new Error('no web workers registered for RPC');
142
+ }
143
+ return worker;
286
144
  }
287
- }, {
288
- key: "getWorker",
289
- value: function () {
290
- var _getWorker2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(sessionId) {
291
- var workers, workerNumber, workerAssignment, worker;
292
- return _regenerator.default.wrap(function _callee3$(_context3) {
293
- while (1) {
294
- switch (_context3.prev = _context3.next) {
295
- case 0:
296
- workers = this.getWorkerPool();
297
- workerNumber = this.workerAssignments.get(sessionId);
298
-
299
- if (workerNumber === undefined) {
300
- workerAssignment = (this.lastWorkerAssignment + 1) % workers.length;
301
- this.workerAssignments.set(sessionId, workerAssignment);
302
- this.lastWorkerAssignment = workerAssignment;
303
- workerNumber = workerAssignment;
304
- } // console.log(`${sessionId} -> worker ${workerNumber}`)
305
-
306
-
307
- worker = workers[workerNumber].getWorker();
308
-
309
- if (worker) {
310
- _context3.next = 6;
311
- break;
145
+ async call(pluginManager, sessionId, functionName, args, options = {}) {
146
+ if (!sessionId) {
147
+ throw new TypeError('sessionId is required');
148
+ }
149
+ let done = false;
150
+ const worker = await this.getWorker(sessionId);
151
+ const rpcMethod = pluginManager.getRpcMethodType(functionName);
152
+ const serializedArgs = await rpcMethod.serializeArguments(args, this.name);
153
+ const filteredAndSerializedArgs = this.filterArgs(serializedArgs, sessionId);
154
+ // now actually call the worker
155
+ const callP = worker
156
+ .call(functionName, filteredAndSerializedArgs, {
157
+ timeout: 5 * 60 * 1000,
158
+ statusCallback: args.statusCallback,
159
+ rpcDriverClassName: this.name,
160
+ ...options,
161
+ })
162
+ .finally(() => {
163
+ done = true;
164
+ });
165
+ // check every 5 seconds to see if the worker has been killed, and
166
+ // reject the killedP promise if it has
167
+ let killedCheckInterval;
168
+ const killedP = new Promise((resolve, reject) => {
169
+ killedCheckInterval = setInterval(() => {
170
+ // must've been killed
171
+ if (worker.status === 'killed') {
172
+ reject(new Error(`operation timed out, worker process stopped responding, ${worker.error}`));
312
173
  }
313
-
314
- throw new Error('no web workers registered for RPC');
315
-
316
- case 6:
317
- return _context3.abrupt("return", worker);
318
-
319
- case 7:
320
- case "end":
321
- return _context3.stop();
322
- }
323
- }
324
- }, _callee3, this);
325
- }));
326
-
327
- function getWorker(_x7) {
328
- return _getWorker2.apply(this, arguments);
329
- }
330
-
331
- return getWorker;
332
- }()
333
- }, {
334
- key: "call",
335
- value: function () {
336
- var _call = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(pluginManager, sessionId, functionName, args) {
337
- var _this4 = this;
338
-
339
- var options,
340
- done,
341
- worker,
342
- rpcMethod,
343
- serializedArgs,
344
- filteredAndSerializedArgs,
345
- callP,
346
- killedCheckInterval,
347
- killedP,
348
- resultP,
349
- _args4 = arguments;
350
- return _regenerator.default.wrap(function _callee4$(_context4) {
351
- while (1) {
352
- switch (_context4.prev = _context4.next) {
353
- case 0:
354
- options = _args4.length > 4 && _args4[4] !== undefined ? _args4[4] : {};
355
-
356
- if (sessionId) {
357
- _context4.next = 3;
358
- break;
174
+ else if (done) {
175
+ resolve(true);
359
176
  }
360
-
361
- throw new TypeError('sessionId is required');
362
-
363
- case 3:
364
- done = false;
365
- _context4.next = 6;
366
- return this.getWorker(sessionId);
367
-
368
- case 6:
369
- worker = _context4.sent;
370
- rpcMethod = pluginManager.getRpcMethodType(functionName);
371
- _context4.next = 10;
372
- return rpcMethod.serializeArguments(args, this.name);
373
-
374
- case 10:
375
- serializedArgs = _context4.sent;
376
- filteredAndSerializedArgs = this.filterArgs(serializedArgs, sessionId); // now actually call the worker
377
-
378
- callP = worker.call(functionName, filteredAndSerializedArgs, _objectSpread({
379
- timeout: 5 * 60 * 1000,
380
- // 5 minutes
381
- statusCallback: args.statusCallback,
382
- rpcDriverClassName: this.name
383
- }, options)).finally(function () {
384
- done = true;
385
- }); // check every 5 seconds to see if the worker has been killed, and
386
- // reject the killedP promise if it has
387
-
388
- killedP = new Promise(function (resolve, reject) {
389
- killedCheckInterval = setInterval(function () {
390
- // must've been killed
391
- if (worker.status === 'killed') {
392
- reject(new Error("operation timed out, worker process stopped responding, ".concat(worker.error)));
393
- } else if (done) {
394
- resolve(true);
395
- }
396
- }, _this4.workerCheckFrequency);
397
- }).finally(function () {
398
- clearInterval(killedCheckInterval);
399
- }); // the result is a race between the actual result promise, and the "killed"
400
- // promise. the killed promise will only actually win if the worker was
401
- // killed before the call could return
402
-
403
- resultP = Promise.race([callP, killedP]);
404
- return _context4.abrupt("return", rpcMethod.deserializeReturn(resultP, args, this.name));
405
-
406
- case 16:
407
- case "end":
408
- return _context4.stop();
409
- }
410
- }
411
- }, _callee4, this);
412
- }));
413
-
414
- function call(_x8, _x9, _x10, _x11) {
415
- return _call.apply(this, arguments);
416
- }
417
-
418
- return call;
419
- }()
420
- }]);
421
- return BaseRpcDriver;
422
- }();
423
-
424
- exports.default = BaseRpcDriver;
177
+ }, this.workerCheckFrequency);
178
+ }).finally(() => {
179
+ clearInterval(killedCheckInterval);
180
+ });
181
+ // the result is a race between the actual result promise, and the "killed"
182
+ // promise. the killed promise will only actually win if the worker was
183
+ // killed before the call could return
184
+ const resultP = Promise.race([callP, killedP]);
185
+ return rpcMethod.deserializeReturn(resultP, args, this.name);
186
+ }
187
+ }
188
+ exports.default = BaseRpcDriver;