@aics/vole-app 2.15.0 → 3.1.2

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 (79) hide show
  1. package/es/aics-image-viewer/components/App/ChannelUpdater.js +21 -3
  2. package/es/aics-image-viewer/components/App/index.js +156 -199
  3. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +10 -9
  4. package/es/aics-image-viewer/components/ChannelsWidget.js +35 -22
  5. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +27 -71
  6. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +0 -6
  7. package/es/aics-image-viewer/components/ColorPicker.js +1 -1
  8. package/es/aics-image-viewer/components/ControlPanel/index.js +5 -4
  9. package/es/aics-image-viewer/components/CustomizeWidget.js +12 -8
  10. package/es/aics-image-viewer/components/ErrorAlert/index.js +4 -4
  11. package/es/aics-image-viewer/components/GlobalVolumeControls.js +12 -10
  12. package/es/aics-image-viewer/components/StyleProvider/index.js +4 -2
  13. package/es/aics-image-viewer/components/TfEditor/index.js +304 -154
  14. package/es/aics-image-viewer/components/TfEditor/styles.css +53 -31
  15. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +1 -1
  16. package/es/aics-image-viewer/components/Toolbar/index.js +18 -16
  17. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +1 -1
  18. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +1 -0
  19. package/es/aics-image-viewer/components/shared/SmarterSlider.js +1 -1
  20. package/es/aics-image-viewer/components/shared/ViewerIcon.js +1 -1
  21. package/es/aics-image-viewer/components/useVolume.js +68 -59
  22. package/es/aics-image-viewer/shared/constants.js +2 -2
  23. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +57 -24
  24. package/es/aics-image-viewer/shared/utils/sceneStore.js +14 -4
  25. package/es/aics-image-viewer/shared/utils/storage.js +238 -0
  26. package/es/aics-image-viewer/shared/utils/test/storage.test.js +264 -0
  27. package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +249 -109
  28. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
  29. package/es/aics-image-viewer/shared/utils/urlParsing.js +287 -154
  30. package/es/aics-image-viewer/shared/utils/viewerState.js +4 -24
  31. package/es/aics-image-viewer/state/reset.js +111 -0
  32. package/es/aics-image-viewer/state/store.js +90 -0
  33. package/es/aics-image-viewer/state/subscribers.js +153 -0
  34. package/es/aics-image-viewer/state/test/reset.test.js +247 -0
  35. package/es/aics-image-viewer/state/util.js +71 -0
  36. package/es/index.js +3 -3
  37. package/package.json +18 -11
  38. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +2 -4
  39. package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
  40. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +6 -6
  41. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +5 -14
  42. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -6
  43. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +3 -6
  44. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +1 -1
  45. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +6 -7
  46. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +2 -8
  47. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +4 -0
  48. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +2 -9
  49. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +1 -1
  50. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +1 -1
  51. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +10 -3
  52. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +3 -12
  53. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +1 -1
  54. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +1 -1
  55. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +1 -1
  56. package/type-declarations/aics-image-viewer/components/useVolume.d.ts +7 -4
  57. package/type-declarations/aics-image-viewer/shared/constants.d.ts +5 -5
  58. package/type-declarations/aics-image-viewer/shared/types.d.ts +1 -1
  59. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +9 -5
  60. package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +1 -1
  61. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +1 -1
  62. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -1
  63. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +8 -4
  64. package/type-declarations/aics-image-viewer/shared/utils/storage.d.ts +15 -0
  65. package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +94 -31
  66. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +39 -1
  67. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +3 -6
  68. package/type-declarations/aics-image-viewer/state/reset.d.ts +29 -0
  69. package/type-declarations/aics-image-viewer/state/store.d.ts +30 -0
  70. package/type-declarations/aics-image-viewer/state/subscribers.d.ts +4 -0
  71. package/type-declarations/aics-image-viewer/state/types.d.ts +46 -0
  72. package/type-declarations/aics-image-viewer/state/util.d.ts +8 -0
  73. package/type-declarations/index.d.ts +4 -4
  74. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +0 -163
  75. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +0 -259
  76. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +0 -34
  77. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +0 -33
  78. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +0 -107
  79. /package/es/aics-image-viewer/{components/ViewerStateProvider → state}/types.js +0 -0
@@ -1,10 +1,18 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- var _ViewerChannelSetting, _ViewerChannelSetting2, _ViewerChannelSetting3, _ViewerChannelSetting4, _ViewerChannelSetting5, _ViewerChannelSetting6, _ViewerChannelSetting7, _ViewerChannelSetting8, _ViewerChannelSetting9, _ViewerChannelSetting10, _ViewerChannelSetting11, _ViewerStateKeys$View, _ViewerStateKeys$Mode, _ViewerStateKeys$Mask, _ViewerStateKeys$Imag, _ViewerStateKeys$Axes, _ViewerStateKeys$Boun, _ViewerStateKeys$Boun2, _ViewerStateKeys$Back, _ViewerStateKeys$Auto, _ViewerStateKeys$Brig, _ViewerStateKeys$Dens, _ViewerStateKeys$Leve, _ViewerStateKeys$Inte, _ViewerStateKeys$Regi, _ViewerStateKeys$Slic, _ViewerStateKeys$Time, _ViewerStateKeys$Scen, _ViewerStateKeys$Came;
3
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
4
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2
+ var _ViewerChannelSetting, _ViewerChannelSetting2, _ViewerChannelSetting3, _ViewerChannelSetting4, _ViewerChannelSetting5, _ViewerChannelSetting6, _ViewerChannelSetting7, _ViewerChannelSetting8, _ViewerChannelSetting9, _ViewerChannelSetting10, _ViewerChannelSetting11, _ViewerChannelSetting12, _ViewerChannelSetting13, _ViewerChannelSetting14, _ViewerStateKeys$View, _ViewerStateKeys$Mode, _ViewerStateKeys$Mask, _ViewerStateKeys$Imag, _ViewerStateKeys$Axes, _ViewerStateKeys$Boun, _ViewerStateKeys$Boun2, _ViewerStateKeys$Back, _ViewerStateKeys$Auto, _ViewerStateKeys$Brig, _ViewerStateKeys$Dens, _ViewerStateKeys$Leve, _ViewerStateKeys$Inte, _ViewerStateKeys$Regi, _ViewerStateKeys$Slic, _ViewerStateKeys$Time, _ViewerStateKeys$Scen, _ViewerStateKeys$Came;
3
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
4
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
5
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
6
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
7
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
8
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
9
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
10
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
11
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
6
12
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
7
13
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
14
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
15
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
16
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
9
17
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
18
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
@@ -28,54 +36,55 @@ import { ImageType, RenderMode, ViewMode } from "../enums";
28
36
  import { removeMatchingProperties, removeUndefinedProperties } from "./datatypes";
