@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.
- package/BaseFeatureWidget/BaseFeatureDetail.d.ts +20 -4
- package/BaseFeatureWidget/BaseFeatureDetail.js +313 -558
- package/BaseFeatureWidget/SequenceFeatureDetails.js +213 -473
- package/BaseFeatureWidget/index.d.ts +2 -2
- package/BaseFeatureWidget/index.js +88 -124
- package/BaseFeatureWidget/types.d.ts +1 -0
- package/BaseFeatureWidget/types.js +1 -4
- package/BaseFeatureWidget/util.js +40 -75
- package/CorePlugin.js +55 -94
- package/Plugin.js +9 -34
- package/PluginLoader.js +153 -422
- package/PluginManager.d.ts +84 -117
- package/PluginManager.js +377 -666
- package/ReExports/Attributes.d.ts +2 -0
- package/ReExports/Attributes.js +5 -0
- package/ReExports/BaseCard.d.ts +2 -0
- package/ReExports/BaseCard.js +5 -0
- package/ReExports/DataGrid.d.ts +2 -0
- package/ReExports/DataGrid.js +6 -0
- package/ReExports/FeatureDetails.d.ts +2 -0
- package/ReExports/FeatureDetails.js +5 -0
- package/ReExports/index.js +6 -12
- package/ReExports/list.d.ts +5 -0
- package/ReExports/list.js +271 -7
- package/ReExports/material-ui-colors.d.ts +1 -19
- package/ReExports/material-ui-colors.js +16 -158
- package/ReExports/modules.d.ts +68 -109
- package/ReExports/modules.js +455 -244
- package/TextSearch/BaseResults.js +51 -123
- package/TextSearch/TextSearchManager.d.ts +3 -1
- package/TextSearch/TextSearchManager.js +66 -144
- package/assemblyManager/assembly.js +280 -554
- package/assemblyManager/assemblyConfigSchema.js +47 -64
- package/assemblyManager/assemblyManager.d.ts +12 -10
- package/assemblyManager/assemblyManager.js +126 -270
- package/assemblyManager/index.js +9 -22
- package/configuration/configurationSchema.js +167 -203
- package/configuration/configurationSlot.js +248 -326
- package/configuration/index.js +19 -35
- package/configuration/util.d.ts +1 -1
- package/configuration/util.js +131 -173
- package/data_adapters/BaseAdapter.d.ts +2 -2
- package/data_adapters/BaseAdapter.js +132 -521
- package/data_adapters/CytobandAdapter.js +40 -126
- package/data_adapters/dataAdapterCache.js +77 -158
- package/package.json +16 -18
- package/pluggableElementTypes/AdapterType.js +24 -79
- package/pluggableElementTypes/AddTrackWorkflowType.d.ts +17 -0
- package/pluggableElementTypes/AddTrackWorkflowType.js +20 -0
- package/pluggableElementTypes/ConnectionType.js +22 -65
- package/pluggableElementTypes/DisplayType.js +35 -82
- package/pluggableElementTypes/InternetAccountType.js +23 -64
- package/pluggableElementTypes/PluggableElementBase.js +8 -20
- package/pluggableElementTypes/RpcMethodType.js +85 -427
- package/pluggableElementTypes/TextSearchAdapterType.js +16 -55
- package/pluggableElementTypes/TrackType.js +26 -70
- package/pluggableElementTypes/ViewType.js +21 -63
- package/pluggableElementTypes/WidgetType.js +21 -64
- package/pluggableElementTypes/index.d.ts +4 -3
- package/pluggableElementTypes/index.js +42 -125
- package/pluggableElementTypes/models/BaseConnectionModelFactory.js +28 -43
- package/pluggableElementTypes/models/BaseDisplayModel.d.ts +10 -10
- package/pluggableElementTypes/models/BaseDisplayModel.js +58 -95
- package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
- package/pluggableElementTypes/models/BaseTrackModel.js +139 -200
- package/pluggableElementTypes/models/BaseViewModel.js +24 -40
- package/pluggableElementTypes/models/InternetAccountModel.js +116 -263
- package/pluggableElementTypes/models/baseConnectionConfig.js +14 -25
- package/pluggableElementTypes/models/baseInternetAccountConfig.js +29 -38
- package/pluggableElementTypes/models/baseTrackConfig.js +106 -133
- package/pluggableElementTypes/models/index.js +21 -70
- package/pluggableElementTypes/renderers/BoxRendererType.js +132 -291
- package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -38
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +60 -192
- package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -2
- package/pluggableElementTypes/renderers/FeatureRendererType.js +89 -255
- package/pluggableElementTypes/renderers/RendererType.js +31 -105
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +61 -72
- package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +2 -2
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +112 -265
- package/pluggableElementTypes/renderers/index.js +19 -62
- package/pluggableElementTypes/renderers/util/serializableFilterChain.js +27 -65
- package/rpc/BaseRpcDriver.js +169 -405
- package/rpc/MainThreadRpcDriver.js +27 -150
- package/rpc/RpcManager.js +58 -159
- package/rpc/WebWorkerRpcDriver.js +54 -171
- package/rpc/configSchema.js +25 -49
- package/rpc/coreRpcMethods.d.ts +1 -3
- package/rpc/coreRpcMethods.js +221 -959
- package/rpc/remoteAbortSignals.js +46 -70
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/AboutDialog.js +107 -158
- package/ui/App.js +157 -261
- package/ui/AssemblySelector.d.ts +1 -1
- package/ui/AssemblySelector.js +59 -115
- package/ui/CascadingMenu.js +100 -199
- package/ui/ColorPicker.d.ts +16 -0
- package/ui/ColorPicker.js +97 -0
- package/ui/Drawer.js +28 -58
- package/ui/DrawerWidget.js +109 -209
- package/ui/DropDownMenu.d.ts +0 -8
- package/ui/DropDownMenu.js +60 -97
- package/ui/EditableTypography.d.ts +1 -1
- package/ui/EditableTypography.js +87 -155
- package/ui/ErrorMessage.js +41 -66
- package/ui/FactoryResetDialog.js +24 -57
- package/ui/FatalErrorDialog.js +59 -91
- package/ui/FileSelector/FileSelector.js +123 -189
- package/ui/FileSelector/LocalFileChooser.js +44 -71
- package/ui/FileSelector/UrlChooser.js +17 -38
- package/ui/FileSelector/index.js +6 -12
- package/ui/Icons.d.ts +1 -1
- package/ui/Icons.js +45 -69
- package/ui/Logo.js +57 -110
- package/ui/Menu.d.ts +1 -1
- package/ui/Menu.js +232 -355
- package/ui/PrerenderedCanvas.js +63 -78
- package/ui/ResizeHandle.js +87 -114
- package/ui/ReturnToImportFormDialog.js +32 -59
- package/ui/SanitizedHTML.js +63 -52
- package/ui/Snackbar.js +74 -99
- package/ui/SnackbarModel.js +37 -51
- package/ui/Tooltip.d.ts +3 -1
- package/ui/Tooltip.js +49 -74
- package/ui/ViewContainer.js +113 -183
- package/ui/colors.d.ts +10 -0
- package/ui/colors.js +78 -0
- package/ui/index.js +51 -181
- package/ui/react-colorful.d.ts +17 -0
- package/ui/react-colorful.js +455 -0
- package/ui/theme.d.ts +279 -131
- package/ui/theme.js +197 -225
- package/util/Base1DUtils.d.ts +32 -0
- package/util/Base1DUtils.js +174 -0
- package/util/Base1DViewModel.d.ts +16 -37
- package/util/Base1DViewModel.js +116 -295
- package/util/QuickLRU.js +84 -332
- package/util/TimeTraveller.d.ts +19 -0
- package/util/TimeTraveller.js +86 -0
- package/util/aborting.js +49 -127
- package/util/analytics.js +91 -154
- package/util/blockTypes.js +106 -240
- package/util/calculateDynamicBlocks.js +98 -128
- package/util/calculateStaticBlocks.js +105 -125
- package/util/color/cssColorsLevel4.js +156 -160
- package/util/color/index.js +33 -55
- package/util/compositeMap.js +49 -333
- package/util/formatFastaStrings.js +9 -14
- package/util/idMaker.js +18 -31
- package/util/index.d.ts +18 -39
- package/util/index.js +743 -1236
- package/util/io/RemoteFileWithRangeCache.js +88 -257
- package/util/io/index.js +95 -169
- package/util/jexl.js +60 -115
- package/util/jexlStrings.js +24 -29
- package/util/layouts/BaseLayout.js +1 -4
- package/util/layouts/GranularRectLayout.js +388 -557
- package/util/layouts/MultiLayout.js +41 -109
- package/util/layouts/PrecomputedLayout.js +56 -114
- package/util/layouts/PrecomputedMultiLayout.js +22 -59
- package/util/layouts/SceneGraph.js +127 -197
- package/util/layouts/index.js +29 -66
- package/util/mst-reflection.js +55 -71
- package/util/offscreenCanvasPonyfill.js +66 -134
- package/util/offscreenCanvasUtils.d.ts +2 -7
- package/util/offscreenCanvasUtils.js +49 -146
- package/util/range.js +29 -40
- package/util/rxjs.js +20 -27
- package/util/simpleFeature.js +88 -152
- package/util/stats.js +91 -151
- package/util/tracks.js +130 -171
- package/util/types/index.d.ts +3 -3
- package/util/types/index.js +110 -179
- package/util/types/mst.d.ts +3 -3
- package/util/types/mst.js +91 -142
- package/util/types/util.js +1 -4
- package/util/when.js +54 -101
- package/BaseFeatureWidget/SequenceFeatureDetails.test.js +0 -122
- package/BaseFeatureWidget/index.test.js +0 -51
- package/TextSearch/BaseResults.test.js +0 -42
- package/configuration/configurationSchema.test.js +0 -266
- package/configuration/configurationSlot.test.js +0 -69
- package/configuration/util.test.js +0 -39
- package/data_adapters/BaseAdapter.test.js +0 -200
- package/declare.d.js +0 -1
- package/pluggableElementTypes/RpcMethodType.test.js +0 -118
- package/pluggableElementTypes/renderers/declare.d.js +0 -1
- package/pluggableElementTypes/renderers/util/serializableFilterChain.test.js +0 -20
- package/rpc/BaseRpcDriver.test.js +0 -540
- package/rpc/declaration.d.js +0 -1
- package/ui/FatalErrorDialog.test.js +0 -82
- package/ui/SanitizedHTML.test.js +0 -36
- package/ui/theme.test.js +0 -111
- package/util/Base1DViewModel.test.js +0 -130
- package/util/calculateDynamicBlocks.test.js +0 -74
- package/util/calculateStaticBlocks.test.js +0 -297
- package/util/declare.d.js +0 -1
- package/util/formatFastaStrings.test.js +0 -40
- package/util/index.test.js +0 -213
- package/util/jexlStrings.test.js +0 -48
- package/util/layouts/GranularRectLayout.test.js +0 -99
- package/util/range.test.js +0 -64
- package/util/simpleFeature.test.js +0 -34
- package/util/stats.test.js +0 -172
package/util/aborting.js
CHANGED
|
@@ -1,63 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
});
|
|
8
|
-
exports.abortBreakPoint = abortBreakPoint;
|
|
9
|
-
exports.checkAbortSignal = checkAbortSignal;
|
|
10
|
-
exports.isAbortException = isAbortException;
|
|
11
|
-
exports.makeAbortError = makeAbortError;
|
|
12
|
-
exports.observeAbortSignal = observeAbortSignal;
|
|
13
|
-
|
|
14
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
15
|
-
|
|
16
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
17
|
-
|
|
18
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
19
|
-
|
|
20
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
21
|
-
|
|
22
|
-
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
23
|
-
|
|
24
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
25
|
-
|
|
26
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
27
|
-
|
|
28
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
29
|
-
|
|
30
|
-
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
|
|
31
|
-
|
|
32
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
33
|
-
|
|
34
|
-
var _rxjs = require("rxjs");
|
|
35
|
-
|
|
36
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
37
|
-
|
|
38
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
39
|
-
|
|
40
|
-
var AbortError = /*#__PURE__*/function (_Error) {
|
|
41
|
-
(0, _inherits2.default)(AbortError, _Error);
|
|
42
|
-
|
|
43
|
-
var _super = _createSuper(AbortError);
|
|
44
|
-
|
|
45
|
-
function AbortError() {
|
|
46
|
-
var _this;
|
|
47
|
-
|
|
48
|
-
(0, _classCallCheck2.default)(this, AbortError);
|
|
49
|
-
|
|
50
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
51
|
-
args[_key] = arguments[_key];
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
_this = _super.call.apply(_super, [this].concat(args));
|
|
55
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "code", void 0);
|
|
56
|
-
return _this;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return (0, _createClass2.default)(AbortError);
|
|
60
|
-
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isAbortException = exports.observeAbortSignal = exports.makeAbortError = exports.abortBreakPoint = exports.checkAbortSignal = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
class AbortError extends Error {
|
|
6
|
+
}
|
|
61
7
|
/**
|
|
62
8
|
* properly check if the given AbortSignal is aborted.
|
|
63
9
|
* per the standard, if the signal reads as aborted,
|
|
@@ -69,90 +15,66 @@ var AbortError = /*#__PURE__*/function (_Error) {
|
|
|
69
15
|
* @param signal -
|
|
70
16
|
* @returns nothing
|
|
71
17
|
*/
|
|
72
|
-
|
|
73
|
-
|
|
74
18
|
function checkAbortSignal(signal) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
throw makeAbortError();
|
|
85
|
-
}
|
|
19
|
+
if (!signal) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!(signal instanceof AbortSignal)) {
|
|
23
|
+
throw new TypeError('must pass an AbortSignal');
|
|
24
|
+
}
|
|
25
|
+
if (signal.aborted) {
|
|
26
|
+
throw makeAbortError();
|
|
27
|
+
}
|
|
86
28
|
}
|
|
87
|
-
|
|
29
|
+
exports.checkAbortSignal = checkAbortSignal;
|
|
88
30
|
function timeout(ms) {
|
|
89
|
-
|
|
90
|
-
return setTimeout(resolve, ms);
|
|
91
|
-
});
|
|
31
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
92
32
|
}
|
|
93
33
|
/**
|
|
94
34
|
* Skips to the next tick, then runs `checkAbortSignal`.
|
|
95
35
|
* Await this to inside an otherwise synchronous loop to
|
|
96
36
|
* provide a place to break when an abort signal is received.
|
|
97
37
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
_abortBreakPoint = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(signal) {
|
|
106
|
-
return _regenerator.default.wrap(function _callee$(_context) {
|
|
107
|
-
while (1) {
|
|
108
|
-
switch (_context.prev = _context.next) {
|
|
109
|
-
case 0:
|
|
110
|
-
_context.next = 2;
|
|
111
|
-
return timeout(1);
|
|
112
|
-
|
|
113
|
-
case 2:
|
|
114
|
-
checkAbortSignal(signal);
|
|
115
|
-
|
|
116
|
-
case 3:
|
|
117
|
-
case "end":
|
|
118
|
-
return _context.stop();
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}, _callee);
|
|
122
|
-
}));
|
|
123
|
-
return _abortBreakPoint.apply(this, arguments);
|
|
38
|
+
async function abortBreakPoint(signal) {
|
|
39
|
+
// it was observed that an actual timeout is needed to get the aborting (wrap
|
|
40
|
+
// hicrenderer in a try catch, console.error the error, and rethrow the error
|
|
41
|
+
// to see). using await Promise.resolve() did not appear to allow aborting to
|
|
42
|
+
// occur
|
|
43
|
+
await timeout(1);
|
|
44
|
+
checkAbortSignal(signal);
|
|
124
45
|
}
|
|
125
|
-
|
|
46
|
+
exports.abortBreakPoint = abortBreakPoint;
|
|
126
47
|
function makeAbortError() {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return e;
|
|
48
|
+
if (typeof DOMException !== 'undefined') {
|
|
49
|
+
return new DOMException('aborted', 'AbortError');
|
|
50
|
+
}
|
|
51
|
+
const e = new AbortError('aborted');
|
|
52
|
+
e.code = 'ERR_ABORTED';
|
|
53
|
+
return e;
|
|
134
54
|
}
|
|
135
|
-
|
|
55
|
+
exports.makeAbortError = makeAbortError;
|
|
136
56
|
function observeAbortSignal(signal) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
return (0, _rxjs.fromEvent)(signal, 'abort');
|
|
57
|
+
if (!signal) {
|
|
58
|
+
return rxjs_1.Observable.create();
|
|
59
|
+
}
|
|
60
|
+
return (0, rxjs_1.fromEvent)(signal, 'abort');
|
|
142
61
|
}
|
|
62
|
+
exports.observeAbortSignal = observeAbortSignal;
|
|
143
63
|
/**
|
|
144
64
|
* check if the given exception was caused by an operation being intentionally aborted
|
|
145
65
|
* @param exception -
|
|
146
66
|
*/
|
|
147
|
-
|
|
148
|
-
|
|
149
67
|
function isAbortException(exception) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
68
|
+
return (exception instanceof Error &&
|
|
69
|
+
// DOMException
|
|
70
|
+
(exception.name === 'AbortError' ||
|
|
71
|
+
// standard-ish non-DOM abort exception
|
|
72
|
+
exception.code === 'ERR_ABORTED' ||
|
|
73
|
+
// message contains aborted for bubbling through RPC
|
|
74
|
+
// things we have seen that we want to catch here
|
|
75
|
+
// Error: aborted
|
|
76
|
+
// AbortError: aborted
|
|
77
|
+
// AbortError: The user aborted a request.
|
|
78
|
+
!!exception.message.match(/\b(aborted|AbortError)\b/i)));
|
|
79
|
+
}
|
|
80
|
+
exports.isAbortException = isAbortException;
|
package/util/analytics.js
CHANGED
|
@@ -1,159 +1,96 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.doAnalytics = doAnalytics;
|
|
9
|
-
exports.writeAWSAnalytics = writeAWSAnalytics;
|
|
10
|
-
exports.writeGAAnalytics = writeGAAnalytics;
|
|
11
|
-
|
|
12
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
13
|
-
|
|
14
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
|
-
|
|
16
|
-
var _configuration = require("../configuration");
|
|
17
|
-
|
|
18
|
-
var _util = require("../util");
|
|
19
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.doAnalytics = exports.writeGAAnalytics = exports.writeAWSAnalytics = void 0;
|
|
20
4
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
session === null || session === void 0 ? void 0 : session.sessionTracks.forEach(function (track) {
|
|
74
|
-
var key = "sessionTrack-types-".concat(track.type);
|
|
75
|
-
stats[key] = stats[key] + 1 || 1;
|
|
76
|
-
}); // put stats into a query string for get request
|
|
77
|
-
|
|
78
|
-
qs = Object.keys(stats).map(function (key) {
|
|
79
|
-
return "".concat(key, "=").concat(stats[key]);
|
|
80
|
-
}).join('&');
|
|
81
|
-
_context.next = 12;
|
|
82
|
-
return fetch("".concat(url, "?").concat(qs));
|
|
83
|
-
|
|
84
|
-
case 12:
|
|
85
|
-
_context.next = 17;
|
|
86
|
-
break;
|
|
87
|
-
|
|
88
|
-
case 14:
|
|
89
|
-
_context.prev = 14;
|
|
90
|
-
_context.t0 = _context["catch"](0);
|
|
91
|
-
console.error('Failed to write analytics to AWS.', _context.t0);
|
|
92
|
-
|
|
93
|
-
case 17:
|
|
94
|
-
case "end":
|
|
95
|
-
return _context.stop();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}, _callee, null, [[0, 14]]);
|
|
99
|
-
}));
|
|
100
|
-
return _writeAWSAnalytics.apply(this, arguments);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function writeGAAnalytics(_x4, _x5) {
|
|
104
|
-
return _writeGAAnalytics.apply(this, arguments);
|
|
5
|
+
const configuration_1 = require("../configuration");
|
|
6
|
+
const util_1 = require("../util");
|
|
7
|
+
async function writeAWSAnalytics(rootModel, initialTimeStamp, sessionQuery) {
|
|
8
|
+
try {
|
|
9
|
+
const url = 'https://analytics.jbrowse.org/api/v1';
|
|
10
|
+
const multiAssemblyTracks = rootModel.jbrowse.tracks.filter((track) => ((0, configuration_1.readConfObject)(track, 'assemblyNames') || []).length > 1).length;
|
|
11
|
+
const savedSessionCount = Object.keys(localStorage).filter(name => name.includes('localSaved-')).length;
|
|
12
|
+
const { jbrowse: config, session, version: ver } = rootModel;
|
|
13
|
+
const { tracks, assemblies, plugins } = config;
|
|
14
|
+
// stats to be recorded in db
|
|
15
|
+
const stats = {
|
|
16
|
+
ver,
|
|
17
|
+
'plugins-count': (plugins === null || plugins === void 0 ? void 0 : plugins.length) || 0,
|
|
18
|
+
'plugin-names': plugins === null || plugins === void 0 ? void 0 : plugins.map((p) => p.name).join(','),
|
|
19
|
+
'assemblies-count': assemblies.length,
|
|
20
|
+
'tracks-count': tracks.length,
|
|
21
|
+
'session-tracks-count': (session === null || session === void 0 ? void 0 : session.sessionTracks.length) || 0,
|
|
22
|
+
'open-views': (session === null || session === void 0 ? void 0 : session.views.length) || 0,
|
|
23
|
+
'synteny-tracks-count': multiAssemblyTracks,
|
|
24
|
+
'saved-sessions-count': savedSessionCount,
|
|
25
|
+
// field if existing session param in query before autogenerated param
|
|
26
|
+
'existing-session-param-type': (sessionQuery === null || sessionQuery === void 0 ? void 0 : sessionQuery.split('-')[0]) || 'none',
|
|
27
|
+
// screen geometry
|
|
28
|
+
'scn-h': window.screen.height,
|
|
29
|
+
'scn-w': window.screen.width,
|
|
30
|
+
// window geometry
|
|
31
|
+
'win-h': window.innerHeight,
|
|
32
|
+
'win-w': window.innerWidth,
|
|
33
|
+
electron: util_1.isElectron,
|
|
34
|
+
loadTime: (Date.now() - initialTimeStamp) / 1000,
|
|
35
|
+
jb2: true,
|
|
36
|
+
};
|
|
37
|
+
// stringifies the track type counts, gets processed in lambda
|
|
38
|
+
tracks.forEach((track) => {
|
|
39
|
+
const key = `track-types-${track.type}`;
|
|
40
|
+
stats[key] = stats[key] + 1 || 1;
|
|
41
|
+
});
|
|
42
|
+
// stringifies the session track type counts, gets processed in lambda
|
|
43
|
+
session === null || session === void 0 ? void 0 : session.sessionTracks.forEach((track) => {
|
|
44
|
+
const key = `sessionTrack-types-${track.type}`;
|
|
45
|
+
stats[key] = stats[key] + 1 || 1;
|
|
46
|
+
});
|
|
47
|
+
// put stats into a query string for get request
|
|
48
|
+
const qs = Object.keys(stats)
|
|
49
|
+
.map(key => `${key}=${stats[key]}`)
|
|
50
|
+
.join('&');
|
|
51
|
+
await fetch(`${url}?${qs}`);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
console.error('Failed to write analytics to AWS.', e);
|
|
55
|
+
}
|
|
105
56
|
}
|
|
106
|
-
|
|
107
|
-
function
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
gaData["dimension".concat(index + 1)] = stats[key];
|
|
137
|
-
});
|
|
138
|
-
gaData.metric1 = Math.round(stats.loadTime);
|
|
139
|
-
analyticsScript += "ga('jbrowseTracker.send', 'pageview',".concat(JSON.stringify(gaData), ");");
|
|
140
|
-
analyticsScriptNode = document.createElement('script');
|
|
141
|
-
analyticsScriptNode.innerHTML = analyticsScript;
|
|
142
|
-
document.getElementsByTagName('head')[0].appendChild(analyticsScriptNode);
|
|
143
|
-
|
|
144
|
-
case 15:
|
|
145
|
-
case "end":
|
|
146
|
-
return _context2.stop();
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}, _callee2);
|
|
150
|
-
}));
|
|
151
|
-
return _writeGAAnalytics.apply(this, arguments);
|
|
57
|
+
exports.writeAWSAnalytics = writeAWSAnalytics;
|
|
58
|
+
async function writeGAAnalytics(rootModel, initialTimestamp) {
|
|
59
|
+
var _a;
|
|
60
|
+
const jbrowseUser = 'UA-7115575-5';
|
|
61
|
+
const stats = {
|
|
62
|
+
'tracks-count': rootModel.jbrowse.tracks.length,
|
|
63
|
+
ver: rootModel.version,
|
|
64
|
+
electron: util_1.isElectron,
|
|
65
|
+
loadTime: Date.now() - initialTimestamp,
|
|
66
|
+
pluginNames: ((_a = rootModel.jbrowse.plugins) === null || _a === void 0 ? void 0 : _a.map((plugin) => plugin.name)) || '',
|
|
67
|
+
};
|
|
68
|
+
// create script
|
|
69
|
+
let analyticsScript = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){";
|
|
70
|
+
analyticsScript +=
|
|
71
|
+
'(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),';
|
|
72
|
+
analyticsScript +=
|
|
73
|
+
'm=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)';
|
|
74
|
+
analyticsScript +=
|
|
75
|
+
"})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');";
|
|
76
|
+
analyticsScript += `ga('create', '${jbrowseUser}', 'auto', 'jbrowseTracker');`;
|
|
77
|
+
const gaData = {};
|
|
78
|
+
const googleDimensions = 'tracks-count ver electron loadTime pluginNames';
|
|
79
|
+
googleDimensions.split(/\s+/).forEach((key, index) => {
|
|
80
|
+
gaData[`dimension${index + 1}`] = stats[key];
|
|
81
|
+
});
|
|
82
|
+
gaData.metric1 = Math.round(stats.loadTime);
|
|
83
|
+
analyticsScript += `ga('jbrowseTracker.send', 'pageview',${JSON.stringify(gaData)});`;
|
|
84
|
+
const analyticsScriptNode = document.createElement('script');
|
|
85
|
+
analyticsScriptNode.innerHTML = analyticsScript;
|
|
86
|
+
document.getElementsByTagName('head')[0].appendChild(analyticsScriptNode);
|
|
152
87
|
}
|
|
153
|
-
|
|
88
|
+
exports.writeGAAnalytics = writeGAAnalytics;
|
|
154
89
|
function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
90
|
+
if (rootModel &&
|
|
91
|
+
!(0, configuration_1.readConfObject)(rootModel.jbrowse.configuration, 'disableAnalytics')) {
|
|
92
|
+
writeAWSAnalytics(rootModel, initialTimestamp, initialSessionQuery);
|
|
93
|
+
writeGAAnalytics(rootModel, initialTimestamp);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.doAnalytics = doAnalytics;
|