@nxtedition/deepstream.io-client-js 32.0.8 → 32.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -0
- package/nxtedition-deepstream.io-client-js-31.0.18-b1.tgz +0 -0
- package/nxtedition-deepstream.io-client-js-31.0.18-b2.tgz +0 -0
- package/nxtedition-deepstream.io-client-js-31.0.18-b3.tgz +0 -0
- package/nxtedition-deepstream.io-client-js-32.0.6-alpha.0.tgz +0 -0
- package/package.json +1 -1
- package/src/client.d.ts +2 -2
- package/src/client.test-d.ts +53 -0
- package/src/event/event-handler.d.ts +5 -1
- package/src/record/record-handler.d.ts +6 -3
- package/src/record/record.d.ts +14 -4
- package/src/rpc/rpc-handler.d.ts +7 -4
- package/src/rpc/rpc-handler.test-d.ts +40 -0
- package/src/rpc/rpc-response.d.ts +1 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/src/client.d.ts
CHANGED
|
@@ -87,8 +87,8 @@ export interface DeepstreamClient<
|
|
|
87
87
|
rpc: RpcHandler<Methods>
|
|
88
88
|
record: RecordHandler<Records>
|
|
89
89
|
user: string | null
|
|
90
|
-
on: (evt: EventName, callback: (...args: unknown[]) => void) => this
|
|
91
|
-
off: (evt: EventName, callback: (...args: unknown[]) => void) => this
|
|
90
|
+
on: (evt: EventName | 'error', callback: (...args: unknown[]) => void) => this
|
|
91
|
+
off: (evt: EventName | 'error', callback: (...args: unknown[]) => void) => this
|
|
92
92
|
getConnectionState: () => ConnectionStateName
|
|
93
93
|
close: () => void
|
|
94
94
|
login(callback: (success: boolean, authData: unknown) => void): this
|
package/src/client.test-d.ts
CHANGED
|
@@ -188,6 +188,16 @@ expectAssignable<Promise<void>>(
|
|
|
188
188
|
)
|
|
189
189
|
expectAssignable<Promise<void>>(ds.record.update('p', 'p1', (data) => data, { timeout: 5000 }))
|
|
190
190
|
|
|
191
|
+
// update: updater receives version as second argument
|
|
192
|
+
ds.record.update('p', (data, version) => {
|
|
193
|
+
expectType<string>(version)
|
|
194
|
+
return data
|
|
195
|
+
})
|
|
196
|
+
ds.record.update('p', 'p1', (data, version) => {
|
|
197
|
+
expectType<string>(version)
|
|
198
|
+
return data
|
|
199
|
+
})
|
|
200
|
+
|
|
191
201
|
// Circular
|
|
192
202
|
expectAssignable<string | undefined>(await ds.record.get('c', 'a.b1'))
|
|
193
203
|
|
|
@@ -219,6 +229,19 @@ expectAssignable<Promise<typeof rec>>(rec.when({ state: 2, timeout: 5000 }))
|
|
|
219
229
|
expectAssignable<Promise<typeof rec>>(rec.when(2, { timeout: 5000 }))
|
|
220
230
|
expectAssignable<Promise<typeof rec>>(rec.when(2, { signal: new AbortController().signal }))
|
|
221
231
|
|
|
232
|
+
// Record.subscribe: callback receives (record, opaque)
|
|
233
|
+
rec.subscribe((record, opaque) => {
|
|
234
|
+
expectType<typeof rec>(record)
|
|
235
|
+
expectType<unknown>(opaque)
|
|
236
|
+
})
|
|
237
|
+
rec.subscribe((record, opaque) => {}, 'my-opaque-token')
|
|
238
|
+
|
|
239
|
+
// Record.unsubscribe: same callback signature
|
|
240
|
+
rec.unsubscribe((record, opaque) => {
|
|
241
|
+
expectType<typeof rec>(record)
|
|
242
|
+
expectType<unknown>(opaque)
|
|
243
|
+
})
|
|
244
|
+
|
|
222
245
|
// Record.update with options
|
|
223
246
|
expectAssignable<Promise<void>>(rec.update((x) => x, { signal: new AbortController().signal }))
|
|
224
247
|
expectAssignable<Promise<void>>(rec.update((x) => x, { timeout: 5000 }))
|
|
@@ -229,7 +252,37 @@ expectAssignable<Promise<void>>(
|
|
|
229
252
|
expectAssignable<Promise<void>>(rec.update('o0', (x) => x, { timeout: 5000 }))
|
|
230
253
|
expectAssignable<Promise<void>>(rec.update('o0', (x) => x, { state: 2 }))
|
|
231
254
|
|
|
255
|
+
// Record.update: updater receives version as second argument
|
|
256
|
+
rec.update((x, version) => {
|
|
257
|
+
expectType<string>(version)
|
|
258
|
+
return x
|
|
259
|
+
})
|
|
260
|
+
rec.update('o0', (x, version) => {
|
|
261
|
+
expectType<string>(version)
|
|
262
|
+
return x
|
|
263
|
+
})
|
|
264
|
+
|
|
232
265
|
const state = 'VOID'
|
|
233
266
|
expectType<0>(ds.record.STATE[state])
|
|
234
267
|
const unknownState: string = 'VOID'
|
|
235
268
|
expectType<number>(ds.record.STATE[unknownState])
|
|
269
|
+
|
|
270
|
+
// record.getRecord: [Symbol.dispose] is present
|
|
271
|
+
const recDispose = ds.record.getRecord('o')
|
|
272
|
+
recDispose[Symbol.dispose]()
|
|
273
|
+
|
|
274
|
+
// record.provide: returns Disposer | void
|
|
275
|
+
expectAssignable<(() => void) | void>(ds.record.provide('pattern*', () => ({})))
|
|
276
|
+
const recordDisposer = ds.record.provide('pattern*', () => ({}))
|
|
277
|
+
if (recordDisposer) {
|
|
278
|
+
recordDisposer()
|
|
279
|
+
recordDisposer[Symbol.dispose]()
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// event.provide: returns (() => void) | void
|
|
283
|
+
expectAssignable<(() => void) | void>(ds.event.provide('pattern*', () => {}, {}))
|
|
284
|
+
|
|
285
|
+
// client.on/off: 'error' is a valid event name
|
|
286
|
+
ds.on('error', (err) => {})
|
|
287
|
+
ds.off('error', (err) => {})
|
|
288
|
+
expectError(ds.on('unknownEvent', () => {}))
|
|
@@ -10,7 +10,11 @@ export default class EventHandler {
|
|
|
10
10
|
off: (name: string, callback: (data: unknown) => void) => this
|
|
11
11
|
observe: <Data>(name: string) => Observable<Data>
|
|
12
12
|
emit: <Data>(name: string, data?: Data) => void
|
|
13
|
-
provide: (
|
|
13
|
+
provide: (
|
|
14
|
+
pattern: string,
|
|
15
|
+
callback: (name: string) => void,
|
|
16
|
+
options: unknown,
|
|
17
|
+
) => (() => void) | void
|
|
14
18
|
}
|
|
15
19
|
|
|
16
20
|
export interface EventStats {
|
|
@@ -40,7 +40,7 @@ export default class RecordHandler<Records = Record<string, unknown>> {
|
|
|
40
40
|
pattern: string,
|
|
41
41
|
callback: (key: string) => unknown,
|
|
42
42
|
optionsOrRecursive?: ProvideOptions | boolean,
|
|
43
|
-
) => Disposer
|
|
43
|
+
) => Disposer | void
|
|
44
44
|
|
|
45
45
|
sync: (options?: SyncOptions) => Promise<void>
|
|
46
46
|
|
|
@@ -61,14 +61,17 @@ export default class RecordHandler<Records = Record<string, unknown>> {
|
|
|
61
61
|
update: {
|
|
62
62
|
<Name extends string>(
|
|
63
63
|
name: Name,
|
|
64
|
-
updater: (data: Lookup<Records, Name
|
|
64
|
+
updater: (data: Lookup<Records, Name>, version: string) => Lookup<Records, Name>,
|
|
65
65
|
options?: UpdateOptions,
|
|
66
66
|
): Promise<void>
|
|
67
67
|
|
|
68
68
|
<Name extends string, Path extends string | string[]>(
|
|
69
69
|
name: Name,
|
|
70
70
|
path: Path,
|
|
71
|
-
updater: (
|
|
71
|
+
updater: (
|
|
72
|
+
data: Get<Lookup<Records, Name>, Path>,
|
|
73
|
+
version: string,
|
|
74
|
+
) => Get<Lookup<Records, Name>, Path>,
|
|
72
75
|
options?: UpdateOptions,
|
|
73
76
|
): Promise<void>
|
|
74
77
|
}
|
package/src/record/record.d.ts
CHANGED
|
@@ -38,8 +38,15 @@ export default class Record<Data = unknown> {
|
|
|
38
38
|
|
|
39
39
|
ref(): Record<Data>
|
|
40
40
|
unref(): Record<Data>
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
[Symbol.dispose](): void
|
|
42
|
+
subscribe(
|
|
43
|
+
callback: (record: Record<Data>, opaque: unknown) => void,
|
|
44
|
+
opaque?: unknown,
|
|
45
|
+
): Record<Data>
|
|
46
|
+
unsubscribe(
|
|
47
|
+
callback: (record: Record<Data>, opaque: unknown) => void,
|
|
48
|
+
opaque?: unknown,
|
|
49
|
+
): Record<Data>
|
|
43
50
|
|
|
44
51
|
get: {
|
|
45
52
|
// with path
|
|
@@ -67,11 +74,14 @@ export default class Record<Data = unknown> {
|
|
|
67
74
|
|
|
68
75
|
update: {
|
|
69
76
|
// without path
|
|
70
|
-
(
|
|
77
|
+
(
|
|
78
|
+
updater: (data: Readonly<Data>, version: string) => Data,
|
|
79
|
+
options?: UpdateOptions,
|
|
80
|
+
): Promise<void>
|
|
71
81
|
// with path
|
|
72
82
|
<P extends string | string[]>(
|
|
73
83
|
path: P,
|
|
74
|
-
updater: (dataAtPath: Readonly<Get<Data, P
|
|
84
|
+
updater: (dataAtPath: Readonly<Get<Data, P>>, version: string) => Get<Data, P>,
|
|
75
85
|
options?: UpdateOptions,
|
|
76
86
|
): Promise<void>
|
|
77
87
|
}
|
package/src/rpc/rpc-handler.d.ts
CHANGED
|
@@ -10,8 +10,11 @@ export default class RpcHandler<
|
|
|
10
10
|
|
|
11
11
|
provide: <Name extends keyof Methods>(
|
|
12
12
|
name: Name,
|
|
13
|
-
callback: (
|
|
14
|
-
|
|
13
|
+
callback: (
|
|
14
|
+
args: Methods[Name][0],
|
|
15
|
+
response: RpcResponse<Methods[Name][1]>,
|
|
16
|
+
) => Methods[Name][1] | Promise<Methods[Name][1]> | void,
|
|
17
|
+
) => UnprovideFn | void
|
|
15
18
|
|
|
16
19
|
unprovide: <Name extends keyof Methods>(name: Name) => void
|
|
17
20
|
|
|
@@ -22,7 +25,7 @@ export default class RpcHandler<
|
|
|
22
25
|
ReturnValue extends Name extends keyof Methods ? Methods[Name][1] : unknown,
|
|
23
26
|
>(
|
|
24
27
|
name: Name,
|
|
25
|
-
args
|
|
28
|
+
args?: Args,
|
|
26
29
|
): Promise<ReturnValue>
|
|
27
30
|
<
|
|
28
31
|
Name extends keyof Methods | string,
|
|
@@ -30,7 +33,7 @@ export default class RpcHandler<
|
|
|
30
33
|
ReturnValue extends Name extends keyof Methods ? Methods[Name][1] : unknown,
|
|
31
34
|
>(
|
|
32
35
|
name: Name,
|
|
33
|
-
args: Args,
|
|
36
|
+
args: Args | undefined,
|
|
34
37
|
callback: (error: unknown, response: ReturnValue) => void,
|
|
35
38
|
): void
|
|
36
39
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import make from '../client.js'
|
|
2
|
+
import { expectAssignable, expectError, expectType } from 'tsd'
|
|
3
|
+
|
|
4
|
+
interface Methods extends Record<string, [unknown, unknown]> {
|
|
5
|
+
greet: [{ name: string }, { message: string }]
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const ds = make<Record<string, unknown>, Methods>('')
|
|
9
|
+
|
|
10
|
+
// provide: callback may return void, a value, or a Promise — all valid
|
|
11
|
+
ds.rpc.provide('greet', (_args, _response) => {})
|
|
12
|
+
ds.rpc.provide('greet', (_args, _response) => ({ message: 'hello' }))
|
|
13
|
+
ds.rpc.provide('greet', async (_args, _response) => ({ message: 'hello' }))
|
|
14
|
+
// async callback that uses response.send() directly — returns Promise<void>
|
|
15
|
+
ds.rpc.provide('greet', async (_args, response) => {
|
|
16
|
+
response.send({ message: 'hello' })
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
// provide: returning the wrong shape is an error
|
|
20
|
+
expectError(ds.rpc.provide('greet', (_args, _response) => ({ notMessage: 'hello' })))
|
|
21
|
+
|
|
22
|
+
// provide: response.completed is boolean
|
|
23
|
+
ds.rpc.provide('greet', (_args, response) => {
|
|
24
|
+
expectType<boolean>(response.completed)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// provide: return type is UnprovideFn | void
|
|
28
|
+
expectAssignable<(() => void) | void>(ds.rpc.provide('greet', () => {}))
|
|
29
|
+
|
|
30
|
+
// make: args is optional (no args)
|
|
31
|
+
expectAssignable<Promise<{ message: string }>>(ds.rpc.make('greet'))
|
|
32
|
+
// make: args provided
|
|
33
|
+
expectAssignable<Promise<{ message: string }>>(ds.rpc.make('greet', { name: 'world' }))
|
|
34
|
+
// make: args explicitly undefined
|
|
35
|
+
expectAssignable<Promise<{ message: string }>>(ds.rpc.make('greet', undefined))
|
|
36
|
+
// make: callback form — args required positionally but can be undefined
|
|
37
|
+
ds.rpc.make('greet', undefined, (err, res) => {
|
|
38
|
+
expectType<unknown>(err)
|
|
39
|
+
expectAssignable<{ message: string } | undefined>(res)
|
|
40
|
+
})
|