29
37
  import FirebaseRequest from "./firebase";
30
38
  import { clamp } from "./math";
39
+ import { readStoredMetadata, readStoredScenes } from "./storage";
31
40
  export var ENCODED_COMMA_REGEX = /%2C/g;
32
41
  export var ENCODED_COLON_REGEX = /%3A/g;
33
42
  var DEFAULT_CONTROL_POINT_COLOR = [255, 255, 255];
34
43
  var DEFAULT_CONTROL_POINT_COLOR_CODE = "1";
35
-
36
- /** If the `url` query param equals this, parse image url(s) and metadata from local storage instead of params */
37
- var URL_FETCH_FROM_STORAGE = "storage";
38
-
39
- // TODO: refactor regexes to be composed of one another rather than duplicating code
40
- // const COLOR_CODES: Record<string, ColorArray> = {
41
- // "0": [0, 0, 0],
42
- // "1": [255, 255, 255],
43
- // "-1": [255, 255, 255],
44
- // w: [255, 255, 255],
45
- // k: [0, 0, 0],
46
- // };
47
- // const COLOR_CODE_REGEX = new RegExp(`(${Object.keys(COLOR_CODES).join("|")})`);
48
- // const HEX_COLOR_REGEX = new RegExp(`(([0-9a-fA-F]{6})|${COLOR_CODE_REGEX.source})`);
49
-
44
+ var FLOAT_REGEX = /-?[0-9]*.?[0-9]+/;
50
45
  var CHANNEL_STATE_KEY_REGEX = /^c[0-9]+$/;
46
+
51
47
  /** Match colon-separated pairs of alphanumeric strings */
52
48
  var LUT_REGEX = /^-?[a-z0-9.]*:[ ]*-?[a-z0-9.]*$/;
53
- /** Match colon-separated pairs of numeric strings */
54
- var RAMP_REGEX = /^-?[0-9.]*:-?[0-9.]*$/;
49
+
50
+ /**
51
+ * Match colon-separated pairs of numeric strings, representing histogram bin
52
+ * indices or intensity values.
53
+ */
54
+ var RAMP_REGEX = new RegExp("^".concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, "$"));
55
+
55
56
  /**
56
57
  * Match comma-separated triplet of numeric strings.
57
58
  */
58
- var SLICE_REGEX = /^[0-9.]*,[0-9.]*,[0-9.]*$/;
59
+ var SLICE_REGEX = new RegExp("^".concat(FLOAT_REGEX.source, ",").concat(FLOAT_REGEX.source, ",").concat(FLOAT_REGEX.source, "$"));
60
+
59
61
  /**
60
62
  * Matches a sequence of three comma-separated min:max number pairs, representing
61
63
  * the x, y, and z axes.
62
64
  */
63
- var REGION_REGEX = /^([0-9.]*:[0-9.]*)(,[0-9.]*:[0-9.]*){2}$/;
65
+ var REGION_REGEX = new RegExp("^(".concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, ")(,").concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, "){2}$"));
64
66
  var HEX_COLOR_REGEX = new RegExp("(([0-9a-fA-F]{6})|".concat(DEFAULT_CONTROL_POINT_COLOR_CODE, ")"));
65
- var NUMERIC_REGEX = /-?[0-9.]*/;
66
- var CONTROL_POINT_REGEX = new RegExp("(".concat(NUMERIC_REGEX.source, ":").concat(NUMERIC_REGEX.source, ":").concat(HEX_COLOR_REGEX.source, ")"));
67
+
68
+ /** Represents control points specified by bin indices. */
69
+ var CONTROL_POINT_REGEX = new RegExp("(".concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, ":").concat(HEX_COLOR_REGEX.source, ")"));
67
70
  var HEX_COLOR_STR_REGEX = new RegExp("^".concat(HEX_COLOR_REGEX.source, "$"));
68
71
 
69
72
  /**
70
73
  * LEGACY: Matches a COMMA-separated list of control points, where each control point is represented
71
74
  * by a triplet of `{x}:{opacity}:{hex color}`.
72
- * The hex color can be replaced with `w` to represent white (`ffffff`).
75
+ * The hex color can be replaced with `1` to represent white (`ffffff`).
73
76
  */
74
77
  export var LEGACY_CONTROL_POINTS_REGEX = new RegExp("^".concat(CONTROL_POINT_REGEX.source, "(,").concat(CONTROL_POINT_REGEX.source, ")*$"));
78
+
75
79
  /**
76
- * Matches a COLON-separated list of control points, where each control point is represented
77
- * by a triplet of `{x}:{opacity}:{hex color}`.
78
- * The hex color can be replaced with `w` to represent white (`ffffff`).
80
+ * Matches a COLON-separated list of control points, where each control point is
81
+ * represented by a triplet of `{x}:{opacity}:{hex color}`.
82
+ * - `x` is a value that will either be parsed as a histogram bin index (legacy,
83
+ * for `ControlPointsLegacy`) or intensity value (for `ControlPoints`),
84
+ * depending on on which field is being parsed.
85
+ * - Opacity is a float in the [0, 1] range.
86
+ * - The hex color is a 6-digit hex color (e.g. `ffeecc`), and can be replaced
87
+ * with `1` to represent white (`ffffff`).
79
88
  */
80
89
  export var CONTROL_POINTS_REGEX = new RegExp("^".concat(CONTROL_POINT_REGEX.source, "(:").concat(CONTROL_POINT_REGEX.source, ")*$"));
81
90
 
