cozy-external-bridge 0.9.0 → 0.10.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.
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.handleRequestParentOrigin = exports.getIframe = exports.extractUrl = void 0;
6
+ exports.handleParentOriginRequest = exports.getIframe = exports.extractUrl = void 0;
7
7
 
8
8
  var getIframe = function getIframe() {
9
9
  var iframe = document.getElementById('embeddedApp');
@@ -28,7 +28,7 @@ var extractUrl = function extractUrl(url) {
28
28
 
29
29
  exports.extractUrl = extractUrl;
30
30
 
31
- var handleRequestParentOrigin = function handleRequestParentOrigin(event, origin) {
31
+ var handleParentOriginRequest = function handleParentOriginRequest(event, origin) {
32
32
  // We do not care about message from other origin that our iframe
33
33
  if (event.origin !== origin) {
34
34
  return;
@@ -40,4 +40,4 @@ var handleRequestParentOrigin = function handleRequestParentOrigin(event, origin
40
40
  }
41
41
  };
42
42
 
43
- exports.handleRequestParentOrigin = handleRequestParentOrigin;
43
+ exports.handleParentOriginRequest = handleParentOriginRequest;
@@ -2,7 +2,7 @@ import { renderHook } from '@testing-library/react-hooks'
2
2
  import { useLocation } from 'react-router-dom'
3
3
 
4
4
  import { getIframe } from './helpers'
5
- import { useInitialRedirection } from './hooks'
5
+ import { useRedirectOnLoad } from './useRedirectOnLoad'
6
6
 
7
7
  jest.mock('react-router-dom', () => ({
8
8
  useLocation: jest.fn()
@@ -27,7 +27,7 @@ describe('useInitialRedirection', () => {
27
27
  const mockIframe = { src: 'https://alice-chat.mycozy.cloud' }
28
28
  mockedGetIframe.mockReturnValue(mockIframe)
29
29
 
30
- renderHook(() => useInitialRedirection())
30
+ renderHook(() => useRedirectOnLoad())
31
31
 
32
32
  expect(mockIframe.src).toBe('https://alice-chat.mycozy.cloud')
33
33
  })
@@ -39,7 +39,7 @@ describe('useInitialRedirection', () => {
39
39
  const mockIframe = { src: 'https://alice-chat.mycozy.cloud' }
40
40
  mockedGetIframe.mockReturnValue(mockIframe)
41
41
 
42
- renderHook(() => useInitialRedirection())
42
+ renderHook(() => useRedirectOnLoad())
43
43
 
44
44
  expect(mockIframe.src).toBe('https://alice-chat.mycozy.cloud/welcome')
45
45
  })
@@ -55,7 +55,7 @@ describe('useInitialRedirection', () => {
55
55
  const mockIframe = { src: 'https://alice-chat.mycozy.cloud' }
56
56
  mockedGetIframe.mockReturnValue(mockIframe)
57
57
 
58
- renderHook(() => useInitialRedirection())
58
+ renderHook(() => useRedirectOnLoad())
59
59
 
60
60
  expect(mockIframe.src).toBe(
61
61
  'https://alice-chat.mycozy.cloud/welcome/bridge'
@@ -1,94 +1,29 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
6
  exports.useExternalBridge = void 0;
9
7
 
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
-
14
- var Comlink = _interopRequireWildcard(require("comlink"));
15
-
16
- var _react = require("react");
17
-
18
- var _reactRouterDom = require("react-router-dom");
19
-
20
- var _cozyClient = require("cozy-client");
21
-
22
- var _cozyFlags = _interopRequireDefault(require("cozy-flags"));
8
+ var _useListenBridgeRequests = require("./useListenBridgeRequests");
23
9
 
24
- var _cozyMinilog = _interopRequireDefault(require("cozy-minilog"));
10
+ var _useListenParentOriginRequest = require("./useListenParentOriginRequest");
25
11
 
26
- var _constants = require("./constants");
27
-
28
- var _helpers = require("./helpers");
29
-
30
- var _hooks = require("./hooks");
31
-
32
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
-
34
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
-
36
- var log = (0, _cozyMinilog.default)('🌉 [Container bridge]');
12
+ var _useRedirectOnLoad = require("./useRedirectOnLoad");
37
13
 
38
14
  var useExternalBridge = function useExternalBridge(origin) {
39
- var client = (0, _cozyClient.useClient)();
40
- var navigate = (0, _reactRouterDom.useNavigate)();
41
- (0, _hooks.useInitialRedirection)();
42
- (0, _hooks.useParentOrigin)(origin);
43
- (0, _react.useEffect)(function () {
44
- if (!client) return;
45
- var exposedMethods = {
46
- // Proof of concepts of Twake <-> Cozy communication
47
- getContacts: function () {
48
- var _getContacts = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
49
- var _ref, data;
50
-
51
- return _regenerator.default.wrap(function _callee$(_context) {
52
- while (1) {
53
- switch (_context.prev = _context.next) {
54
- case 0:
55
- _context.next = 2;
56
- return client.query((0, _cozyClient.Q)('io.cozy.contacts'));
57
-
58
- case 2:
59
- _ref = _context.sent;
60
- data = _ref.data;
61
- return _context.abrupt("return", data);
15
+ (0, _useRedirectOnLoad.useRedirectOnLoad)();
62
16
 
63
- case 5:
64
- case "end":
65
- return _context.stop();
66
- }
67
- }
68
- }, _callee);
69
- }));
17
+ var _useListenParentOrigi = (0, _useListenParentOriginRequest.useListenParentOriginRequest)(origin),
18
+ isParentOriginRequestListenerReady = _useListenParentOrigi.isReady;
70
19
 
71
- function getContacts() {
72
- return _getContacts.apply(this, arguments);
73
- }
20
+ var _useListenBridgeReque = (0, _useListenBridgeRequests.useListenBridgeRequests)(origin),
21
+ isBridgeListenerReady = _useListenBridgeReque.isReady;
74
22
 
75
- return getContacts;
76
- }(),
77
- getFlag: function getFlag(key) {
78
- return (0, _cozyFlags.default)(key);
79
- },
80
- // Proof of concepts of Twake <-> Cozy URL synchronization
81
- updateHistory: function updateHistory(newUrl) {
82
- var url = (0, _helpers.extractUrl)(newUrl);
83
- log.debug("Navigating to ".concat(url, " because received ").concat(newUrl, " from embedded app"));
84
- navigate(_constants.BRIDGE_ROUTE_PREFIX + url, {
85
- replace: true
86
- });
87
- }
88
- };
89
- Comlink.expose(exposedMethods, Comlink.windowEndpoint((0, _helpers.getIframe)().contentWindow, self, origin));
90
- log.debug('Bridge initialized');
91
- }, [navigate, client, origin]);
23
+ var isReady = isParentOriginRequestListenerReady && isBridgeListenerReady;
24
+ return {
25
+ isReady: isReady
26
+ };
92
27
  };
93
28
 
94
29
  exports.useExternalBridge = useExternalBridge;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useListenBridgeRequests = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var Comlink = _interopRequireWildcard(require("comlink"));
17
+
18
+ var _react = require("react");
19
+
20
+ var _reactRouterDom = require("react-router-dom");
21
+
22
+ var _cozyClient = require("cozy-client");
23
+
24
+ var _cozyFlags = _interopRequireDefault(require("cozy-flags"));
25
+
26
+ var _cozyMinilog = _interopRequireDefault(require("cozy-minilog"));
27
+
28
+ var _constants = require("./constants");
29
+
30
+ var _helpers = require("./helpers");
31
+
32
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
+
34
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
+
36
+ var log = (0, _cozyMinilog.default)('🌉 [Container bridge]');
37
+
38
+ var useListenBridgeRequests = function useListenBridgeRequests(origin) {
39
+ var client = (0, _cozyClient.useClient)();
40
+ var navigate = (0, _reactRouterDom.useNavigate)();
41
+
42
+ var _useState = (0, _react.useState)(false),
43
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
44
+ isReady = _useState2[0],
45
+ setIsReady = _useState2[1];
46
+
47
+ (0, _react.useEffect)(function () {
48
+ if (!client) return;
49
+ var exposedMethods = {
50
+ // Proof of concepts of Twake <-> Cozy communication
51
+ getContacts: function () {
52
+ var _getContacts = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
53
+ var _ref, data;
54
+
55
+ return _regenerator.default.wrap(function _callee$(_context) {
56
+ while (1) {
57
+ switch (_context.prev = _context.next) {
58
+ case 0:
59
+ _context.next = 2;
60
+ return client.query((0, _cozyClient.Q)('io.cozy.contacts'));
61
+
62
+ case 2:
63
+ _ref = _context.sent;
64
+ data = _ref.data;
65
+ return _context.abrupt("return", data);
66
+
67
+ case 5:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }
72
+ }, _callee);
73
+ }));
74
+
75
+ function getContacts() {
76
+ return _getContacts.apply(this, arguments);
77
+ }
78
+
79
+ return getContacts;
80
+ }(),
81
+ getFlag: function getFlag(key) {
82
+ return (0, _cozyFlags.default)(key);
83
+ },
84
+ // Proof of concepts of Twake <-> Cozy URL synchronization
85
+ updateHistory: function updateHistory(newUrl) {
86
+ var url = (0, _helpers.extractUrl)(newUrl);
87
+ log.debug("Navigating to ".concat(url, " because received ").concat(newUrl, " from embedded app"));
88
+ navigate(_constants.BRIDGE_ROUTE_PREFIX + url, {
89
+ replace: true
90
+ });
91
+ }
92
+ };
93
+ Comlink.expose(exposedMethods, Comlink.windowEndpoint((0, _helpers.getIframe)().contentWindow, self, origin));
94
+ log.debug('Listening to bridge requests');
95
+ setIsReady(true);
96
+ }, [navigate, client, origin]);
97
+ return {
98
+ isReady: isReady
99
+ };
100
+ };
101
+
102
+ exports.useListenBridgeRequests = useListenBridgeRequests;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useListenParentOriginRequest = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _react = require("react");
13
+
14
+ var _cozyClient = require("cozy-client");
15
+
16
+ var _cozyMinilog = _interopRequireDefault(require("cozy-minilog"));
17
+
18
+ var _helpers = require("./helpers");
19
+
20
+ var log = (0, _cozyMinilog.default)('🌉 [Container bridge]');
21
+
22
+ // Allow the iframe to request the origin of the parent window
23
+ var useListenParentOriginRequest = function useListenParentOriginRequest(origin) {
24
+ var client = (0, _cozyClient.useClient)();
25
+
26
+ var _useState = (0, _react.useState)(false),
27
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
28
+ isReady = _useState2[0],
29
+ setIsReady = _useState2[1];
30
+
31
+ (0, _react.useEffect)(function () {
32
+ if (!client) return;
33
+
34
+ var parentOriginRequestHandler = function parentOriginRequestHandler(event) {
35
+ return (0, _helpers.handleParentOriginRequest)(event, origin);
36
+ };
37
+
38
+ window.addEventListener('message', parentOriginRequestHandler);
39
+ log.debug('Listening to parent origin request');
40
+ setIsReady(true);
41
+ return function () {
42
+ window.removeEventListener('message', parentOriginRequestHandler);
43
+ };
44
+ }, [client, origin]);
45
+ return {
46
+ isReady: isReady
47
+ };
48
+ };
49
+
50
+ exports.useListenParentOriginRequest = useListenParentOriginRequest;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useRedirectOnLoad = void 0;
9
+
10
+ var _react = require("react");
11
+
12
+ var _reactRouterDom = require("react-router-dom");
13
+
14
+ var _cozyMinilog = _interopRequireDefault(require("cozy-minilog"));
15
+
16
+ var _constants = require("./constants");
17
+
18
+ var _helpers = require("./helpers");
19
+
20
+ var log = (0, _cozyMinilog.default)('🌉 [Container bridge]'); // When we load the container app, we want to forward
21
+ // the relevant part of the URL to the iframe
22
+
23
+ var useRedirectOnLoad = function useRedirectOnLoad() {
24
+ var location = (0, _reactRouterDom.useLocation)();
25
+ (0, _react.useEffect)(function () {
26
+ if (location.pathname.startsWith(_constants.BRIDGE_ROUTE_PREFIX)) {
27
+ var iframe = (0, _helpers.getIframe)();
28
+ var destUrl = new URL(iframe.src);
29
+ destUrl.pathname = location.pathname.replace(_constants.BRIDGE_ROUTE_PREFIX, '');
30
+ destUrl.hash = location.hash;
31
+ destUrl.search = location.search;
32
+ iframe.src = destUrl.toString();
33
+ log.debug('Redirecting iframe to', destUrl.toString());
34
+ }
35
+ }, []);
36
+ };
37
+
38
+ exports.useRedirectOnLoad = useRedirectOnLoad;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cozy-external-bridge",
3
3
  "description": "Library allows communication between a container app and an app embedded in an iframe",
4
- "version": "0.9.0",
4
+ "version": "0.10.0",
5
5
  "author": {
6
6
  "name": "Cozy Cloud",
7
7
  "url": "https://github.com/cozy"
@@ -68,5 +68,5 @@
68
68
  "lint": "cd ../.. && yarn eslint --ext js,jsx,ts packages/cozy-external-bridge"
69
69
  },
70
70
  "types": "dist/index.d.ts",
71
- "gitHead": "32b4cd0c82173f5b7703066949011d74810f273e"
71
+ "gitHead": "7f514d6c45cce3e980d239c421e370c9f8b49498"
72
72
  }
@@ -1,53 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useParentOrigin = exports.useInitialRedirection = void 0;
7
-
8
- var _react = require("react");
9
-
10
- var _reactRouterDom = require("react-router-dom");
11
-
12
- var _cozyClient = require("cozy-client");
13
-
14
- var _constants = require("./constants");
15
-
16
- var _helpers = require("./helpers");
17
-
18
- // Initial redirection is necessary when we load a page from a direct link
19
- // to load the iframe to the direct link
20
- var useInitialRedirection = function useInitialRedirection() {
21
- var location = (0, _reactRouterDom.useLocation)();
22
- (0, _react.useEffect)(function () {
23
- if (location.pathname.startsWith(_constants.BRIDGE_ROUTE_PREFIX)) {
24
- var iframe = (0, _helpers.getIframe)();
25
- var destUrl = new URL(iframe.src);
26
- destUrl.pathname = location.pathname.replace(_constants.BRIDGE_ROUTE_PREFIX, '');
27
- destUrl.hash = location.hash;
28
- destUrl.search = location.search;
29
- iframe.src = destUrl.toString();
30
- }
31
- }, []);
32
- }; // Allow the iframe to request the origin of the parent window
33
-
34
-
35
- exports.useInitialRedirection = useInitialRedirection;
36
-
37
- var useParentOrigin = function useParentOrigin(origin) {
38
- var client = (0, _cozyClient.useClient)();
39
- (0, _react.useEffect)(function () {
40
- if (!client) return;
41
-
42
- var requestParentOriginHandler = function requestParentOriginHandler(event) {
43
- return (0, _helpers.handleRequestParentOrigin)(event, origin);
44
- };
45
-
46
- window.addEventListener('message', requestParentOriginHandler);
47
- return function () {
48
- window.removeEventListener('message', requestParentOriginHandler);
49
- };
50
- }, [client, origin]);
51
- };
52
-
53
- exports.useParentOrigin = useParentOrigin;