Skip to content

Commit cbca647

Browse files
committed
Simplify IPC code.
1 parent 6705c6e commit cbca647

8 files changed

Lines changed: 143 additions & 249 deletions

File tree

popup-app/components/IdpCallback.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
import React, { Component } from 'react'
22

33
import auth from '../../src'
4-
import { client } from '../../src/ipc'
4+
import { Client } from '../../src/ipc'
55
import { postMessageStorage } from '../../src/storage'
66

77
export default class IdpCallback extends Component {
88
state = { loggedIn: false }
9-
10-
request = client(window.opener, this.props.appOrigin)
9+
client = new Client(window.opener, this.props.appOrigin)
1110

1211
postSession = async () => {
1312
const storage = postMessageStorage(window.opener, this.props.appOrigin)
1413
const session = await auth.currentSession(storage)
15-
return this.request({ method: 'foundSession', args: [session] })
14+
await this.client.request('foundSession', session)
1615
}
1716

1817
constructor(props) {

popup-app/components/IdpSelect.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
22

33
import auth from '../../src'
4-
import { client } from '../../src/ipc'
4+
import { Client } from '../../src/ipc'
55
import { postMessageStorage } from '../../src/storage'
66

77
import './IdpSelect.css'
@@ -41,14 +41,8 @@ class IdpSelect extends React.Component {
4141
})
4242
return
4343
}
44-
const request = client(window.opener, appOrigin)
45-
let loginOptions = await timeout(
46-
request({
47-
method: 'getLoginOptions',
48-
args: []
49-
}),
50-
2000
51-
)
44+
const client = new Client(window.opener, appOrigin)
45+
let loginOptions = await timeout(client.request('getLoginOptions'), 2000)
5246
if (!loginOptions) {
5347
console.warn(
5448
'Cannot log in - have not yet received loginOptions from parent window'

popup-app/index.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import React from 'react'
33
import ReactDOM from 'react-dom'
44

5-
import { client } from '../src/ipc'
5+
import { Client } from '../src/ipc'
66
import { getData, updateStorage } from '../src/storage'
77

88
import IdpCallback from './components/IdpCallback'
@@ -62,11 +62,8 @@ async function findAppOrigin() {
6262
if (appOrigin) {
6363
return appOrigin
6464
}
65-
const request = client(window.opener, '*')
66-
appOrigin = await request({
67-
method: 'getAppOrigin',
68-
args: []
69-
})
65+
const client = new Client(window.opener, '*')
66+
appOrigin = await client.request('getAppOrigin')
7067
await storeAppOrigin(appOrigin)
7168
return appOrigin
7269
}

src/__test__/ipc.spec.js

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22
/* eslint-env jest */
33

44
import { polyfillWindow, polyunfillWindow } from './spec-helpers'
5-
import { client, server } from '../ipc'
5+
import { Client, Server } from '../ipc'
66

77
beforeEach(polyfillWindow)
88

99
afterEach(polyunfillWindow)
1010

11-
describe('client', () => {
11+
describe('Client', () => {
1212
it('takes a request, sets up a channel to the parent window, and promises a response from the parent', async () => {
1313
expect.assertions(5)
1414
const parent = window
1515
// window.open is not yet implemented in jsdom. for the purposes of testing, this does just fine.
1616
const child = parent
1717
const origin = window.location.origin
18-
const request = client(parent, origin)
18+
const client = new Client(parent, origin)
1919
parent.addEventListener('message', function testServer(event) {
2020
const { data, origin } = event
2121
const isRequest =
@@ -42,7 +42,7 @@ describe('client', () => {
4242
parent.removeEventListener('message', testServer)
4343
}
4444
})
45-
const response = await request({ method: 'foo', args: ['bar', 'baz'] })
45+
const response = await client.request('foo', 'bar', 'baz')
4646
expect(response).toBe('the return value!')
4747
})
4848

@@ -52,7 +52,7 @@ describe('client', () => {
5252
// window.open is not yet implemented in jsdom. for the purposes of testing, this does just fine.
5353
const child = parent
5454
const origin = window.location.origin
55-
const request = client(parent, origin)
55+
const client = new Client(parent, origin)
5656
parent.addEventListener('message', function testServer(event) {
5757
const { data, origin } = event
5858
const isRequest =
@@ -88,61 +88,56 @@ describe('client', () => {
8888
parent.removeEventListener('message', testServer)
8989
}
9090
})
91-
const response = await request({ method: 'foo', args: ['bar', 'baz'] })
91+
const response = await client.request('foo', 'bar', 'baz')
9292
expect(response).toBe('the return value!')
9393
})
9494
})
9595

96-
describe('server', () => {
96+
describe('Server', () => {
9797
it('only responds to valid requests', done => {
9898
expect.assertions(1)
9999
const parent = window
100100
const child = parent
101101
const handler = jest.fn()
102-
const s = server(child, child.location.origin)(handler).start()
102+
const server = new Server(child, child.location.origin, handler)
103+
server.start()
103104
parent.addEventListener('message', function listener() {
104105
try {
105106
expect(handler.mock.calls.length).toBe(0)
106-
s.stop()
107107
parent.removeEventListener('message', listener)
108108
done()
109109
} catch (e) {
110110
done.fail(e)
111+
} finally {
112+
server.stop()
111113
}
112114
})
113115
parent.postMessage('not-a-well-formed-message', parent.location.origin)
114116
})
115117

116118
it('delegates to a handler to compute responses', done => {
117119
expect.assertions(3)
118-
const testHandler = jest.fn(request =>
119-
Promise.resolve({
120-
id: request.id,
121-
ret: 'testHandler return value'
122-
})
123-
)
120+
const testHandler = jest.fn(async () => 'testHandler return value')
124121
const parent = window
125122
const child = parent
126-
const s = server(child, child.location.origin)(testHandler).start()
123+
const server = new Server(child, child.location.origin, testHandler)
124+
server.start()
127125
child.addEventListener('message', function listener(event) {
128126
try {
129127
const request = event.data['solid-auth-client']
130128
const { id, ret } = request
131129
if (!(id && ret)) {
132130
return
133131
}
134-
expect(testHandler.mock.calls[0][0]).toEqual({
135-
id: '12345',
136-
method: 'foo',
137-
args: ['a', 'b', 'c']
138-
})
132+
expect(testHandler.mock.calls[0]).toEqual(['foo', 'a', 'b', 'c'])
139133
expect(id).toBe('12345')
140134
expect(ret).toBe('testHandler return value')
141-
s.stop()
142135
child.removeEventListener('message', listener)
143136
done()
144137
} catch (e) {
145138
done.fail(e)
139+
} finally {
140+
server.stop()
146141
}
147142
})
148143
parent.postMessage(

src/__test__/popup.spec.js

Lines changed: 16 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -25,44 +25,28 @@ describe('storageHandler', () => {
2525
it('implements getItem', async () => {
2626
expect.assertions(1)
2727
await store.setItem('foo', 'bar')
28-
const resp = await handler({
29-
id: '12345',
30-
method: 'storage/getItem',
31-
args: ['foo']
32-
})
33-
expect(resp).toEqual({ id: '12345', ret: 'bar' })
28+
const resp = await handler('storage/getItem', 'foo')
29+
expect(resp).toEqual('bar')
3430
})
3531

3632
it('implements setItem', async () => {
3733
expect.assertions(2)
38-
const resp = await handler({
39-
id: '12345',
40-
method: 'storage/setItem',
41-
args: ['foo', 'bar']
42-
})
43-
expect(resp).toEqual({ id: '12345', ret: null })
34+
const resp = await handler('storage/setItem', 'foo', 'bar')
35+
expect(resp).toEqual(undefined)
4436
expect(await store.getItem('foo')).toEqual('bar')
4537
})
4638

4739
it('implements removeItem', async () => {
4840
expect.assertions(2)
4941
await store.setItem('foo', 'bar')
50-
const resp = await handler({
51-
id: '12345',
52-
method: 'storage/removeItem',
53-
args: ['foo']
54-
})
55-
expect(resp).toEqual({ id: '12345', ret: null })
42+
const resp = await handler('storage/removeItem', 'foo')
43+
expect(resp).toEqual(undefined)
5644
expect(await store.getItem('foo')).toEqual(null)
5745
})
5846

5947
it('ignores unknown methods', async () => {
6048
expect.assertions(1)
61-
const resp = await handler({
62-
id: '12345',
63-
method: 'unknown_method',
64-
args: ['a', 'b', 'c']
65-
})
49+
const resp = await handler('unknown_method', 'a', 'b', 'c')
6650
expect(resp).toBeNull()
6751
})
6852
})
@@ -77,17 +61,10 @@ describe('loginHandler', () => {
7761
it('returns the loginOptions', async () => {
7862
expect.assertions(1)
7963
const handler = loginHandler(options, () => {})
80-
const _options = await handler({
81-
id: '12345',
82-
method: 'getLoginOptions',
83-
args: []
84-
})
64+
const _options = await handler('getLoginOptions')
8565
expect(_options).toEqual({
86-
id: '12345',
87-
ret: {
88-
popupUri: options.popupUri,
89-
callbackUri: options.callbackUri
90-
}
66+
popupUri: options.popupUri,
67+
callbackUri: options.callbackUri
9168
})
9269
})
9370

@@ -99,52 +76,30 @@ describe('loginHandler', () => {
9976
idp: 'https://example.com',
10077
webId: 'https://me.example.com/profile#me'
10178
}
102-
const _sessionResp = await handler({
103-
id: '12345',
104-
method: 'foundSession',
105-
args: [session]
106-
})
107-
expect(_sessionResp).toEqual({
108-
id: '12345',
109-
ret: null
110-
})
79+
const _sessionResp = await handler('foundSession', session)
80+
expect(_sessionResp).toEqual(null)
11181
expect(mockCallback.mock.calls.length).toBe(1)
11282
expect(mockCallback.mock.calls[0][0]).toEqual(session)
11383
})
11484

11585
it('ignores unknown methods', async () => {
11686
expect.assertions(1)
11787
const handler = loginHandler(options, () => {})
118-
const resp = await handler({
119-
id: '12345',
120-
method: 'unknown_method',
121-
args: ['a', 'b', 'c']
122-
})
88+
const resp = await handler('unknown_method', 'a', 'b', 'c')
12389
expect(resp).toBeNull()
12490
})
12591
})
12692

12793
describe('appOriginHandler', () => {
12894
it('responds with the window origin', async () => {
12995
expect.assertions(1)
130-
const resp = await appOriginHandler({
131-
id: '12345',
132-
method: 'getAppOrigin',
133-
args: []
134-
})
135-
expect(resp).toEqual({
136-
id: '12345',
137-
ret: 'https://app.biz'
138-
})
96+
const resp = await appOriginHandler('getAppOrigin')
97+
expect(resp).toEqual('https://app.biz')
13998
})
14099

141100
it('ignores unknown methods', async () => {
142101
expect.assertions(1)
143-
const resp = await appOriginHandler({
144-
id: '12345',
145-
method: 'somethingCompletelyDifferent',
146-
args: []
147-
})
102+
const resp = await appOriginHandler('unknown_method')
148103
expect(resp).toBeNull()
149104
})
150105
})

0 commit comments

Comments
 (0)