@@ -122,12 +131,15 @@ export var ViewerChannelSettingKeys = /*#__PURE__*/function (ViewerChannelSettin
122
131
  ViewerChannelSettingKeys["ColorizeAlpha"] = "cza";
123
132
  ViewerChannelSettingKeys["IsosurfaceAlpha"] = "isa";
124
133
  ViewerChannelSettingKeys["Lut"] = "lut";
125
- ViewerChannelSettingKeys["Ramp"] = "rmp";
126
- ViewerChannelSettingKeys["ControlPoints"] = "cps";
134
+ ViewerChannelSettingKeys["ControlPoints"] = "cpt";
135
+ ViewerChannelSettingKeys["ControlPointsLegacy"] = "cps";
136
+ ViewerChannelSettingKeys["Ramp"] = "ram";
137
+ ViewerChannelSettingKeys["RampLegacy"] = "rmp";
127
138
  ViewerChannelSettingKeys["ControlPointsEnabled"] = "cpe";
128
139
  ViewerChannelSettingKeys["VolumeEnabled"] = "ven";
129
140
  ViewerChannelSettingKeys["SurfaceEnabled"] = "sen";
130
141
  ViewerChannelSettingKeys["IsosurfaceValue"] = "isv";
142
+ ViewerChannelSettingKeys["KeepRange"] = "pin";
131
143
  return ViewerChannelSettingKeys;
132
144
  }({});
133
145
 
@@ -139,12 +151,15 @@ _ViewerChannelSetting2 = ViewerChannelSettingKeys.Colorize;
139
151
  _ViewerChannelSetting3 = ViewerChannelSettingKeys.ColorizeAlpha;
140
152
  _ViewerChannelSetting4 = ViewerChannelSettingKeys.IsosurfaceAlpha;
141
153
  _ViewerChannelSetting5 = ViewerChannelSettingKeys.Lut;
