Skip to content

Commit db1f8d9

Browse files
committed
refactor: centralize debounce implementation
1 parent 100eb07 commit db1f8d9

File tree

3 files changed

+28
-39
lines changed

3 files changed

+28
-39
lines changed

packages/core/src/auth/auth.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { SsoClient } from './sso/clients'
2121
import { getLogger } from '../shared/logger'
2222
import { CredentialsProviderManager } from './providers/credentialsProviderManager'
2323
import { asString, CredentialsId, CredentialsProvider, fromString } from './providers/credentials'
24-
import { once } from '../shared/utilities/functionUtils'
24+
import { keyedDebounce, once } from '../shared/utilities/functionUtils'
2525
import { CredentialsSettings } from './credentials/utils'
2626
import {
2727
extractDataFromSection,
@@ -104,23 +104,6 @@ interface AuthService {
104104
updateConnection(connection: Pick<Connection, 'id'>, profile: Profile): Promise<Connection>
105105
}
106106

107-
function keyedDebounce<T, U extends any[], K extends string = string>(
108-
fn: (key: K, ...args: U) => Promise<T>
109-
): typeof fn {
110-
const pending = new Map<K, Promise<T>>()
111-
112-
return (key, ...args) => {
113-
if (pending.has(key)) {
114-
return pending.get(key)!
115-
}
116-
117-
const promise = fn(key, ...args).finally(() => pending.delete(key))
118-
pending.set(key, promise)
119-
120-
return promise
121-
}
122-
}
123-
124107
export interface ConnectionStateChangeEvent {
125108
readonly id: Connection['id']
126109
readonly state: ProfileMetadata['connectionState']

packages/core/src/shared/utilities/functionUtils.ts

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,22 @@ export function memoize<T, U extends any[]>(fn: (...args: U) => T): (...args: U)
8686
* same Promise similar to {@link shared}. The window will also be 'rolled', delaying
8787
* the execution by another {@link delay} milliseconds.
8888
*/
89-
export function debounce<T>(cb: () => T | Promise<T>, delay: number = 0): () => Promise<T> {
89+
export function debounce<Input extends any[], Output>(
90+
cb: (...args: Input) => Output | Promise<Output>,
91+
delay: number = 0
92+
): (...args: Input) => Promise<Output> {
9093
let timeout: Timeout | undefined
91-
let promise: Promise<T> | undefined
94+
let promise: Promise<Output> | undefined
9295

93-
return () => {
96+
return (...args: Input) => {
9497
timeout?.refresh()
9598

96-
return (promise ??= new Promise<T>((resolve, reject) => {
99+
return (promise ??= new Promise<Output>((resolve, reject) => {
97100
timeout = new Timeout(delay)
98101
timeout.onCompletion(async () => {
99102
timeout = promise = undefined
100103
try {
101-
resolve(await cb())
104+
resolve(await cb(...args))
102105
} catch (err) {
103106
reject(err)
104107
}
@@ -127,21 +130,24 @@ export function cancellableDebounce<T, U extends any[]>(
127130
}
128131

129132
return {
130-
promise: (...arg) => {
131-
timeout?.refresh()
132-
133-
return (promise ??= new Promise<T>((resolve, reject) => {
134-
timeout = new Timeout(delay)
135-
timeout.onCompletion(async () => {
136-
timeout = promise = undefined
137-
try {
138-
resolve(await cb(...arg))
139-
} catch (err) {
140-
reject(err)
141-
}
142-
})
143-
}))
144-
},
133+
promise: debounce(cb, delay),
145134
cancel: cancel,
146135
}
147136
}
137+
138+
export function keyedDebounce<T, U extends any[], K extends string = string>(
139+
fn: (key: K, ...args: U) => Promise<T>
140+
): typeof fn {
141+
const pending = new Map<K, Promise<T>>()
142+
143+
return (key, ...args) => {
144+
if (pending.has(key)) {
145+
return pending.get(key)!
146+
}
147+
148+
const promise = fn(key, ...args).finally(() => pending.delete(key))
149+
pending.set(key, promise)
150+
151+
return promise
152+
}
153+
}

packages/core/src/test/shared/utilities/functionUtils.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ describe('functionUtils', function () {
5252

5353
describe('debounce', function () {
5454
let counter: number
55-
let fn: () => Promise<unknown>
55+
let fn: () => Promise<unknown> | unknown
5656

5757
beforeEach(function () {
5858
counter = 0

0 commit comments

Comments
 (0)