Skip to content

Commit 5e55eb8

Browse files
committed
Fix listen after reconnect - fixes #490
1 parent fe6010a commit 5e55eb8

File tree

6 files changed

+66
-18
lines changed

6 files changed

+66
-18
lines changed

cjs/src/index.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,16 +171,15 @@ function Postgres(a, b) {
171171

172172
if (exists) {
173173
channels[name].listeners.push(listener)
174+
const result = await channels[name].result
174175
listener.onlisten && listener.onlisten()
175-
return Promise.resolve({ ...channels[name].result, unlisten })
176+
return { state: result.state, unlisten }
176177
}
177178

178-
const result = await sql`listen ${ sql(name) }`
179-
channels[name] = { result, listeners: [listener] }
179+
channels[name] = { result: sql`listen ${ sql(name) }`, listeners: [listener] }
180+
const result = await channels[name].result
180181
listener.onlisten && listener.onlisten()
181-
result.unlisten = unlisten
182-
183-
return result
182+
return { state: result.state, unlisten }
184183

185184
async function unlisten() {
186185
if (name in channels === false)

cjs/tests/index.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,23 @@ t('double listen', async() => {
682682
return [2, count]
683683
})
684684

685+
t('multiple listeners work after a reconnect', async() => {
686+
const sql = postgres(options)
687+
, xs = []
688+
689+
const s1 = await sql.listen('test', x => xs.push('1', x))
690+
await sql.listen('test', x => xs.push('2', x))
691+
await sql.notify('test', 'a')
692+
await delay(50)
693+
await sql`select pg_terminate_backend(${ s1.state.pid })`
694+
await delay(200)
695+
await sql.notify('test', 'b')
696+
await delay(50)
697+
sql.end()
698+
699+
return ['1a2a1b2b', xs.join('')]
700+
})
701+
685702
t('listen and notify with weird name', async() => {
686703
const sql = postgres(options)
687704
const channel = 'wat-;ø§'

deno/src/index.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,15 @@ function Postgres(a, b) {
172172

173173
if (exists) {
174174
channels[name].listeners.push(listener)
175+
const result = await channels[name].result
175176
listener.onlisten && listener.onlisten()
176-
return Promise.resolve({ ...channels[name].result, unlisten })
177+
return { state: result.state, unlisten }
177178
}
178179

179-
const result = await sql`listen ${ sql(name) }`
180-
channels[name] = { result, listeners: [listener] }
180+
channels[name] = { result: sql`listen ${ sql(name) }`, listeners: [listener] }
181+
const result = await channels[name].result
181182
listener.onlisten && listener.onlisten()
182-
result.unlisten = unlisten
183-
184-
return result
183+
return { state: result.state, unlisten }
185184

186185
async function unlisten() {
187186
if (name in channels === false)

deno/tests/index.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,23 @@ t('double listen', async() => {
684684
return [2, count]
685685
})
686686

687+
t('multiple listeners work after a reconnect', async() => {
688+
const sql = postgres(options)
689+
, xs = []
690+
691+
const s1 = await sql.listen('test', x => xs.push('1', x))
692+
await sql.listen('test', x => xs.push('2', x))
693+
await sql.notify('test', 'a')
694+
await delay(50)
695+
await sql`select pg_terminate_backend(${ s1.state.pid })`
696+
await delay(200)
697+
await sql.notify('test', 'b')
698+
await delay(50)
699+
sql.end()
700+
701+
return ['1a2a1b2b', xs.join('')]
702+
})
703+
687704
t('listen and notify with weird name', async() => {
688705
const sql = postgres(options)
689706
const channel = 'wat-;ø§'

src/index.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,16 +171,15 @@ function Postgres(a, b) {
171171

172172
if (exists) {
173173
channels[name].listeners.push(listener)
174+
const result = await channels[name].result
174175
listener.onlisten && listener.onlisten()
175-
return Promise.resolve({ ...channels[name].result, unlisten })
176+
return { state: result.state, unlisten }
176177
}
177178

178-
const result = await sql`listen ${ sql(name) }`
179-
channels[name] = { result, listeners: [listener] }
179+
channels[name] = { result: sql`listen ${ sql(name) }`, listeners: [listener] }
180+
const result = await channels[name].result
180181
listener.onlisten && listener.onlisten()
181-
result.unlisten = unlisten
182-
183-
return result
182+
return { state: result.state, unlisten }
184183

185184
async function unlisten() {
186185
if (name in channels === false)

tests/index.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,23 @@ t('double listen', async() => {
682682
return [2, count]
683683
})
684684

685+
t('multiple listeners work after a reconnect', async() => {
686+
const sql = postgres(options)
687+
, xs = []
688+
689+
const s1 = await sql.listen('test', x => xs.push('1', x))
690+
await sql.listen('test', x => xs.push('2', x))
691+
await sql.notify('test', 'a')
692+
await delay(50)
693+
await sql`select pg_terminate_backend(${ s1.state.pid })`
694+
await delay(200)
695+
await sql.notify('test', 'b')
696+
await delay(50)
697+
sql.end()
698+
699+
return ['1a2a1b2b', xs.join('')]
700+
})
701+
685702
t('listen and notify with weird name', async() => {
686703
const sql = postgres(options)
687704
const channel = 'wat-;ø§'

0 commit comments

Comments
 (0)