@@ -4,21 +4,28 @@ import { print } from "graphql"
4
4
5
5
type RequestResult = FetchResult < { [ key : string ] : any ; } , Record < string , any > , Record < string , any > >
6
6
type ConnectionParams = object | ( ( operation : Operation ) => object )
7
+ type SubscriptionCallbacks = {
8
+ connected ?: ( args ?: { reconnected : boolean } ) => void ;
9
+ disconnected ?: ( ) => void ;
10
+ received ?: ( payload : any ) => void ;
11
+ } ;
7
12
8
13
class ActionCableLink extends ApolloLink {
9
14
cable : Consumer
10
15
channelName : string
11
16
actionName : string
12
17
connectionParams : ConnectionParams
18
+ callbacks : SubscriptionCallbacks
13
19
14
20
constructor ( options : {
15
- cable : Consumer , channelName ?: string , actionName ?: string , connectionParams ?: ConnectionParams
21
+ cable : Consumer , channelName ?: string , actionName ?: string , connectionParams ?: ConnectionParams , callbacks ?: SubscriptionCallbacks
16
22
} ) {
17
23
super ( )
18
24
this . cable = options . cable
19
25
this . channelName = options . channelName || "GraphqlChannel"
20
26
this . actionName = options . actionName || "execute"
21
27
this . connectionParams = options . connectionParams || { }
28
+ this . callbacks = options . callbacks || { }
22
29
}
23
30
24
31
// Interestingly, this link does _not_ call through to `next` because
@@ -29,11 +36,12 @@ class ActionCableLink extends ApolloLink {
29
36
var actionName = this . actionName
30
37
var connectionParams = ( typeof this . connectionParams === "function" ) ?
31
38
this . connectionParams ( operation ) : this . connectionParams
39
+ var callbacks = this . callbacks
32
40
var channel = this . cable . subscriptions . create ( Object . assign ( { } , {
33
41
channel : this . channelName ,
34
42
channelId : channelId
35
43
} , connectionParams ) , {
36
- connected : function ( ) {
44
+ connected : function ( args ?: any ) {
37
45
this . perform (
38
46
actionName ,
39
47
{
@@ -44,6 +52,7 @@ class ActionCableLink extends ApolloLink {
44
52
operationName : operation . operationName
45
53
}
46
54
)
55
+ callbacks . connected ?.( args )
47
56
} ,
48
57
received : function ( payload ) {
49
58
if ( payload ?. result ?. data || payload ?. result ?. errors ) {
@@ -53,6 +62,10 @@ class ActionCableLink extends ApolloLink {
53
62
if ( ! payload . more ) {
54
63
observer . complete ( )
55
64
}
65
+ callbacks . received ?.( payload )
66
+ } ,
67
+ disconnected : function ( ) {
68
+ callbacks . disconnected ?.( )
56
69
}
57
70
} )
58
71
// Make the ActionCable subscription behave like an Apollo subscription
0 commit comments