142
- _ViewerChannelSetting6 = ViewerChannelSettingKeys.ControlPoints;
143
- _ViewerChannelSetting7 = ViewerChannelSettingKeys.ControlPointsEnabled;
144
- _ViewerChannelSetting8 = ViewerChannelSettingKeys.Ramp;
145
- _ViewerChannelSetting9 = ViewerChannelSettingKeys.VolumeEnabled;
146
- _ViewerChannelSetting10 = ViewerChannelSettingKeys.SurfaceEnabled;
147
- _ViewerChannelSetting11 = ViewerChannelSettingKeys.IsosurfaceValue;
154
+ _ViewerChannelSetting6 = ViewerChannelSettingKeys.ControlPointsLegacy;
155
+ _ViewerChannelSetting7 = ViewerChannelSettingKeys.ControlPoints;
156
+ _ViewerChannelSetting8 = ViewerChannelSettingKeys.ControlPointsEnabled;
157
+ _ViewerChannelSetting9 = ViewerChannelSettingKeys.RampLegacy;
158
+ _ViewerChannelSetting10 = ViewerChannelSettingKeys.Ramp;
159
+ _ViewerChannelSetting11 = ViewerChannelSettingKeys.VolumeEnabled;
160
+ _ViewerChannelSetting12 = ViewerChannelSettingKeys.SurfaceEnabled;
161
+ _ViewerChannelSetting13 = ViewerChannelSettingKeys.IsosurfaceValue;
162
+ _ViewerChannelSetting14 = ViewerChannelSettingKeys.KeepRange;
148
163
  export var ViewerChannelSettingParams = /*#__PURE__*/_createClass(function ViewerChannelSettingParams() {
149
164
  _classCallCheck(this, ViewerChannelSettingParams);
150
165
  /** Color, as a 6-digit hex color. */
@@ -183,30 +198,53 @@ export var ViewerChannelSettingParams = /*#__PURE__*/_createClass(function Viewe
183
198
  */
184
199
  _defineProperty(this, _ViewerChannelSetting5, undefined);
185
200
  /**
186
- * Control points for the transfer function. If provided, overrides the
187
- * `lut` field when calculating the control points. Should be a list
188
- * of `x:opacity:color` triplets, separated by colon.
189
- * - `x` is a numeric intensity value.
201
+ * Legacy specifier for control points for the transfer function as a list of
202
+ * `x:opacity:color` triplets, separated by colon. Uses histogram bin indices
203
+ * instead of intensity values.
204
+ * - `x` is a histogram bin index in the [0, 255] range.
190
205
  * - `opacity` is a float in the [0, 1] range.
191
206
  * - `color` is a 6-digit hex color, e.g. `ff0000`.
207
+ *
208
+ * Will be overridden by the ControlPoints field (`cpt`) if provided.
192
209
  */
193
210
  _defineProperty(this, _ViewerChannelSetting6, undefined);
194
211
  /**
195
- * Whether to show advanced mode, which will show control points instead of
196
- * ramp values defined by the LUT. "1" is enabled, disabled by default.
212
+ * Control points for the transfer function, formatted as a list of
213
+ * `x:opacity:color` triplets, separated by colons.
214
+ * - `x` is a numeric intensity value.
215
+ * - `opacity` is a float in the [0, 1] range.
216
+ * - `color` is a 6-digit hex color, e.g. `ff0000`.
217
+ *
218
+ * If provided, overrides the `lut` field when calculating the control points.
197
219
  */
198
220
  _defineProperty(this, _ViewerChannelSetting7, undefined);
199
221
  /**
200
- * Raw ramp values, which should be two numeric values separated by a colon.
201
- * If provided, overrides the `lut` field when calculating the ramp values.
222
+ * Whether to show advanced mode, which will show control points instead of
223
+ * ramp values defined by the LUT. "1" is enabled, disabled by default.
202
224
  */
203
225
  _defineProperty(this, _ViewerChannelSetting8, undefined);
204
- /** Volume enabled. "1" is enabled. Disabled by default. */
226
+ /**
227
+ * Legacy specifier for the transfer function ramp which uses histogram bin
228
+ * indices instead of intensity values, formatted as `min:max`. Will be
229
+ * overridden by the Ramp field (`ram`) if provided.
230
+ */
205
231
  _defineProperty(this, _ViewerChannelSetting9, undefined);
206
- /** Isosurface enabled. "1" is enabled. Disabled by default. */
232
+ /**
233
+ * Ramp min and max intensity values (`min:max`). If provided, overrides the
234
+ * `lut` field when calculating the ramp.
235
+ */
207
236
  _defineProperty(this, _ViewerChannelSetting10, undefined);
208
- /** Isosurface value, in the [0, 255] range. Set to `128` by default. */
237
+ /** Volume enabled. "1" is enabled. Disabled by default. */
209
238
  _defineProperty(this, _ViewerChannelSetting11, undefined);
239
+ /** Isosurface enabled. "1" is enabled. Disabled by default. */
240
+ _defineProperty(this, _ViewerChannelSetting12, undefined);
241
+ /** Isosurface value, in the [0, 255] range. Set to `128` by default. */
242
+ _defineProperty(this, _ViewerChannelSetting13, undefined);
243
+ /**
244
+ * Whether to keep the current contrast settings when loading a new volume.
245
+ * "1" is enabled. Disabled by default.
246
+ */
247
+ _defineProperty(this, _ViewerChannelSetting14, undefined);
210
248
  });
211
249
  /**
212
250
  * Channels, matching the pattern `c0`, `c1`, etc. corresponding to the index of the channel being configured.
@@ -298,8 +336,15 @@ export var ViewerStateParams = /*#__PURE__*/_createClass(function ViewerStatePar
298
336
  var DataParams = /*#__PURE__*/_createClass(function DataParams() {
299
337
  _classCallCheck(this, DataParams);
300
338
  /**
301
- * One or more volume URLs to load. If multiple URLs are provided, they should
302
- * be separated by commas.
339
+ * One or more volume URLs to load.
340
+ *
341
+ * This parameter may represent a single image with multiple data sources by delimiting each source URL with `,`.
342
+ * It may also represent multiple scenes by delimiting each scene URL (and/or each collection of multiple
343
+ * `,`-delimited source URLs) with `+`. E.g. `url1+url2,url3` represents a collection of two scenes, where the first
344
+ * scene comes from `url1` and the second is a combination of the channels from the images at `url2` and `url3`.
345
+ *
346
+ * When parsing, we do our best to account for `%`-encoding, including the possibility that each source/scene URL was
347
+ * encoded separately, then concatenated with the proper delimiters, then encoded again.
303
348
  */
304
349
  _defineProperty(this, "url", undefined);
305
350
  /**
@@ -310,14 +355,24 @@ var DataParams = /*#__PURE__*/_createClass(function DataParams() {
310
355
  * See `ManifestJson` for the type definition.
311
356
  */
312
357
  _defineProperty(this, "manifest", undefined);
313
- /**
314
- * The name of a dataset in the Cell Feature Explorer database. Used with `id`.
315
- */
358
+ /** The name of a dataset in the Cell Feature Explorer database. Used with `id`. */
316
359
  _defineProperty(this, "dataset", undefined);
360
+ /** The ID of a cell within the loaded dataset. Used with `dataset`. */
361
+ _defineProperty(this, "id", undefined);
362
+ /** The key of a collection of scenes stored in local storage. Overrides `url`. */
363
+ _defineProperty(this, "collectionid", undefined);
317
364
  /**
318
- * The ID of a cell within the loaded dataset. Used with `dataset`.
365
+ * The origin of an opening window that wants to send a message to this window.
366
+ *
367
+ * The presence of this param implies that this window has just been opened by another app, and the opening app has
368
+ * more data to send. Until that message is received, we fall back to `url`. Once that message arrives, the scenes to
369
+ * open are written to local storage at a new `collectionid` and `msgorigin` is removed, allowing the window to
370
+ * switch to reading local storage.
371
+ *
372
+ * All this happens independently of URL parsing, so the only meaningful thing this parsing code does with this param
373
+ * is check whether it is present.
319
374
  */
320
- _defineProperty(this, "id", undefined);
375
+ _defineProperty(this, "msgorigin", undefined);
321
376
  });
322
377
  var DeprecatedParams = /*#__PURE__*/_createClass(function DeprecatedParams() {
323
378
  _classCallCheck(this, DeprecatedParams);
@@ -328,6 +383,10 @@ var DeprecatedParams = /*#__PURE__*/_createClass(function DeprecatedParams() {
328
383
  /** Deprecated query parameter for channel colors. */
329
384
  _defineProperty(this, "colors", undefined);
330
385
  });
386
+ /**
387
+ * A message sent from an external application after this app was opened,
388
+ * containing data that was too large to pack into the URL.
389
+ */
331
390
  var allowedParamKeys = [].concat(_toConsumableArray(Object.keys(new ViewerStateParams())), _toConsumableArray(Object.keys(new DataParams())), _toConsumableArray(Object.keys(new DeprecatedParams())));
332
391
  var isParamKey = function isParamKey(key) {
333
392
  return allowedParamKeys.indexOf(key) !== -1;
@@ -362,39 +421,63 @@ export function getAllowedParams(searchParams) {
362
421
  }
363
422
  return result;
364
423
  }
365
- var decodeURL = function decodeURL(url) {
366
- var decodedUrl = decodeURIComponent(url);
367
- return decodedUrl.endsWith("/") ? decodedUrl.slice(0, -1) : decodedUrl;
368
- };
369
424
 
370
- /** Try to parse a `string` as a list of 2 or more URLs. Returns `undefined` if the string is not a valid URL list. */
371
- var tryDecodeURLList = function tryDecodeURLList(url) {
372
- var delim = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ",";
373
- if (typeof delim === "string" ? !url.includes(delim) : !delim.test(url)) {
374
- return undefined;
375
- }
376
- var urls = url.split(delim).map(function (u) {
377
- return decodeURL(u);
425
+ /** Tries to retrieve the given `param` from a `search` string without using `URLSearchParams`, to avoid decoding. */
426
+ var getSearchParamRaw = function getSearchParamRaw(search, param) {
427
+ var trimmedSearch = search.startsWith("?") ? search.slice(1) : search;
428
+ var entries = trimmedSearch.split("&");
429
+ var key = param + "=";
430
+ var foundKeyValue = entries.find(function (keyValue) {
431
+ return keyValue.startsWith(key);
378
432
  });
433
+ return foundKeyValue === null || foundKeyValue === void 0 ? void 0 : foundKeyValue.slice(key.length);
434
+ };
379
435
 
380
- // Verify that all urls are valid
381
- var _iterator2 = _createForOfIteratorHelper(urls),
382
- _step2;
383
- try {
384
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
385
- var u = _step2.value;
386
- try {
387
- new URL(u);
388
- } catch (_e) {
389
- return undefined;
436
+ /**
437
+ * Applies `decodeURIComponent` over and over until `url` either seems to be a valid `URL` or satisfies `condition`.
438
+ */
439
+ var decodeURLUntilParseable = function decodeURLUntilParseable(url) {
440
+ var condition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (_url) {
441
+ return false;
442
+ };
443
+ var decoded = url;
444
+ while (!condition(decoded) && !URL.canParse(decoded)) {
445
+ try {
446
+ var nextDecoded = decodeURIComponent(decoded);
447
+ if (nextDecoded === decoded) {
448
+ return decoded;
390
449
  }
450
+ decoded = nextDecoded;
451
+ } catch (_unused) {
452
+ return decoded;
391
453
  }
392
- } catch (err) {
393
- _iterator2.e(err);
394
- } finally {
395
- _iterator2.f();
396
454
  }
397
- return urls;
455
+ return decoded;
456
+ };
457
+
458
+ /** Parses the `url` query param into a 2D URL array: one or more scenes, with one or more sources per scene. */
459
+ export var parseImageURLParam = function parseImageURLParam(urlParam) {
460
+ // Decode until either any valid delimiters appear or `urlParam` is parseable as a single URL.
461
+ var decodedScenes = decodeURLUntilParseable(urlParam, function (url) {
462
+ return /[+ ,]/.test(url);
463
+ });
464
+ // Split into scene URLs.
465
+ var sceneUrls = decodedScenes.split(/[+ ]/);
466
+ return sceneUrls.map(function (scene) {
467
+ // Split each scene into multiple sources, if any.
468
+ var decodedSources = decodeURLUntilParseable(scene, function (url) {
469
+ return url.includes(",");
470
+ });
471
+ var sourceUrls = decodedSources.split(",");
472
+ if (sourceUrls.length === 1) {
473
+ return sourceUrls;
474
+ }
475
+
476
+ // Try to make sure the source URLs are decoded as well.
477
+ return sourceUrls.map(function (source) {
478
+ return decodeURLUntilParseable(source);
479
+ });
480
+ });
398
481
  };
399
482
 
400
483
  //// DATA PARSING //////////////////////
@@ -415,20 +498,20 @@ export function parseKeyValueList(data) {
415
498
  }
416
499
  var result = {};
417
500
  var keyValuePairs = data.split(",");
418
- var _iterator3 = _createForOfIteratorHelper(keyValuePairs),
419
- _step3;
501
+ var _iterator2 = _createForOfIteratorHelper(keyValuePairs),
502
+ _step2;
420
503
  try {
421
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
422
- var pair = _step3.value;
504
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
505
+ var pair = _step2.value;
423
506
  var splitIndex = pair.indexOf(":");
424
507
  var key = pair.slice(0, splitIndex);
425
508
  var value = pair.slice(splitIndex + 1);
426
509
  result[decodeURIComponent(key).trim()] = decodeURIComponent(value).trim();
427
510
  }
428
511
  } catch (err) {
429
- _iterator3.e(err);
512
+ _iterator2.e(err);
430
513
  } finally {
431
- _iterator3.f();
514
+ _iterator2.f();
432
515
  }
433
516
  return result;
434
517
  }
@@ -723,22 +806,22 @@ function parseControlPoints(controlPoints) {
723
806
  }
724
807
 
725
808
  // Parse raw control point data from the string into an array of [x, opacity, color] triplets.
726
- var rawControlPointData;
809
+ var controlPointStrings;
727
810
  if (LEGACY_CONTROL_POINTS_REGEX.test(controlPoints)) {
728
811
  // Legacy format uses commas to separate control points.
729
- rawControlPointData = controlPoints.split(",").map(function (cp) {
812
+ controlPointStrings = controlPoints.split(",").map(function (cp) {
730
813
  return cp.split(":");
731
814
  });
732
815
  } else {
733
816
  // New format is all colon-separated, where every three elements represent a control point.
734
- rawControlPointData = controlPoints.split(":").reduce(function (acc, _val, i, array) {
817
+ controlPointStrings = controlPoints.split(":").reduce(function (acc, _val, i, array) {
735
818
  if ((i + 1) % 3 === 0) {
736
819
  acc.push([array[i - 2], array[i - 1], array[i]]);
737
820
  }
738
821
  return acc;
739
822
  }, []);
740
823
  }
741
- var newControlPoints = rawControlPointData.map(function (cp) {
824
+ var newControlPoints = controlPointStrings.map(function (cp) {
742
825
  var _parseStringFloat, _parseStringFloat2, _parseHexColorAsColor;
743
826
  var _cp = _slicedToArray(cp, 3),
744
827
  x = _cp[0],
@@ -770,7 +853,8 @@ export function deserializeViewerChannelSetting(channelIndex, jsonState) {
770
853
  match: channelIndex,
771
854
  enabled: parseStringBoolean(jsonState[ViewerChannelSettingKeys.VolumeEnabled]),
772
855
  surfaceEnabled: parseStringBoolean(jsonState[ViewerChannelSettingKeys.SurfaceEnabled]),
773
- isovalue: parseStringFloat(jsonState[ViewerChannelSettingKeys.IsosurfaceValue], 0, 255),
856
+ isovalue: parseStringFloat(jsonState[ViewerChannelSettingKeys.IsosurfaceValue], -Infinity, Infinity),
857
+ keepIntensityRange: parseStringBoolean(jsonState[ViewerChannelSettingKeys.KeepRange]),
774
858
  surfaceOpacity: parseStringFloat(jsonState[ViewerChannelSettingKeys.IsosurfaceAlpha], 0, 1),
775
859
  colorizeEnabled: parseStringBoolean(jsonState[ViewerChannelSettingKeys.Colorize]),
776
860
  colorizeAlpha: parseStringFloat(jsonState[ViewerChannelSettingKeys.ColorizeAlpha], 0, 1),
@@ -784,17 +868,41 @@ export function deserializeViewerChannelSetting(channelIndex, jsonState) {
784
868
  _jsonState$ViewerChan2 = _slicedToArray(_jsonState$ViewerChan, 2),
785
869
  min = _jsonState$ViewerChan2[0],
786
870
  max = _jsonState$ViewerChan2[1];
787
- result.lut = [min.trim(), max.trim()];
871
+ result.intensity = _objectSpread(_objectSpread({}, result.intensity), {}, {
872
+ lut: [min.trim(), max.trim()]
873
+ });
788
874
  }
789
- if (jsonState[ViewerChannelSettingKeys.Ramp] && RAMP_REGEX.test(jsonState.rmp)) {
790
- var _jsonState$ViewerChan3 = jsonState[ViewerChannelSettingKeys.Ramp].split(":"),
791
- _jsonState$ViewerChan4 = _slicedToArray(_jsonState$ViewerChan3, 2),
792
- _min = _jsonState$ViewerChan4[0],
793
- _max = _jsonState$ViewerChan4[1];
794
- result.ramp = [Number.parseFloat(_min), Number.parseFloat(_max)];
875
+ if (jsonState[ViewerChannelSettingKeys.Ramp]) {
876
+ if (RAMP_REGEX.test(jsonState[ViewerChannelSettingKeys.Ramp])) {
877
+ var _jsonState$ViewerChan3 = jsonState[ViewerChannelSettingKeys.Ramp].split(":"),
878
+ _jsonState$ViewerChan4 = _slicedToArray(_jsonState$ViewerChan3, 2),
879
+ _min = _jsonState$ViewerChan4[0],
880
+ _max = _jsonState$ViewerChan4[1];
881
+ result.intensity = _objectSpread(_objectSpread({}, result.intensity), {}, {
882
+ ramp: [Number.parseFloat(_min), Number.parseFloat(_max)]
883
+ });
884
+ }
885
+ } else if (jsonState[ViewerChannelSettingKeys.RampLegacy]) {
886
+ if (RAMP_REGEX.test(jsonState[ViewerChannelSettingKeys.RampLegacy])) {
887
+ var _jsonState$ViewerChan5 = jsonState[ViewerChannelSettingKeys.RampLegacy].split(":"),
888
+ _jsonState$ViewerChan6 = _slicedToArray(_jsonState$ViewerChan5, 2),
889
+ _min2 = _jsonState$ViewerChan6[0],
890
+ _max2 = _jsonState$ViewerChan6[1];
891
+ result.ramp = [Number.parseFloat(_min2), Number.parseFloat(_max2)];
892
+ }
795
893
  }
796
894
  if (jsonState[ViewerChannelSettingKeys.ControlPoints]) {
797
- result.controlPoints = parseControlPoints(jsonState[ViewerChannelSettingKeys.ControlPoints]);
895
+ var parsedResult = parseControlPoints(jsonState[ViewerChannelSettingKeys.ControlPoints]);
896
+ if (parsedResult) {
897
+ result.intensity = _objectSpread(_objectSpread({}, result.intensity), {}, {
898
+ controlPoints: parsedResult
899
+ });
900
+ }
901
+ } else if (jsonState[ViewerChannelSettingKeys.ControlPointsLegacy]) {
902
+ var _parsedResult = parseControlPoints(jsonState[ViewerChannelSettingKeys.ControlPointsLegacy]);
903
+ if (_parsedResult) {
904
+ result.controlPoints = _parsedResult;
905
+ }
798
906
  }
799
907
  return result;
800
908
  }
@@ -807,13 +915,11 @@ export function deserializeViewerChannelSetting(channelIndex, jsonState) {
807
915
  * @returns A `ViewerChannelSettingParams` object with the serialized parameters. Undefined values are removed.
808
916
  */
809
917
  export function serializeViewerChannelSetting(channelSetting, removeDefaults) {
810
- var _channelSetting$isova, _channelSetting$opaci, _channelSetting$color, _channelSetting$ramp;
918
+ var _channelSetting$isova, _channelSetting$opaci, _channelSetting$color, _channelSetting$ramp, _removeUndefinedPrope;
811
919
  if (removeDefaults) {
812
920
  channelSetting = removeMatchingProperties(channelSetting, getDefaultChannelState());
813
921
  }
814
- return removeUndefinedProperties(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, ViewerChannelSettingKeys.VolumeEnabled, serializeBoolean(channelSetting.volumeEnabled)), ViewerChannelSettingKeys.SurfaceEnabled, serializeBoolean(channelSetting.isosurfaceEnabled)), ViewerChannelSettingKeys.IsosurfaceValue, (_channelSetting$isova = channelSetting.isovalue) === null || _channelSetting$isova === void 0 ? void 0 : _channelSetting$isova.toString()), ViewerChannelSettingKeys.IsosurfaceAlpha, (_channelSetting$opaci = channelSetting.opacity) === null || _channelSetting$opaci === void 0 ? void 0 : _channelSetting$opaci.toString()), ViewerChannelSettingKeys.Colorize, serializeBoolean(channelSetting.colorizeEnabled)), ViewerChannelSettingKeys.ColorizeAlpha, (_channelSetting$color = channelSetting.colorizeAlpha) === null || _channelSetting$color === void 0 ? void 0 : _channelSetting$color.toString()), ViewerChannelSettingKeys.Color, channelSetting.color && colorArrayToHex(channelSetting.color)), ViewerChannelSettingKeys.ControlPoints, channelSetting.controlPoints && serializeControlPoints(channelSetting.controlPoints)), ViewerChannelSettingKeys.ControlPointsEnabled, serializeBoolean(channelSetting.useControlPoints)), ViewerChannelSettingKeys.Ramp, (_channelSetting$ramp = channelSetting.ramp) === null || _channelSetting$ramp === void 0 ? void 0 : _channelSetting$ramp.map(function (value) {
815
- return formatFloat(value);
816
- }).join(":")));
922
+ return removeUndefinedProperties((_removeUndefinedPrope = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_removeUndefinedPrope, ViewerChannelSettingKeys.VolumeEnabled, serializeBoolean(channelSetting.volumeEnabled)), ViewerChannelSettingKeys.SurfaceEnabled, serializeBoolean(channelSetting.isosurfaceEnabled)), ViewerChannelSettingKeys.IsosurfaceValue, (_channelSetting$isova = channelSetting.isovalue) === null || _channelSetting$isova === void 0 ? void 0 : _channelSetting$isova.toString()), ViewerChannelSettingKeys.IsosurfaceAlpha, (_channelSetting$opaci = channelSetting.opacity) === null || _channelSetting$opaci === void 0 ? void 0 : _channelSetting$opaci.toString()), ViewerChannelSettingKeys.Colorize, serializeBoolean(channelSetting.colorizeEnabled)), ViewerChannelSettingKeys.ColorizeAlpha, (_channelSetting$color = channelSetting.colorizeAlpha) === null || _channelSetting$color === void 0 ? void 0 : _channelSetting$color.toString()), ViewerChannelSettingKeys.Color, channelSetting.color && colorArrayToHex(channelSetting.color)), ViewerChannelSettingKeys.ControlPoints, channelSetting.controlPoints && serializeControlPoints(channelSetting.controlPoints)), ViewerChannelSettingKeys.ControlPointsEnabled, serializeBoolean(channelSetting.useControlPoints)), ViewerChannelSettingKeys.Ramp, (_channelSetting$ramp = channelSetting.ramp) === null || _channelSetting$ramp === void 0 ? void 0 : _channelSetting$ramp.join(":")), _defineProperty(_removeUndefinedPrope, ViewerChannelSettingKeys.KeepRange, serializeBoolean(channelSetting.keepIntensityRange))));
817
923
  }
