@supabase/realtime-js 2.0.0-rc.4 → 2.0.0-rc.6
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/README.md +7 -65
- package/dist/main/RealtimeChannel.d.ts +93 -57
- package/dist/main/RealtimeChannel.d.ts.map +1 -1
- package/dist/main/RealtimeChannel.js +114 -107
- package/dist/main/RealtimeChannel.js.map +1 -1
- package/dist/main/RealtimeClient.d.ts +26 -67
- package/dist/main/RealtimeClient.d.ts.map +1 -1
- package/dist/main/RealtimeClient.js +50 -94
- package/dist/main/RealtimeClient.js.map +1 -1
- package/dist/main/RealtimePresence.d.ts +30 -21
- package/dist/main/RealtimePresence.d.ts.map +1 -1
- package/dist/main/RealtimePresence.js +14 -19
- package/dist/main/RealtimePresence.js.map +1 -1
- package/dist/main/index.d.ts +4 -5
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js +7 -5
- package/dist/main/index.js.map +1 -1
- package/dist/main/lib/push.d.ts +3 -1
- package/dist/main/lib/push.d.ts.map +1 -1
- package/dist/main/lib/push.js +6 -5
- package/dist/main/lib/push.js.map +1 -1
- package/dist/main/lib/version.d.ts +1 -1
- package/dist/main/lib/version.js +1 -1
- package/dist/module/RealtimeChannel.d.ts +93 -57
- package/dist/module/RealtimeChannel.d.ts.map +1 -1
- package/dist/module/RealtimeChannel.js +113 -106
- package/dist/module/RealtimeChannel.js.map +1 -1
- package/dist/module/RealtimeClient.d.ts +26 -67
- package/dist/module/RealtimeClient.d.ts.map +1 -1
- package/dist/module/RealtimeClient.js +50 -94
- package/dist/module/RealtimeClient.js.map +1 -1
- package/dist/module/RealtimePresence.d.ts +30 -21
- package/dist/module/RealtimePresence.d.ts.map +1 -1
- package/dist/module/RealtimePresence.js +13 -19
- package/dist/module/RealtimePresence.js.map +1 -1
- package/dist/module/index.d.ts +4 -5
- package/dist/module/index.d.ts.map +1 -1
- package/dist/module/index.js +3 -4
- package/dist/module/index.js.map +1 -1
- package/dist/module/lib/push.d.ts +3 -1
- package/dist/module/lib/push.d.ts.map +1 -1
- package/dist/module/lib/push.js +6 -5
- package/dist/module/lib/push.js.map +1 -1
- package/dist/module/lib/version.d.ts +1 -1
- package/dist/module/lib/version.js +1 -1
- package/package.json +5 -4
- package/src/RealtimeChannel.ts +206 -136
- package/src/RealtimeClient.ts +84 -130
- package/src/RealtimePresence.ts +51 -52
- package/src/index.ts +31 -7
- package/src/lib/push.ts +8 -6
- package/src/lib/version.ts +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,6 @@ This is for usage with Supabase [Realtime](https://github.com/supabase/realtime)
|
|
|
6
6
|
|
|
7
7
|
## Usage
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
### Creating a Socket connection
|
|
11
10
|
|
|
12
11
|
You can set up one connection to be used across the whole app.
|
|
@@ -25,25 +24,19 @@ You can pass in your JWT If you have enabled JWT authorization in Supabase [Real
|
|
|
25
24
|
```js
|
|
26
25
|
import { RealtimeClient } from '@supabase/realtime-js'
|
|
27
26
|
|
|
28
|
-
var client = new RealtimeClient(process.env.REALTIME_URL, {
|
|
27
|
+
var client = new RealtimeClient(process.env.REALTIME_URL, {
|
|
28
|
+
params: { apikey: 'token123' },
|
|
29
|
+
})
|
|
29
30
|
client.connect()
|
|
30
31
|
```
|
|
31
32
|
|
|
32
33
|
See [Realtime: Websocket Connection Authorization](https://github.com/supabase/realtime#websocket-connection-authorization) for more information.
|
|
33
34
|
|
|
34
|
-
**Socket Hooks**
|
|
35
|
-
|
|
36
|
-
```js
|
|
37
|
-
client.onOpen(() => console.log('Socket opened.'))
|
|
38
|
-
client.onClose(() => console.log('Socket closed.'))
|
|
39
|
-
client.onError((e) => console.log('Socket error', e.message))
|
|
40
|
-
```
|
|
41
|
-
|
|
42
35
|
### Subscribing to events
|
|
43
36
|
|
|
44
37
|
You can listen to `INSERT`, `UPDATE`, `DELETE`, or all `*` events.
|
|
45
38
|
|
|
46
|
-
You can subscribe to events on the whole database, schema, table, or individual columns using `channel()`. Channels are multiplexed over the Socket connection.
|
|
39
|
+
You can subscribe to events on the whole database, schema, table, or individual columns using `channel()`. Channels are multiplexed over the Socket connection.
|
|
47
40
|
|
|
48
41
|
To join a channel, you must provide the `topic`, where a topic is either:
|
|
49
42
|
|
|
@@ -51,7 +44,6 @@ To join a channel, you must provide the `topic`, where a topic is either:
|
|
|
51
44
|
- `realtime:{schema}` - where `{schema}` is the Postgres Schema
|
|
52
45
|
- `realtime:{schema}:{table}` - where `{table}` is the Postgres table name
|
|
53
46
|
- `realtime:{schema}:{table}:{col}=eq.{val}` - where `{col}` is the column name, and `{val}` is the value which you want to match
|
|
54
|
-
|
|
55
47
|
|
|
56
48
|
**Examples**
|
|
57
49
|
|
|
@@ -98,7 +90,7 @@ You can unsubscribe from a topic using `channel.unsubscribe()`.
|
|
|
98
90
|
Call `disconnect()` on the socket:
|
|
99
91
|
|
|
100
92
|
```js
|
|
101
|
-
let { error, data } = await client.disconnect()
|
|
93
|
+
let { error, data } = await client.disconnect()
|
|
102
94
|
```
|
|
103
95
|
|
|
104
96
|
**Duplicate Join Subscriptions**
|
|
@@ -106,12 +98,11 @@ let { error, data } = await client.disconnect()
|
|
|
106
98
|
While the client may join any number of topics on any number of channels, the client may only hold a single subscription for each unique topic at any given time. When attempting to create a duplicate subscription, the server will close the existing channel, log a warning, and spawn a new channel for the topic. The client will have their `channel.onClose` callbacks fired for the existing channel, and the new
|
|
107
99
|
channel join will have its receive hooks processed as normal.
|
|
108
100
|
|
|
109
|
-
|
|
110
101
|
**Channel Hooks**
|
|
111
102
|
|
|
112
103
|
```js
|
|
113
|
-
channel.
|
|
114
|
-
channel.
|
|
104
|
+
channel._onError(() => console.log('there was an error!'))
|
|
105
|
+
channel._onClose(() => console.log('the channel has gone away gracefully'))
|
|
115
106
|
```
|
|
116
107
|
|
|
117
108
|
- `onError` hooks are invoked if the socket connection drops, or the channel crashes on the server. In either case, a channel rejoin is attempted automatically in an exponential backoff manner.
|
|
@@ -120,61 +111,13 @@ channel.onClose( () => console.log("the channel has gone away gracefully") )
|
|
|
120
111
|
**Subscription Hooks**
|
|
121
112
|
|
|
122
113
|
```js
|
|
123
|
-
|
|
124
114
|
publicSchema
|
|
125
115
|
.subscribe()
|
|
126
116
|
.receive('ok', () => console.log('Connected.'))
|
|
127
117
|
.receive('error', () => console.log('Failed.'))
|
|
128
118
|
.receive('timeout', () => console.log('Timed out, retrying.'))
|
|
129
|
-
|
|
130
119
|
```
|
|
131
120
|
|
|
132
|
-
### Event Responses
|
|
133
|
-
|
|
134
|
-
Events are returned in the following format.
|
|
135
|
-
|
|
136
|
-
```ts
|
|
137
|
-
type Response = {
|
|
138
|
-
// the change timestamp. eg: "2020-10-13T10:09:22Z".
|
|
139
|
-
commit_timestamp: string
|
|
140
|
-
|
|
141
|
-
// the database schema. eg: "public".
|
|
142
|
-
schema: string
|
|
143
|
-
|
|
144
|
-
// the database table. eg: "users".
|
|
145
|
-
table: string
|
|
146
|
-
|
|
147
|
-
// the event type.
|
|
148
|
-
type: INSERT | UPDATE | DELETE
|
|
149
|
-
|
|
150
|
-
// all the columns for this table. See "column" type below.
|
|
151
|
-
columns: column[]
|
|
152
|
-
|
|
153
|
-
// the new values. eg: { "id": "9", "age": "12" }.
|
|
154
|
-
record: object
|
|
155
|
-
|
|
156
|
-
// the previous values. eg: { "id": "9", "age": "11" }. Only works if the table has `REPLICATION FULL`.
|
|
157
|
-
old_record: object
|
|
158
|
-
|
|
159
|
-
// any change errors.
|
|
160
|
-
errors: null | string[]
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
type column = {
|
|
164
|
-
// any special flags for the column. eg: ["key"]
|
|
165
|
-
flags: string[]
|
|
166
|
-
|
|
167
|
-
// the column name. eg: "user_id"
|
|
168
|
-
name: string
|
|
169
|
-
|
|
170
|
-
// the column type. eg: "uuid"
|
|
171
|
-
type: string
|
|
172
|
-
|
|
173
|
-
// the type modifier. eg: 4294967295
|
|
174
|
-
type_modifier: number
|
|
175
|
-
}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
121
|
## Credits
|
|
179
122
|
|
|
180
123
|
- Original Node.js client was made by Mario Campa of [phoenix-channels](github.com/mcampa/phoenix-client).
|
|
@@ -183,4 +126,3 @@ type column = {
|
|
|
183
126
|
## License
|
|
184
127
|
|
|
185
128
|
MIT. License is the same as [phoenix-channels](https://github.com/mcampa/phoenix-client) and [Phoenix Framework](https://phoenixframework.org/).
|
|
186
|
-
|
|
@@ -2,28 +2,47 @@ import { CHANNEL_STATES } from './lib/constants';
|
|
|
2
2
|
import Push from './lib/push';
|
|
3
3
|
import RealtimeClient from './RealtimeClient';
|
|
4
4
|
import Timer from './lib/timer';
|
|
5
|
-
import RealtimePresence, {
|
|
6
|
-
export declare type
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
import RealtimePresence, { RealtimePresenceJoinPayload, RealtimePresenceLeavePayload, RealtimePresenceState, REALTIME_PRESENCE_LISTEN_EVENTS } from './RealtimePresence';
|
|
6
|
+
export declare type RealtimeChannelOptions = {
|
|
7
|
+
config: {
|
|
8
|
+
/**
|
|
9
|
+
* self option enables client to receive message it broadcast
|
|
10
|
+
* ack option instructs server to acknowlege that broadcast message was received
|
|
11
|
+
*/
|
|
12
|
+
broadcast?: {
|
|
13
|
+
self?: boolean;
|
|
14
|
+
ack?: boolean;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* key option is used to track presence payload across clients
|
|
18
|
+
*/
|
|
19
|
+
presence?: {
|
|
20
|
+
key?: string;
|
|
21
|
+
};
|
|
20
22
|
};
|
|
23
|
+
};
|
|
24
|
+
export declare type RealtimePostgresChangesPayload<T extends {
|
|
21
25
|
[key: string]: any;
|
|
26
|
+
}> = {
|
|
27
|
+
schema: string;
|
|
28
|
+
table: string;
|
|
29
|
+
commit_timestamp: string;
|
|
30
|
+
eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}` | `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}` | `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`;
|
|
31
|
+
new: T | {};
|
|
32
|
+
old: Partial<T> | {};
|
|
33
|
+
errors: string[];
|
|
22
34
|
};
|
|
35
|
+
export declare type RealtimeChannelSendResponse = 'ok' | 'timed out' | 'rate limited';
|
|
36
|
+
export declare enum REALTIME_POSTGRES_CHANGES_LISTEN_EVENT {
|
|
37
|
+
ALL = "*",
|
|
38
|
+
INSERT = "INSERT",
|
|
39
|
+
UPDATE = "UPDATE",
|
|
40
|
+
DELETE = "DELETE"
|
|
41
|
+
}
|
|
23
42
|
export declare enum REALTIME_LISTEN_TYPES {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
43
|
+
BROADCAST = "broadcast",
|
|
44
|
+
PRESENCE = "presence",
|
|
45
|
+
POSTGRES_CHANGES = "postgres_changes"
|
|
27
46
|
}
|
|
28
47
|
export declare enum REALTIME_SUBSCRIBE_STATES {
|
|
29
48
|
SUBSCRIBED = "SUBSCRIBED",
|
|
@@ -33,7 +52,7 @@ export declare enum REALTIME_SUBSCRIBE_STATES {
|
|
|
33
52
|
}
|
|
34
53
|
export default class RealtimeChannel {
|
|
35
54
|
topic: string;
|
|
36
|
-
params:
|
|
55
|
+
params: RealtimeChannelOptions;
|
|
37
56
|
socket: RealtimeClient;
|
|
38
57
|
bindings: {
|
|
39
58
|
[key: string]: {
|
|
@@ -52,45 +71,41 @@ export default class RealtimeChannel {
|
|
|
52
71
|
rejoinTimer: Timer;
|
|
53
72
|
pushBuffer: Push[];
|
|
54
73
|
presence: RealtimePresence;
|
|
55
|
-
constructor(topic: string, params:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
presenceState(): PresenceState;
|
|
74
|
+
constructor(topic: string, params: RealtimeChannelOptions, socket: RealtimeClient);
|
|
75
|
+
subscribe(callback?: (status: `${REALTIME_SUBSCRIBE_STATES}`, err?: Error) => void, timeout?: number): RealtimeChannel;
|
|
76
|
+
presenceState(): RealtimePresenceState;
|
|
59
77
|
track(payload: {
|
|
60
78
|
[key: string]: any;
|
|
61
79
|
}, opts?: {
|
|
62
80
|
[key: string]: any;
|
|
63
|
-
}): Promise<
|
|
81
|
+
}): Promise<RealtimeChannelSendResponse>;
|
|
64
82
|
untrack(opts?: {
|
|
65
83
|
[key: string]: any;
|
|
66
|
-
}): Promise<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
* Registers a callback that will be executed when the channel encounteres an error.
|
|
73
|
-
*/
|
|
74
|
-
onError(callback: Function): void;
|
|
75
|
-
on(type: string, filter: {
|
|
84
|
+
}): Promise<RealtimeChannelSendResponse>;
|
|
85
|
+
on(type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, filter: {
|
|
86
|
+
event: string;
|
|
87
|
+
}, callback: (payload: {
|
|
88
|
+
type: `${REALTIME_LISTEN_TYPES.BROADCAST}`;
|
|
89
|
+
event: string;
|
|
76
90
|
[key: string]: any;
|
|
77
|
-
}
|
|
78
|
-
|
|
91
|
+
}) => void): RealtimeChannel;
|
|
92
|
+
on(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
93
|
+
event: `${REALTIME_PRESENCE_LISTEN_EVENTS}`;
|
|
94
|
+
}, callback: (payload: RealtimePresenceJoinPayload | RealtimePresenceLeavePayload | undefined) => void): RealtimeChannel;
|
|
95
|
+
on<T extends {
|
|
79
96
|
[key: string]: any;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
[key: string]: any;
|
|
87
|
-
}, timeout?: number): Push;
|
|
97
|
+
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: {
|
|
98
|
+
event: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT}`;
|
|
99
|
+
schema: string;
|
|
100
|
+
table?: string;
|
|
101
|
+
filter?: string;
|
|
102
|
+
}, callback: (payload: RealtimePostgresChangesPayload<T>) => void): RealtimeChannel;
|
|
88
103
|
send(payload: {
|
|
89
104
|
type: string;
|
|
90
105
|
[key: string]: any;
|
|
91
106
|
}, opts?: {
|
|
92
107
|
[key: string]: any;
|
|
93
|
-
}): Promise<
|
|
108
|
+
}): Promise<RealtimeChannelSendResponse>;
|
|
94
109
|
updateJoinPayload(payload: {
|
|
95
110
|
[key: string]: any;
|
|
96
111
|
}): void;
|
|
@@ -104,24 +119,45 @@ export default class RealtimeChannel {
|
|
|
104
119
|
* channel.unsubscribe().receive("ok", () => alert("left!") )
|
|
105
120
|
*/
|
|
106
121
|
unsubscribe(timeout?: number): Promise<'ok' | 'timed out' | 'error'>;
|
|
122
|
+
_push(event: string, payload: {
|
|
123
|
+
[key: string]: any;
|
|
124
|
+
}, timeout?: number): Push;
|
|
107
125
|
/**
|
|
108
126
|
* Overridable message hook
|
|
109
127
|
*
|
|
110
128
|
* Receives all events for specialized message handling before dispatching to the channel callbacks.
|
|
111
129
|
* Must return the payload, modified or unmodified.
|
|
112
130
|
*/
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
131
|
+
_onMessage(_event: string, payload: any, _ref?: string): any;
|
|
132
|
+
_isMember(topic: string): boolean;
|
|
133
|
+
_joinRef(): string;
|
|
134
|
+
_trigger(type: string, payload?: any, ref?: string): void;
|
|
135
|
+
_isClosed(): boolean;
|
|
136
|
+
_isJoined(): boolean;
|
|
137
|
+
_isJoining(): boolean;
|
|
138
|
+
_isLeaving(): boolean;
|
|
139
|
+
_replyEventName(ref: string): string;
|
|
140
|
+
_on(type: string, filter: {
|
|
141
|
+
[key: string]: any;
|
|
142
|
+
}, callback: Function): this;
|
|
143
|
+
_off(type: string, filter: {
|
|
144
|
+
[key: string]: any;
|
|
145
|
+
}): this;
|
|
124
146
|
private static isEqual;
|
|
125
|
-
private
|
|
147
|
+
private _rejoinUntilConnected;
|
|
148
|
+
/**
|
|
149
|
+
* Registers a callback that will be executed when the channel closes.
|
|
150
|
+
*/
|
|
151
|
+
private _onClose;
|
|
152
|
+
/**
|
|
153
|
+
* Registers a callback that will be executed when the channel encounteres an error.
|
|
154
|
+
*/
|
|
155
|
+
private _onError;
|
|
156
|
+
/**
|
|
157
|
+
* Returns `true` if the socket is connected and the channel has been joined.
|
|
158
|
+
*/
|
|
159
|
+
private _canPush;
|
|
160
|
+
private _rejoin;
|
|
161
|
+
private _getPayloadRecords;
|
|
126
162
|
}
|
|
127
163
|
//# sourceMappingURL=RealtimeChannel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RealtimeChannel.d.ts","sourceRoot":"","sources":["../../src/RealtimeChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,IAAI,MAAM,YAAY,CAAA;AAC7B,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,MAAM,aAAa,CAAA;AAC/B,OAAO,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"RealtimeChannel.d.ts","sourceRoot":"","sources":["../../src/RealtimeChannel.ts"],"names":[],"mappings":"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"}
|