1
- import * as rxjs from 'rxjs'
2
1
import * as C from '../constants/constants.js'
3
2
import { h64ToString } from '../utils/utils.js'
4
3
5
- const PIPE = rxjs . pipe (
6
- rxjs . map ( ( value ) => {
4
+ class Observer {
5
+ #name
6
+ #listener
7
+ #version = ''
8
+
9
+ constructor ( name , listener ) {
10
+ this . #name = name
11
+ this . #listener = listener
12
+ }
13
+
14
+ next ( value ) {
7
15
let data
8
16
if ( value && typeof value === 'string' ) {
9
17
if ( value . charAt ( 0 ) !== '{' && value . charAt ( 0 ) !== '[' ) {
@@ -16,10 +24,34 @@ const PIPE = rxjs.pipe(
16
24
throw new Error ( `invalid value: ${ value } ` )
17
25
}
18
26
19
- return data
20
- } ) ,
21
- rxjs . distinctUntilChanged ( ) ,
22
- )
27
+ const version = data ? `INF-${ h64ToString ( data ) } ` : ''
28
+ if ( this . #version === version ) {
29
+ return
30
+ }
31
+
32
+ if ( version ) {
33
+ this . #listener. _connection . sendMsg ( this . #listener. _topic , C . ACTIONS . UPDATE , [
34
+ this . #name,
35
+ version ,
36
+ data ,
37
+ ] )
38
+ } else {
39
+ this . #listener. _connection . sendMsg ( this . #listener. _topic , C . ACTIONS . LISTEN_REJECT , [
40
+ this . #listener. _pattern ,
41
+ this . #name,
42
+ ] )
43
+ }
44
+
45
+ this . #version = version
46
+ }
47
+ error ( err ) {
48
+ this . #listener. _error ( this . #name, err )
49
+ this . #listener. _connection . sendMsg ( this . #listener. _topic , C . ACTIONS . LISTEN_REJECT , [
50
+ this . #listener. _pattern ,
51
+ this . #name,
52
+ ] )
53
+ }
54
+ }
23
55
24
56
export default class Listener {
25
57
constructor ( topic , pattern , callback , handler , opts ) {
@@ -65,28 +97,11 @@ export default class Listener {
65
97
try {
66
98
value$ = this . _callback ( name )
67
99
} catch ( err ) {
68
- value$ = rxjs . throwError ( ( ) => err )
100
+ this . _error ( name , err )
69
101
}
70
102
71
103
if ( value$ ) {
72
- const subscription = value$ . pipe ( PIPE ) . subscribe ( {
73
- next : ( data ) => {
74
- if ( data == null ) {
75
- this . _connection . sendMsg ( this . _topic , C . ACTIONS . LISTEN_REJECT , [ this . _pattern , name ] )
76
- this . _subscriptions . delete ( name )
77
- subscription . unsubscribe ( )
78
- } else {
79
- const version = `INF-${ h64ToString ( data ) } `
80
- this . _connection . sendMsg ( this . _topic , C . ACTIONS . UPDATE , [ name , version , data ] )
81
- }
82
- } ,
83
- error : ( err ) => {
84
- this . _error ( name , err )
85
- this . _connection . sendMsg ( this . _topic , C . ACTIONS . LISTEN_REJECT , [ this . _pattern , name ] )
86
- this . _subscriptions . delete ( name )
87
- } ,
88
- } )
89
- this . _subscriptions . set ( name , subscription )
104
+ this . _subscriptions . set ( name , value$ . subscribe ( new Observer ( name , this ) ) )
90
105
} else {
91
106
this . _connection . sendMsg ( this . _topic , C . ACTIONS . LISTEN_REJECT , [ this . _pattern , name ] )
92
107
}
0 commit comments