Skip to content

Commit 52dfe9a

Browse files
committed
Fix listen after reconnect - fixes #490
1 parent 531da5d commit 52dfe9a

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
@@ -681,6 +681,23 @@ t('double listen', async() => {
681681
return [2, count]
682682
})
683683

684+
t('multiple listeners work after a reconnect', async() => {
685+
const sql = postgres(options)
686+
, xs = []
687+
688+
const s1 = await sql.listen('test', x => xs.push('1', x))
689+
await sql.listen('test', x => xs.push('2', x))
690+
await sql.notify('test', 'a')
691+
await delay(50)
692+
await sql`select pg_terminate_backend(${ s1.state.pid })`
693+
await delay(200)
694+
await sql.notify('test', 'b')
695+
await delay(50)
696+
sql.end()
697+
698+
return ['1a2a1b2b', xs.join('')]
699+
})
700+
684701
t('listen and notify with weird name', async() => {
685702
const sql = postgres(options)
686703
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
@@ -683,6 +683,23 @@ t('double listen', async() => {
683683
return [2, count]
684684
})
685685

686+
t('multiple listeners work after a reconnect', async() => {
687+
const sql = postgres(options)
688+
, xs = []
689+
690+
const s1 = await sql.listen('test', x => xs.push('1', x))
691+
await sql.listen('test', x => xs.push('2', x))
692+
await sql.notify('test', 'a')
693+
await delay(50)
694+
await sql`select pg_terminate_backend(${ s1.state.pid })`
695+
await delay(200)
696+
await sql.notify('test', 'b')
697+
await delay(50)
698+
sql.end()
699+
700+
return ['1a2a1b2b', xs.join('')]
701+
})
702+
686703
t('listen and notify with weird name', async() => {
687704
const sql = postgres(options)
688705
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
@@ -681,6 +681,23 @@ t('double listen', async() => {
681681
return [2, count]
682682
})
683683

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

0 commit comments

Comments
 (0)