Skip to content

Commit 61ceb47

Browse files
committed
Better handling of circular references
1 parent af55fa1 commit 61ceb47

File tree

4 files changed

+26
-44
lines changed

4 files changed

+26
-44
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"redux": "^3.5.2",
8080
"redux-devtools": "^3.3.1",
8181
"redux-devtools-instrument": "^1.3.2",
82-
"remotedev-app": "^0.8.0-beta-8",
82+
"remotedev-app": "^0.8.0-beta-12",
8383
"remotedev-slider": "^1.0.1",
8484
"remotedev-utils": "0.0.1"
8585
}

src/app/api/index.js

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,28 @@
1-
import jsan from 'jsan';
1+
import { stringify } from 'jsan';
22

33
const listeners = {};
44
export const source = '@devtools-page';
5-
let isCircular;
6-
7-
export default function stringify(obj, replacer, type) {
8-
if (type === 2) { // Deep serialization
9-
return jsan.stringify(obj, function(key, value) {
10-
if (value && value.toJS) { return value.toJS(); }
11-
return value;
12-
}, null, true);
13-
}
14-
return jsan.stringify(obj, replacer);
15-
}
165

176
export function generateId(instanceId) {
187
return instanceId || Math.random().toString(36).substr(2);
198
}
209

21-
function tryCatch(fn, args) {
22-
try {
23-
return fn(args);
24-
} catch (err) {
25-
isCircular = true;
26-
toContentScript(args);
27-
}
28-
}
29-
3010
function post(message) {
3111
window.postMessage(message, '*');
3212
}
3313

3414
export function toContentScript(message, shouldStringify, serializeState, serializeAction) {
35-
if (shouldStringify || isCircular) {
36-
if (message.type !== 'ERROR' && message.type !== 'GET_REPORT' && message.payload) {
37-
message.payload = stringify(message.payload, serializeState);
38-
}
39-
if (message.type !== 'STATE' && message.action) {
40-
message.action = stringify(message.action, serializeAction);
41-
}
42-
post(message);
43-
} else {
44-
tryCatch(post, message);
15+
if (message.type === 'ACTION') {
16+
message.action = stringify(message.action, serializeAction);
17+
message.payload = stringify(message.payload, serializeState);
18+
} else if (message.type === 'STATE') {
19+
const { actionsById, computedStates, committedState, ...rest } = message.payload;
20+
message.payload = rest;
21+
message.actionsById = stringify(actionsById, serializeAction);
22+
message.computedStates = stringify(computedStates, serializeState);
23+
message.committedState = stringify(committedState, serializeState);
4524
}
25+
post(message);
4626
}
4727

4828
export function sendMessage(action, state, shouldStringify, id, name) {

test/app/inject/api.spec.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe('API', () => {
3333
});
3434
expect(message).toInclude({
3535
type: 'ACTION',
36-
action: { action: { type: 'hi' } },
36+
action: '{"action":{"type":"hi"}}',
3737
payload: undefined,
3838
id: undefined,
3939
name: '',
@@ -45,8 +45,8 @@ describe('API', () => {
4545
});
4646
expect(message).toInclude({
4747
type: 'ACTION',
48-
action: { action: { type: 'hi' } },
49-
payload: { counter: 1 },
48+
action: '{"action":{"type":"hi"}}',
49+
payload: '{"counter":1}',
5050
instanceId: 1,
5151
name: '',
5252
source: '@devtools-page'
@@ -70,6 +70,9 @@ describe('API', () => {
7070
expect(message).toEqual({
7171
type: 'STATE',
7272
payload: { counter: 1 },
73+
actionsById: undefined,
74+
computedStates: undefined,
75+
committedState: undefined,
7376
instanceId: 1,
7477
name: '',
7578
source: '@devtools-page'

test/app/inject/enhancer.spec.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ describe('Redux enhancer', () => {
3131

3232
message = await listenMessage();
3333
expect(message.type).toBe('STATE');
34-
expect(message.payload.actionsById[0].action.type).toBe('@@INIT');
35-
expect(message.payload.computedStates[0].state).toBe(0);
34+
expect(message.actionsById).toInclude('{"0":{"type":"PERFORM_ACTION","action":{"type":"@@INIT"},"');
35+
expect(message.computedStates).toBe('[{"state":0}]');
3636
});
3737

3838
it('should perform actions', async () => {
@@ -41,16 +41,16 @@ describe('Redux enhancer', () => {
4141
expect(window.store.getState()).toBe(1);
4242
});
4343
expect(message.type).toBe('ACTION');
44-
expect(message.action.action.type).toBe('INCREMENT');
45-
expect(message.payload).toBe(1);
44+
expect(message.action).toInclude('{"type":"PERFORM_ACTION","action":{"type":"INCREMENT"},');
45+
expect(message.payload).toBe('1');
4646

4747
message = await listenMessage(() => {
4848
window.store.dispatch({ type: 'INCREMENT' });
4949
expect(window.store.getState()).toBe(2);
5050
});
5151
expect(message.type).toBe('ACTION');
52-
expect(message.action.action.type).toBe('INCREMENT');
53-
expect(message.payload).toBe(2);
52+
expect(message.action).toInclude('{"type":"PERFORM_ACTION","action":{"type":"INCREMENT"},');
53+
expect(message.payload).toBe('2');
5454
});
5555

5656
it('should dispatch actions remotely', async () => {
@@ -65,8 +65,8 @@ describe('Redux enhancer', () => {
6565

6666
message = await listenMessage();
6767
expect(message.type).toBe('ACTION');
68-
expect(message.action.action.type).toBe('INCREMENT');
69-
expect(message.payload).toBe(3);
68+
expect(message.action).toInclude('{"type":"PERFORM_ACTION","action":{"type":"INCREMENT"},');
69+
expect(message.payload).toBe('3');
7070
});
7171

7272
it('should cancel (toggle) action', async () => {
@@ -81,7 +81,6 @@ describe('Redux enhancer', () => {
8181

8282
message = await listenMessage();
8383
expect(message.type).toBe('STATE');
84-
expect(message.payload.computedStates[message.payload.computedStates.length - 1].state).toBe(2);
8584
expect(window.store.getState()).toBe(2);
8685

8786
message = await listenMessage(() => {

0 commit comments

Comments
 (0)