818
924
  export function deserializeViewerState(params) {
819
925
  var result = {
@@ -957,7 +1063,7 @@ function loadDataset(_x, _x2, _x3) {
957
1063
  }
958
1064
  function _loadDataset() {
959
1065
  _loadDataset = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(firestore, dataset, id) {
960
- var db, args, datasets, datasetMeta, _iterator4, _step4, d, innerDatasets, names, matchingName, datasetData, baseUrl, fileInfo;
1066
+ var db, args, datasets, datasetMeta, _iterator3, _step3, d, innerDatasets, names, matchingName, datasetData, baseUrl, fileInfo;
961
1067
  return _regeneratorRuntime().wrap(function _callee$(_context) {
962
1068
  while (1) switch (_context.prev = _context.next) {
963
1069
  case 0:
@@ -968,15 +1074,15 @@ function _loadDataset() {
968
1074
  case 4:
969
1075
  datasets = _context.sent;
970
1076
  datasetMeta = undefined;
971
- _iterator4 = _createForOfIteratorHelper(datasets);
1077
+ _iterator3 = _createForOfIteratorHelper(datasets);
972
1078
  _context.prev = 7;
973
- _iterator4.s();
1079
+ _iterator3.s();
974
1080
  case 9:
975
- if ((_step4 = _iterator4.n()).done) {
1081
+ if ((_step3 = _iterator3.n()).done) {
976
1082
  _context.next = 19;
977
1083
  break;
978
1084
  }
979
- d = _step4.value;
1085
+ d = _step3.value;
980
1086
  innerDatasets = d.datasets;
981
1087
  names = Object.keys(innerDatasets);
982
1088
  matchingName = names.find(function (name) {
@@ -997,10 +1103,10 @@ function _loadDataset() {
997
1103
  case 21:
998
1104
  _context.prev = 21;
999
1105
  _context.t0 = _context["catch"](7);
1000
- _iterator4.e(_context.t0);
1106
+ _iterator3.e(_context.t0);
1001
1107
  case 24:
1002
1108
  _context.prev = 24;
1003
- _iterator4.f();
1109
+ _iterator3.f();
1004
1110
  return _context.finish(24);
1005
1111
  case 27:
1006
1112
  if (!(datasetMeta === undefined)) {
@@ -1048,16 +1154,14 @@ export function loadFromManifest(_x4) {
1048
1154
 
1049
1155
  /**
1050
1156
  * Parses a set of URL search parameters into props for the viewer.
1051
- * @param urlSearchParams The URLSearchParams object to parse.
1052
- * @param firestore Optional Firestore instance. If provided, the function can
1053
- * load data from a Firestore dataset if the `dataset` and `id` parameters are
1054
- * provided.
1157
+ * @param search The query string to parse, which must be valid in the `URLSearchParams constructor
1158
+ * @param firestore Optional Firestore instance. If provided, the function can load data from a
1159
+ * Firestore dataset if the `dataset` and `id` parameters are provided.
1055
1160
  * @returns An object containing:
1056
1161
  * - `args`: Partial AppProps object.
1057
1162
  * - `viewerSettings`: Partial ViewerState object.
1058
1163
  *
1059
- * `args` can be passed as props to the `ImageViewerApp`, and `viewerSettings`
1060
- * can be passed to `ViewerStateProvider`.
1164
+ * `args` can be passed as props to the `ImageViewerApp`, and `viewerSettings` can be passed to `ViewerStateProvider`.
1061
1165
  */
1062
1166
  function _loadFromManifest() {
1063
1167
  _loadFromManifest = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(manifestUrl) {
@@ -1134,19 +1238,15 @@ export function parseViewerUrlParams(_x5, _x6) {
1134
1238
  return _parseViewerUrlParams.apply(this, arguments);
1135
1239
  }
1136
1240
 
1137
- /**
1138
- * Serializes the ViewerState and ChannelState of a ViewerStateContext into a URLSearchParams object.
1139
- * @param state ViewerStateContext to serialize.
1140
- * @param removeDefaults If true, shortens parameters by removing any properties that match the default state.
1141
- * This includes the output of GET_DEFAULT_VIEWER_STATE and GET_DEFAULT_CHANNEL_STATE.
1142
- */
1241
+ /** Adds the data in a newly-arrived `ViewerMessage` to an existing stored `AppProps` instance. */
1143
1242
  function _parseViewerUrlParams() {
1144
- _parseViewerUrlParams = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(urlSearchParams, firestore) {
1145
- var params, args, viewerSettings, deprecatedChannelSettings, channelSettings, scenes, _yield$loadFromManife, manifestScenes, manifestMetadata, _localStorage$getItem, _tryDecodeURLList, getFromStorage, urlParam, sceneUrls, metadataJson, firstScene, firstUrl, imageUrls, datasetArgs;
1243
+ _parseViewerUrlParams = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(search, firestore) {
1244
+ var searchParams, params, args, viewerSettings, deprecatedChannelSettings, channelSettings, scenes, _yield$loadFromManife, manifestScenes, manifestMetadata, collectionid, msgorigin, getFromStorage, urlParamFromStorage, urlParam, firstScene, firstUrl, imageUrls, datasetArgs;
1146
1245
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
1147
1246
  while (1) switch (_context3.prev = _context3.next) {
1148
1247
  case 0:
1149
- params = getAllowedParams(urlSearchParams);
1248
+ searchParams = new URLSearchParams(search);
1249
+ params = getAllowedParams(searchParams);
1150
1250
  args = {}; // Parse viewer state
1151
1251
  viewerSettings = deserializeViewerState(params); // Parse channel settings. If per-channel settings are provided, they will override
1152
1252
  // the old `ch` query parameter.
@@ -1155,38 +1255,33 @@ function _parseViewerUrlParams() {
1155
1255
  args.viewerChannelSettings = channelSettings !== null && channelSettings !== void 0 ? channelSettings : deprecatedChannelSettings;
1156
1256
 
1157
1257
  // Parse data sources (URL or dataset/id pair)
1158
- if (!(params.manifest !== undefined || params.url !== undefined)) {
1159
- _context3.next = 33;
1258
+ if (!(params.manifest !== undefined || params.url !== undefined || params.collectionid !== undefined)) {
1259
+ _context3.next = 35;
1160
1260
  break;
1161
1261
  }
1162
1262
  if (!params.manifest) {
1163
- _context3.next = 17;
1263
+ _context3.next = 18;
1164
1264
  break;
1165
1265
  }
1166
- _context3.next = 10;
1266
+ _context3.next = 11;
1167
1267
  return loadFromManifest(params.manifest);
1168
- case 10:
1268
+ case 11:
1169
1269
  _yield$loadFromManife = _context3.sent;
1170
1270
  manifestScenes = _yield$loadFromManife.scenes;
1171
1271
  manifestMetadata = _yield$loadFromManife.metadata;
1172
1272
  scenes = manifestScenes;
1173
1273
  args.metadata = manifestMetadata !== null && manifestMetadata !== void 0 ? manifestMetadata : undefined;
1174
- _context3.next = 22;
1274
+ _context3.next = 24;
1175
1275
  break;
1176
- case 17:
1177
- // Load from URL
1178
- getFromStorage = params.url === URL_FETCH_FROM_STORAGE;
1179
- urlParam = getFromStorage ? (_localStorage$getItem = localStorage.getItem("url")) !== null && _localStorage$getItem !== void 0 ? _localStorage$getItem : params.url : params.url; // split encoded url into a list of one or more scenes...
1180
- sceneUrls = (_tryDecodeURLList = tryDecodeURLList(urlParam, /[+ ]/)) !== null && _tryDecodeURLList !== void 0 ? _tryDecodeURLList : [urlParam]; // ...and each scene into a list of multiple sources, if any.
1181
- scenes = sceneUrls.map(function (scene) {
1182
- var _tryDecodeURLList2;
1183
- return (_tryDecodeURLList2 = tryDecodeURLList(scene)) !== null && _tryDecodeURLList2 !== void 0 ? _tryDecodeURLList2 : decodeURL(scene);
1184
- });
1185
- if (getFromStorage) {
1186
- metadataJson = localStorage.getItem("meta");
1187
- args.metadata = metadataJson !== null ? JSON.parse(metadataJson) : undefined;
1188
- }
1189
- case 22:
1276
+ case 18:
1277
+ // Load from URL or storage
1278
+ collectionid = params.collectionid, msgorigin = params.msgorigin;
1279
+ getFromStorage = collectionid !== undefined && msgorigin === undefined;
1280
+ urlParamFromStorage = getFromStorage ? readStoredScenes(collectionid) : undefined;
1281
+ urlParam = urlParamFromStorage !== null && urlParamFromStorage !== void 0 ? urlParamFromStorage : getSearchParamRaw(search, "url");
1282
+ scenes = parseImageURLParam(urlParam);
1283
+ args.metadata = readStoredMetadata(scenes);
1284
+ case 24:
1190
1285
  firstScene = scenes[0]; // Get the very first URL for the download button
1191
1286
  firstUrl = Array.isArray(firstScene) ? firstScene[0] : firstScene; // If there's only one url, just pass that
1192
1287
  imageUrls = scenes.length > 1 || firstScene.length > 1 ? {
@@ -1217,24 +1312,24 @@ function _parseViewerUrlParams() {
1217
1312
  }]
1218
1313
  };
1219
1314
  }
1220
- _context3.next = 38;
1315
+ _context3.next = 40;
1221
1316
  break;
1222
- case 33:
1317
+ case 35:
1223
1318
  if (!(params.dataset && params.id && firestore)) {
1224
- _context3.next = 38;
1319
+ _context3.next = 40;
1225
1320
  break;
1226
1321
  }
1227
- _context3.next = 36;
1322
+ _context3.next = 38;
1228
1323
  return loadDataset(firestore, params.dataset, params.id);
1229
- case 36:
1324
+ case 38:
1230
1325
  datasetArgs = _context3.sent;
1231
1326
  args = _objectSpread(_objectSpread({}, args), datasetArgs);
1232
- case 38:
1327
+ case 40:
1233
1328
  return _context3.abrupt("return", {
1234
1329
  args: removeUndefinedProperties(args),
1235
1330
  viewerSettings: removeUndefinedProperties(viewerSettings)
1236
1331
  });
1237
- case 39:
1332
+ case 41:
1238
1333
  case "end":
1239
1334
  return _context3.stop();
1240
1335
  }
@@ -1242,6 +1337,44 @@ function _parseViewerUrlParams() {
1242
1337
  }));
1243
1338
  return _parseViewerUrlParams.apply(this, arguments);
1244
1339
  }
1340
+ export function addViewerParamsFromMessage(args, message) {
1341
+ var _message$scenes;
1342
+ // get scenes
1343
+ var imageUrl = args.imageUrl;
1344
+ var scenes = (_message$scenes = message.scenes) !== null && _message$scenes !== void 0 ? _message$scenes : typeof imageUrl === "string" ? [imageUrl] : imageUrl.scenes;
1345
+ var firstScene = scenes[0];
1346
+ var newImageUrl = scenes.length === 1 && typeof firstScene === "string" ? firstScene : {
1347
+ scenes: scenes
1348
+ };
1349
+
1350
+ // get metadata
1351
+ var meta = message.meta;
1352
+ var messageMeta = meta && scenes.map(function (scene) {
1353
+ if (Array.isArray(scene)) {
1354
+ // can't handle multi-source scenes (yet)
1355
+ return undefined;
1356
+ }
1357
+ return meta[scene];
1358
+ });
1359
+ var newMetadata = messageMeta !== null && messageMeta !== void 0 ? messageMeta : args.metadata;
1360
+ if (newMetadata === undefined) {
1361
+ return _objectSpread(_objectSpread({}, args), {}, {
1362
+ imageUrl: newImageUrl
1363
+ });
1364
+ } else {
1365
+ return _objectSpread(_objectSpread({}, args), {}, {
1366
+ imageUrl: newImageUrl,
1367
+ metadata: newMetadata
1368
+ });
1369
+ }
1370
+ }
1371
+
1372
+ /**
1373
+ * Serializes the ViewerState and ChannelState of a ViewerStateContext into a URLSearchParams object.
1374
+ * @param state ViewerStateContext to serialize.
1375
+ * @param removeDefaults If true, shortens parameters by removing any properties that match the default state.
1376
+ * This includes the output of GET_DEFAULT_VIEWER_STATE and GET_DEFAULT_CHANNEL_STATE.
1377
+ */
1245
1378
  export function serializeViewerUrlParams(state) {
1246
1379
  var _state$channelSetting;
1247
1380
  var removeDefaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;