@machinemetrics/mm-react-tools 2.1.1 → 2.2.0-dev

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.
@@ -544,11 +544,165 @@ function _taggedTemplateLiteralLoose(strings, raw) {
544
544
  }
545
545
 
546
546
  // A type of promise-like that resolves synchronously and supports only one observer
547
+ const _Pact = /*#__PURE__*/(function() {
548
+ function _Pact() {}
549
+ _Pact.prototype.then = function(onFulfilled, onRejected) {
550
+ const result = new _Pact();
551
+ const state = this.s;
552
+ if (state) {
553
+ const callback = state & 1 ? onFulfilled : onRejected;
554
+ if (callback) {
555
+ try {
556
+ _settle(result, 1, callback(this.v));
557
+ } catch (e) {
558
+ _settle(result, 2, e);
559
+ }
560
+ return result;
561
+ } else {
562
+ return this;
563
+ }
564
+ }
565
+ this.o = function(_this) {
566
+ try {
567
+ const value = _this.v;
568
+ if (_this.s & 1) {
569
+ _settle(result, 1, onFulfilled ? onFulfilled(value) : value);
570
+ } else if (onRejected) {
571
+ _settle(result, 1, onRejected(value));
572
+ } else {
573
+ _settle(result, 2, value);
574
+ }
575
+ } catch (e) {
576
+ _settle(result, 2, e);
577
+ }
578
+ };
579
+ return result;
580
+ };
581
+ return _Pact;
582
+ })();
583
+
584
+ // Settles a pact synchronously
585
+ function _settle(pact, state, value) {
586
+ if (!pact.s) {
587
+ if (value instanceof _Pact) {
588
+ if (value.s) {
589
+ if (state & 1) {
590
+ state = value.s;
591
+ }
592
+ value = value.v;
593
+ } else {
594
+ value.o = _settle.bind(null, pact, state);
595
+ return;
596
+ }
597
+ }
598
+ if (value && value.then) {
599
+ value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
600
+ return;
601
+ }
602
+ pact.s = state;
603
+ pact.v = value;
604
+ const observer = pact.o;
605
+ if (observer) {
606
+ observer(pact);
607
+ }
608
+ }
609
+ }
610
+
611
+ function _isSettledPact(thenable) {
612
+ return thenable instanceof _Pact && thenable.s & 1;
613
+ }
547
614
 
548
615
  const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator"))) : "@@iterator";
549
616
 
550
617
  const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol("Symbol.asyncIterator"))) : "@@asyncIterator";
551
618
 
619
+ // Asynchronously implement a generic for loop
620
+ function _for(test, update, body) {
621
+ var stage;
622
+ for (;;) {
623
+ var shouldContinue = test();
624
+ if (_isSettledPact(shouldContinue)) {
625
+ shouldContinue = shouldContinue.v;
626
+ }
627
+ if (!shouldContinue) {
628
+ return result;
629
+ }
630
+ if (shouldContinue.then) {
631
+ stage = 0;
632
+ break;
633
+ }
634
+ var result = body();
635
+ if (result && result.then) {
636
+ if (_isSettledPact(result)) {
637
+ result = result.s;
638
+ } else {
639
+ stage = 1;
640
+ break;
641
+ }
642
+ }
643
+ if (update) {
644
+ var updateValue = update();
645
+ if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
646
+ stage = 2;
647
+ break;
648
+ }
649
+ }
650
+ }
651
+ var pact = new _Pact();
652
+ var reject = _settle.bind(null, pact, 2);
653
+ (stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
654
+ return pact;
655
+ function _resumeAfterBody(value) {
656
+ result = value;
657
+ do {
658
+ if (update) {
659
+ updateValue = update();
660
+ if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
661
+ updateValue.then(_resumeAfterUpdate).then(void 0, reject);
662
+ return;
663
+ }
664
+ }
665
+ shouldContinue = test();
666
+ if (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {
667
+ _settle(pact, 1, result);
668
+ return;
669
+ }
670
+ if (shouldContinue.then) {
671
+ shouldContinue.then(_resumeAfterTest).then(void 0, reject);
672
+ return;
673
+ }
674
+ result = body();
675
+ if (_isSettledPact(result)) {
676
+ result = result.v;
677
+ }
678
+ } while (!result || !result.then);
679
+ result.then(_resumeAfterBody).then(void 0, reject);
680
+ }
681
+ function _resumeAfterTest(shouldContinue) {
682
+ if (shouldContinue) {
683
+ result = body();
684
+ if (result && result.then) {
685
+ result.then(_resumeAfterBody).then(void 0, reject);
686
+ } else {
687
+ _resumeAfterBody(result);
688
+ }
689
+ } else {
690
+ _settle(pact, 1, result);
691
+ }
692
+ }
693
+ function _resumeAfterUpdate() {
694
+ if (shouldContinue = test()) {
695
+ if (shouldContinue.then) {
696
+ shouldContinue.then(_resumeAfterTest).then(void 0, reject);
697
+ } else {
698
+ _resumeAfterTest(shouldContinue);
699
+ }
700
+ } else {
701
+ _settle(pact, 1, result);
702
+ }
703
+ }
704
+ }
705
+
552
706
  // Asynchronously call a function and send errors to recovery continuation
553
707
  function _catch(body, recover) {
554
708
  try {
@@ -562,6 +716,19 @@ function _catch(body, recover) {
562
716
  return result;
563
717
  }
564
718
 
719
+ // Asynchronously await a promise and pass the result to a finally continuation
720
+ function _finallyRethrows(body, finalizer) {
721
+ try {
722
+ var result = body();
723
+ } catch (e) {
724
+ return finalizer(true, e);
725
+ }
726
+ if (result && result.then) {
727
+ return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
728
+ }
729
+ return finalizer(false, result);
730
+ }
731
+
565
732
  var MMAuthContext = React.createContext();
566
733
 
567
734
  var MMAuthInternalContext = React.createContext();
@@ -1189,8 +1356,9 @@ var Authorize = function Authorize(_ref) {
1189
1356
  return !isAuthenticated ? /*#__PURE__*/React.createElement(Message, null, "Authorizing...") : /*#__PURE__*/React.createElement(Done, null);
1190
1357
  };
1191
1358
 
1192
- var ApolloApp = function ApolloApp(_ref) {
1359
+ var DataWrapper = function DataWrapper(_ref) {
1193
1360
  var jwtRef = _ref.jwtRef,
1361
+ natsCredsRef = _ref.natsCredsRef,
1194
1362
  graphQLRoleOverride = _ref.graphQLRoleOverride,
1195
1363
  clientId = _ref.clientId,
1196
1364
  accessToken = _ref.accessToken;
@@ -1299,6 +1467,7 @@ var ApolloApp = function ApolloApp(_ref) {
1299
1467
  return /*#__PURE__*/React.createElement(MMAuthInternalContext.Provider, {
1300
1468
  value: {
1301
1469
  link: link,
1470
+ natsCredsRef: natsCredsRef,
1302
1471
  jwtRef: jwtRef,
1303
1472
  clientId: clientId,
1304
1473
  accessToken: accessToken
@@ -1323,10 +1492,7 @@ var MMJwtProvider = function MMJwtProvider(_ref) {
1323
1492
  setIsAuthenticated = _useState[1];
1324
1493
 
1325
1494
  var jwtRef = useRef();
1326
-
1327
- var _useState2 = useState(),
1328
- natsCreds = _useState2[0],
1329
- setNatsCreds = _useState2[1];
1495
+ var natsCredsRef = useRef();
1330
1496
 
1331
1497
  var logout = function logout() {
1332
1498
  try {
@@ -1393,13 +1559,13 @@ var MMJwtProvider = function MMJwtProvider(_ref) {
1393
1559
  useAsyncInterval(function () {
1394
1560
  try {
1395
1561
  if (!accessToken) {
1396
- setNatsCreds();
1562
+ natsCredsRef.current = null;
1397
1563
  return Promise.resolve();
1398
1564
  }
1399
1565
 
1400
1566
  var _temp5 = _catch(function () {
1401
1567
  return Promise.resolve(request(urls.apiUrl + "/nats-token")).then(function (response) {
1402
- setNatsCreds(response);
1568
+ natsCredsRef.current = response;
1403
1569
  });
1404
1570
  }, function () {});
1405
1571
 
@@ -1414,8 +1580,7 @@ var MMJwtProvider = function MMJwtProvider(_ref) {
1414
1580
  login: login,
1415
1581
  logout: logout,
1416
1582
  request: request,
1417
- urls: urls,
1418
- natsCreds: natsCreds
1583
+ urls: urls
1419
1584
  }
1420
1585
  }, /*#__PURE__*/React.createElement(Routes, null, /*#__PURE__*/React.createElement(Route, {
1421
1586
  exact: true,
@@ -1425,10 +1590,11 @@ var MMJwtProvider = function MMJwtProvider(_ref) {
1425
1590
  })
1426
1591
  }), /*#__PURE__*/React.createElement(Route, {
1427
1592
  path: "/",
1428
- element: /*#__PURE__*/React.createElement(ApolloApp, {
1593
+ element: /*#__PURE__*/React.createElement(DataWrapper, {
1429
1594
  clientId: clientId,
1430
1595
  graphQLRoleOverride: graphQLRoleOverride,
1431
1596
  jwtRef: jwtRef,
1597
+ natsCredsRef: natsCredsRef,
1432
1598
  accessToken: accessToken
1433
1599
  })
1434
1600
  }, children))));
@@ -1472,21 +1638,26 @@ var MMProvider = function MMProvider(_ref) {
1472
1638
  clientId = _ref.clientId,
1473
1639
  clientSecret = _ref.clientSecret,
1474
1640
  releaseStage = _ref.releaseStage,
1475
- graphQLRoleOverride = _ref.graphQLRoleOverride;
1641
+ graphQLRoleOverride = _ref.graphQLRoleOverride,
1642
+ customUrls = _ref.urls;
1476
1643
 
1477
1644
  if (releaseStage === 'release') {
1478
1645
  releaseStage = 'production';
1479
1646
  console.warn("releaseStage \"release\" has been deprecated. use \"production\" instead.");
1480
1647
  }
1481
1648
 
1482
- var urls = URL_MAP[releaseStage];
1649
+ var urls;
1483
1650
 
1484
- if (!urls) {
1651
+ if (URL_MAP[releaseStage]) {
1652
+ urls = URL_MAP[releaseStage];
1653
+ } else {
1485
1654
  var stages = _.keys(URL_MAP).join(', ');
1486
1655
 
1487
1656
  throw Error("MMProvider releaseStage must be one of the following: " + stages);
1488
1657
  }
1489
1658
 
1659
+ urls = _.merge(urls, customUrls);
1660
+
1490
1661
  var _useState = useState(retrieveAccessToken()),
1491
1662
  accessToken = _useState[0],
1492
1663
  setAccessToken = _useState[1];
@@ -1574,17 +1745,14 @@ var MMProvider = function MMProvider(_ref) {
1574
1745
  }));
1575
1746
  };
1576
1747
 
1748
+ var ALLOWED_DELIVERY_POLICIES = ['new', 'last', 'last_per_subject'];
1749
+
1577
1750
  var connectToServer = function connectToServer(url, creds) {
1578
1751
  try {
1579
- var credentialsBytes = new TextEncoder().encode(creds);
1580
- return Promise.resolve(_catch(function () {
1581
- return Promise.resolve(connect({
1582
- servers: [url],
1583
- authenticator: credsAuthenticator(credentialsBytes)
1584
- }));
1585
- }, function (error) {
1586
- console.error("Error connecting to server: " + error.message);
1587
- throw error;
1752
+ console.info("Connecting to server " + url);
1753
+ return Promise.resolve(connect({
1754
+ servers: [url],
1755
+ authenticator: credsAuthenticator(new TextEncoder().encode(creds))
1588
1756
  }));
1589
1757
  } catch (e) {
1590
1758
  return Promise.reject(e);
@@ -1631,7 +1799,7 @@ function _decode() {
1631
1799
  case 14:
1632
1800
  _context.prev = 14;
1633
1801
  _context.t0 = _context["catch"](9);
1634
- console.warn("Skipping event\n" + JSON.stringify(event, null, 2) + "\n" + _context.t0);
1802
+ console.warn("Skipping event: " + _context.t0);
1635
1803
 
1636
1804
  case 17:
1637
1805
  _iteratorAbruptCompletion = false;
@@ -1686,67 +1854,212 @@ function _decode() {
1686
1854
  return _decode.apply(this, arguments);
1687
1855
  }
1688
1856
 
1689
- var useEventStream = function useEventStream(_ref) {
1690
- var streamName = _ref.streamName,
1691
- subject = _ref.subject;
1857
+ var closeConnection = function closeConnection(eventStreamRef, connectionRef) {
1858
+ if (eventStreamRef.current) {
1859
+ eventStreamRef.current = undefined;
1860
+ }
1861
+
1862
+ if (connectionRef.current) {
1863
+ connectionRef.current.close();
1864
+ connectionRef.current = undefined;
1865
+ }
1866
+ };
1867
+
1868
+ var streamPatterns = {
1869
+ scada: 'mm.0.[location-ref].[machine-ref].[qualifier].[data-category].[metric-key].[message-type]',
1870
+ 'machine-service': 'mm.2.[location-ref].[machine-ref].[service-name].[qualifier].[data-category].[metric-key].[message-type]',
1871
+ 'edge-service': 'mm.3.[location-ref].[edge-ref].[service-name].[data-category].[metric-key].[message-type]',
1872
+ 'machine-source-service': 'mm.4.[location-ref].[machine-ref].[machine-source-ref].[service-name].[data-category].[metric-key].[message-type]',
1873
+ edge: 'mm.7.[location-ref].[edge-ref].[data-category].[metric-key].[message-type]'
1874
+ };
1875
+ var dataCategoryMapping = {
1876
+ undefined: 0,
1877
+ event: 1,
1878
+ eventset: 2,
1879
+ quantity: 3,
1880
+ state: 4,
1881
+ count: 5,
1882
+ info: 6,
1883
+ beat: 7
1884
+ };
1885
+
1886
+ var buildSubject = function buildSubject(streamName, locationRef, filter) {
1887
+ if (!streamPatterns[streamName]) {
1888
+ throw new Error('Unknown stream name');
1889
+ }
1890
+
1891
+ var pattern = streamPatterns[streamName].split('.');
1892
+ var subject = '';
1893
+ pattern.forEach(function (part, index) {
1894
+ switch (part) {
1895
+ case '[location-ref]':
1896
+ subject += '.' + locationRef;
1897
+ break;
1898
+
1899
+ case '[machine-ref]':
1900
+ subject += '.' + ((filter === null || filter === void 0 ? void 0 : filter.machineRef) || '*');
1901
+ break;
1902
+
1903
+ case '[qualifier]':
1904
+ subject += '.' + ((filter === null || filter === void 0 ? void 0 : filter.qualifier) || '0');
1905
+ break;
1906
+
1907
+ case '[data-category]':
1908
+ subject += '.' + (dataCategoryMapping[filter === null || filter === void 0 ? void 0 : filter.dataCategory] || '*');
1909
+ break;
1910
+
1911
+ case '[metric-key]':
1912
+ subject += '.' + (filter !== null && filter !== void 0 && filter.metricKey ? filter === null || filter === void 0 ? void 0 : filter.metricKey.toLowerCase().replace(/[^a-zA-Z0-9_\\-]/gi, '-') : '*');
1913
+ break;
1914
+
1915
+ case '[message-type]':
1916
+ subject += '.' + ((filter === null || filter === void 0 ? void 0 : filter.messageType) || '0');
1917
+ break;
1918
+
1919
+ case '[edge-ref]':
1920
+ subject += '.' + ((filter === null || filter === void 0 ? void 0 : filter.edgeRef) || '*');
1921
+ break;
1922
+
1923
+ case '[service-name]':
1924
+ subject += '.' + ((filter === null || filter === void 0 ? void 0 : filter.serviceName) || '*');
1925
+ break;
1926
+
1927
+ case '[machine-source-ref]':
1928
+ subject += '.' + ((filter === null || filter === void 0 ? void 0 : filter.machineSourceRef) || '*');
1929
+ break;
1930
+
1931
+ default:
1932
+ if (index > 0) {
1933
+ subject += '.';
1934
+ }
1935
+
1936
+ subject += part;
1937
+ break;
1938
+ }
1939
+ });
1940
+ return subject;
1941
+ };
1942
+
1943
+ var useEventStream = function useEventStream(params) {
1944
+ var streamName = params.streamName,
1945
+ locationRef = params.locationRef,
1946
+ filters = params.filters,
1947
+ _params$deliverPolicy = params.deliverPolicy,
1948
+ deliverPolicy = _params$deliverPolicy === void 0 ? 'new' : _params$deliverPolicy,
1949
+ dispatch = params.dispatch;
1950
+
1951
+ if (!ALLOWED_DELIVERY_POLICIES.includes(deliverPolicy)) {
1952
+ throw new Error("Invalid deliverPolicy \"" + deliverPolicy + "\" specified. Valid options are: " + ALLOWED_DELIVERY_POLICIES.join(', '));
1953
+ }
1954
+
1955
+ if (filters && filters.length > 1) {
1956
+ console.warn("Multiple filters are not supported. Only the first filter will be used.");
1957
+ }
1692
1958
 
1693
1959
  var _useMMAuth = useMMAuth(),
1694
- natsCreds = _useMMAuth.natsCreds,
1695
1960
  urls = _useMMAuth.urls;
1696
1961
 
1697
- var _useState = useState(),
1698
- connection = _useState[0],
1699
- setConnection = _useState[1];
1700
-
1701
- var _useState2 = useState(),
1702
- eventStream = _useState2[0],
1703
- setEventStream = _useState2[1];
1962
+ var _useMMAuthInternal2 = _useMMAuthInternal(),
1963
+ natsCredsRef = _useMMAuthInternal2.natsCredsRef;
1704
1964
 
1965
+ var connectionRef = useRef();
1966
+ var eventStreamRef = useRef();
1705
1967
  useEffect(function () {
1706
- if (eventStream === undefined) {
1707
- if (natsCreds && subject) {
1708
- connectToServer(urls.natsUrl, natsCreds).then(function (conn) {
1709
- try {
1710
- var _temp2 = function _temp2(stream) {
1711
- return jc.consumers.get(stream, {
1712
- filterSubjects: subject,
1713
- deliver_policy: 'last_per_subject'
1714
- });
1715
- };
1968
+ if (!urls.natsUrl || !natsCredsRef.current || !streamName || !locationRef) return;
1716
1969
 
1717
- setConnection(conn);
1718
- var jc = conn.jetstream();
1719
- console.log('Consuming from subject:', subject);
1720
- return Promise.resolve(streamName ? _temp2(streamName) : Promise.resolve(jc.findStream(subject)).then(_temp2));
1721
- } catch (e) {
1722
- return Promise.reject(e);
1723
- }
1724
- }).then(function (consumer) {
1725
- try {
1726
- return Promise.resolve(consumer.consume({
1727
- max_messages: 1000
1728
- })).then(function (messages) {
1729
- var events = decode(messages);
1730
- setEventStream(events);
1970
+ var setupStream = function setupStream() {
1971
+ try {
1972
+ return Promise.resolve(_catch(function () {
1973
+ return Promise.resolve(connectToServer(urls.natsUrl, natsCredsRef.current)).then(function (conn) {
1974
+ connectionRef.current = conn;
1975
+ var subject = buildSubject(streamName, locationRef, filters === null || filters === void 0 ? void 0 : filters[0]);
1976
+ console.info("Consuming events from stream " + streamName + " filtering by subject " + subject);
1977
+ return Promise.resolve(conn.jetstream().consumers.get(streamName, {
1978
+ deliver_policy: deliverPolicy,
1979
+ filterSubjects: subject
1980
+ })).then(function (consumer) {
1981
+ return Promise.resolve(consumer.consume({
1982
+ max_messages: 1000
1983
+ })).then(function (messages) {
1984
+ var eventStream = decode(messages);
1985
+ eventStreamRef.current = eventStream;
1986
+ return function () {
1987
+ if (typeof dispatch === 'function') {
1988
+ var _iteratorAbruptCompletion2 = false;
1989
+ var _didIteratorError2 = false;
1990
+
1991
+ var _iteratorError2;
1992
+
1993
+ return _finallyRethrows(function () {
1994
+ return _catch(function () {
1995
+ var _iterator2 = _asyncIterator(eventStream),
1996
+ _step2;
1997
+
1998
+ var _temp = _for(function () {
1999
+ return Promise.resolve(_iterator2.next()).then(function (_iterator2$next) {
2000
+ return _iteratorAbruptCompletion2 = !(_step2 = _iterator2$next).done;
2001
+ });
2002
+ }, function () {
2003
+ return !!(_iteratorAbruptCompletion2 = false);
2004
+ }, function () {
2005
+ var event = _step2.value;
2006
+ dispatch(event);
2007
+ });
2008
+
2009
+ if (_temp && _temp.then) return _temp.then(function () {});
2010
+ }, function (err) {
2011
+ _didIteratorError2 = true;
2012
+ _iteratorError2 = err;
2013
+ });
2014
+ }, function (_wasThrown, _result2) {
2015
+ var _exit = false;
2016
+
2017
+ function _temp4(_result3) {
2018
+ if (_exit) return _result3;
2019
+ if (_wasThrown) throw _result2;
2020
+ return _result2;
2021
+ }
2022
+
2023
+ var _temp3 = _finallyRethrows(function () {
2024
+ var _temp2 = function () {
2025
+ if (_iteratorAbruptCompletion2 && _iterator2["return"] != null) {
2026
+ return Promise.resolve(_iterator2["return"]()).then(function () {});
2027
+ }
2028
+ }();
2029
+
2030
+ if (_temp2 && _temp2.then) return _temp2.then(function () {});
2031
+ }, function (_wasThrown2, _result3) {
2032
+ if (_didIteratorError2) {
2033
+ throw _iteratorError2;
2034
+ }
2035
+
2036
+ if (_wasThrown2) throw _result3;
2037
+ return _result3;
2038
+ });
2039
+
2040
+ return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
2041
+ });
2042
+ }
2043
+ }();
2044
+ });
1731
2045
  });
1732
- } catch (e) {
1733
- return Promise.reject(e);
1734
- }
1735
- });
2046
+ });
2047
+ }, function (error) {
2048
+ console.error("Error setting up event stream. " + error);
2049
+ }));
2050
+ } catch (e) {
2051
+ return Promise.reject(e);
1736
2052
  }
1737
- } else {
1738
- return function () {
1739
- if (eventStream) {
1740
- setEventStream(undefined);
1741
- }
2053
+ };
1742
2054
 
1743
- if (connection) {
1744
- connection.close();
1745
- }
1746
- };
1747
- }
1748
- }, [subject, natsCreds]);
1749
- return eventStream;
2055
+ setupStream();
2056
+ return function () {
2057
+ return closeConnection(eventStreamRef, connectionRef);
2058
+ };
2059
+ }, [streamName, locationRef, deliverPolicy, urls.natsUrl, natsCredsRef]);
2060
+ return [eventStreamRef.current, function () {
2061
+ return closeConnection(eventStreamRef, connectionRef);
2062
+ }];
1750
2063
  };
1751
2064
 
1752
2065
  export { MMProvider, PrivateLayout, _useMMAuthInternal, useApiRequest, useAsyncEffect, useAsyncInterval, useDowntimeQuery, useEventStream, useMMAuth, useMMHash, useMMTemplates, useProductionQuery, useQuantityStream, useThrottleEffect };