graphql-pg-subscriptions 3.1.7 → 3.2.0
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 +1 -13
- package/dist/cjs/pubsub/event-emitter-to-async-iterator.d.ts +2 -1
- package/dist/cjs/pubsub/event-emitter-to-async-iterator.js +17 -4
- package/dist/cjs/pubsub/event-emitter-to-async-iterator.js.map +1 -1
- package/dist/cjs/pubsub/postgres-pubsub.d.ts +0 -2
- package/dist/cjs/pubsub/postgres-pubsub.js +7 -31
- package/dist/cjs/pubsub/postgres-pubsub.js.map +1 -1
- package/dist/esm/pubsub/event-emitter-to-async-iterator.d.ts +2 -1
- package/dist/esm/pubsub/event-emitter-to-async-iterator.js +17 -4
- package/dist/esm/pubsub/event-emitter-to-async-iterator.js.map +1 -1
- package/dist/esm/pubsub/postgres-pubsub.d.ts +0 -2
- package/dist/esm/pubsub/postgres-pubsub.js +7 -31
- package/dist/esm/pubsub/postgres-pubsub.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,15 +24,7 @@ export const pubsub = new PubSub();
|
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
```js
|
|
27
|
-
//
|
|
28
|
-
import { PostgresPubSub } from "graphql-pg-subscriptions";
|
|
29
|
-
|
|
30
|
-
export const pubsub = new PostgresPubSub();
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
This library uses [`node-postgres`](https://github.com/brianc/node-postgres) to connect to PostgreSQL. If you want to customize connection options, please refer to their [connection docs](https://node-postgres.com/features/connecting).
|
|
34
|
-
|
|
35
|
-
```js
|
|
27
|
+
//After
|
|
36
28
|
import { PostgresPubSub } from "graphql-postgres-subscriptions";
|
|
37
29
|
import { Client } from "pg";
|
|
38
30
|
|
|
@@ -51,8 +43,6 @@ const pubsub = new PostgresPubSub({ client, maxListeners: 15 });
|
|
|
51
43
|
//You can increase max event listeners if you need, default is 15
|
|
52
44
|
```
|
|
53
45
|
|
|
54
|
-
**Important**: Don't pass clients from `pg`'s `Pool` to `PostgresPubSub`. As [node-postgres creator states in this StackOverflow answer](https://stackoverflow.com/questions/8484404/what-is-the-proper-way-to-use-the-node-js-postgresql-module), the client needs to be around and not shared so pg can properly handle `NOTIFY` messages (which this library uses under the hood)
|
|
55
|
-
|
|
56
46
|
### commonMessageHandler
|
|
57
47
|
|
|
58
48
|
The second argument to `new PostgresPubSub()` is the `commonMessageHandler`. The common message handler gets called with the received message from PostgreSQL.
|
|
@@ -93,8 +83,6 @@ For example you can log all error messages (including stack traces and friends)
|
|
|
93
83
|
ps.subscribe("error", console.error);
|
|
94
84
|
```
|
|
95
85
|
|
|
96
|
-
This is a forked version of [GraphQLCollege/graphql-postgres-subscriptions](https://github.com/GraphQLCollege/graphql-postgres-subscriptions), where I add typescript and dependency error.
|
|
97
|
-
|
|
98
86
|
## Stay in touch
|
|
99
87
|
|
|
100
88
|
- Author - [Siam Ahnaf](https://www.siamahnaf.com/)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { $$asyncIterator } from "iterall";
|
|
3
3
|
import { EventEmitter } from "events";
|
|
4
|
+
import { Client } from "pg";
|
|
4
5
|
type MessageHandler<T> = (message: T) => any;
|
|
5
|
-
declare function eventEmitterAsyncIterator<T>(eventEmitter: EventEmitter, eventsNames: string | string[], commonMessageHandler
|
|
6
|
+
declare function eventEmitterAsyncIterator<T>(eventEmitter: EventEmitter, eventsNames: string | string[], commonMessageHandler: MessageHandler<T> | undefined, client: Client): {
|
|
6
7
|
next(): Promise<IteratorResult<any, any>>;
|
|
7
8
|
return(): Promise<{
|
|
8
9
|
value: undefined;
|
|
@@ -1,21 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.eventEmitterAsyncIterator = void 0;
|
|
4
13
|
const iterall_1 = require("iterall");
|
|
5
|
-
function eventEmitterAsyncIterator(eventEmitter, eventsNames, commonMessageHandler = message => message) {
|
|
14
|
+
function eventEmitterAsyncIterator(eventEmitter, eventsNames, commonMessageHandler = message => message, client) {
|
|
6
15
|
const pullQueue = [];
|
|
7
16
|
const pushQueue = [];
|
|
8
17
|
const eventsArray = typeof eventsNames === "string" ? [eventsNames] : eventsNames;
|
|
9
18
|
let listening = true;
|
|
10
|
-
const pushValue = ({ payload: event })
|
|
11
|
-
const
|
|
19
|
+
const pushValue = (_a) => __awaiter(this, [_a], void 0, function* ({ payload: event }) {
|
|
20
|
+
const query = `SELECT payload FROM pubsub_payloads WHERE id = $1`;
|
|
21
|
+
const res = yield client.query(query, [event]);
|
|
22
|
+
const value = commonMessageHandler(res.rows[0].payload);
|
|
12
23
|
if (pullQueue.length !== 0) {
|
|
13
24
|
pullQueue.shift()({ value, done: false });
|
|
14
25
|
}
|
|
15
26
|
else {
|
|
16
27
|
pushQueue.push(value);
|
|
17
28
|
}
|
|
18
|
-
|
|
29
|
+
const deleteQuery = `DELETE FROM pubsub_payloads WHERE id = $1`;
|
|
30
|
+
yield client.query(deleteQuery, [event]);
|
|
31
|
+
});
|
|
19
32
|
const pullValue = () => {
|
|
20
33
|
return new Promise(resolve => {
|
|
21
34
|
if (pushQueue.length !== 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter-to-async-iterator.js","sourceRoot":"","sources":["../../../src/pubsub/event-emitter-to-async-iterator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-emitter-to-async-iterator.js","sourceRoot":"","sources":["../../../src/pubsub/event-emitter-to-async-iterator.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,13 +11,11 @@ declare class PostgresPubSub extends PubSubEngine {
|
|
|
11
11
|
private subscriptions;
|
|
12
12
|
private subIdCounter;
|
|
13
13
|
private commonMessageHandler;
|
|
14
|
-
private triggerSubscriptionsCount;
|
|
15
14
|
constructor(options?: PostgresPubSubOptions);
|
|
16
15
|
private ensureTableExists;
|
|
17
16
|
publish(triggerName: string, payload: any): Promise<void>;
|
|
18
17
|
subscribe(triggerName: string, onMessage: (message: any) => void): Promise<number>;
|
|
19
18
|
unsubscribe(subId: number): Promise<void>;
|
|
20
|
-
cleanUpOldPayloads(): Promise<void>;
|
|
21
19
|
asyncIterator<T>(triggers: string | string[]): AsyncIterator<T>;
|
|
22
20
|
}
|
|
23
21
|
export { PostgresPubSub, PostgresPubSubOptions };
|
|
@@ -43,7 +43,6 @@ class PostgresPubSub extends graphql_subscriptions_1.PubSubEngine {
|
|
|
43
43
|
this.subscriptions = {};
|
|
44
44
|
this.subIdCounter = 0;
|
|
45
45
|
this.commonMessageHandler = commonMessageHandler || defaultCommonMessageHandler;
|
|
46
|
-
this.triggerSubscriptionsCount = {};
|
|
47
46
|
this.ensureTableExists();
|
|
48
47
|
}
|
|
49
48
|
ensureTableExists() {
|
|
@@ -63,30 +62,18 @@ class PostgresPubSub extends graphql_subscriptions_1.PubSubEngine {
|
|
|
63
62
|
const payloadString = JSON.stringify(payload);
|
|
64
63
|
const result = yield this.client.query(`INSERT INTO pubsub_payloads (trigger, payload) VALUES ($1, $2) RETURNING id`, [triggerName, payloadString]);
|
|
65
64
|
const id = result.rows[0].id;
|
|
66
|
-
return this.ee.notify(triggerName,
|
|
65
|
+
return this.ee.notify(triggerName, id.toString());
|
|
67
66
|
});
|
|
68
67
|
}
|
|
69
68
|
subscribe(triggerName, onMessage) {
|
|
70
|
-
const callback = (message) =>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const id = message.payload.id;
|
|
76
|
-
console.log(id);
|
|
77
|
-
const result = yield this.client.query(`SELECT payload FROM pubsub_payloads WHERE id = $1`, [id]);
|
|
78
|
-
console.log(result);
|
|
79
|
-
const payload = result.rows[0].payload;
|
|
80
|
-
onMessage(this.commonMessageHandler(JSON.parse(payload)));
|
|
81
|
-
}
|
|
82
|
-
});
|
|
69
|
+
const callback = (message) => {
|
|
70
|
+
onMessage(message instanceof Error
|
|
71
|
+
? message
|
|
72
|
+
: this.commonMessageHandler(message.payload));
|
|
73
|
+
};
|
|
83
74
|
this.ee.on(triggerName, callback);
|
|
84
75
|
this.subIdCounter += 1;
|
|
85
76
|
this.subscriptions[this.subIdCounter] = [triggerName, callback];
|
|
86
|
-
if (!this.triggerSubscriptionsCount[triggerName]) {
|
|
87
|
-
this.triggerSubscriptionsCount[triggerName] = 0;
|
|
88
|
-
}
|
|
89
|
-
this.triggerSubscriptionsCount[triggerName] += 1;
|
|
90
77
|
return Promise.resolve(this.subIdCounter);
|
|
91
78
|
}
|
|
92
79
|
unsubscribe(subId) {
|
|
@@ -94,21 +81,10 @@ class PostgresPubSub extends graphql_subscriptions_1.PubSubEngine {
|
|
|
94
81
|
const [triggerName, onMessage] = this.subscriptions[subId];
|
|
95
82
|
delete this.subscriptions[subId];
|
|
96
83
|
this.ee.removeListener(triggerName, onMessage);
|
|
97
|
-
if (this.triggerSubscriptionsCount[triggerName]) {
|
|
98
|
-
this.triggerSubscriptionsCount[triggerName] -= 1;
|
|
99
|
-
if (this.triggerSubscriptionsCount[triggerName] === 0) {
|
|
100
|
-
yield this.cleanUpOldPayloads();
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
cleanUpOldPayloads() {
|
|
106
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
-
yield this.client.query(`DELETE FROM pubsub_payloads WHERE created_at < NOW() - INTERVAL '3 days'`);
|
|
108
84
|
});
|
|
109
85
|
}
|
|
110
86
|
asyncIterator(triggers) {
|
|
111
|
-
return (0, event_emitter_to_async_iterator_1.eventEmitterAsyncIterator)(this.ee, triggers, this.commonMessageHandler);
|
|
87
|
+
return (0, event_emitter_to_async_iterator_1.eventEmitterAsyncIterator)(this.ee, triggers, this.commonMessageHandler, this.client);
|
|
112
88
|
}
|
|
113
89
|
}
|
|
114
90
|
exports.PostgresPubSub = PostgresPubSub;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-pubsub.js","sourceRoot":"","sources":["../../../src/pubsub/postgres-pubsub.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAqD;AACrD,YAAY;AACZ,oDAA2B;AAC3B,2BAA0C;AAC1C,uFAA8E;AAE9E,MAAM,2BAA2B,GAAG,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC;AAQ9D,MAAM,cAAe,SAAQ,oCAAY;
|
|
1
|
+
{"version":3,"file":"postgres-pubsub.js","sourceRoot":"","sources":["../../../src/pubsub/postgres-pubsub.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { $$asyncIterator } from "iterall";
|
|
3
3
|
import { EventEmitter } from "events";
|
|
4
|
+
import { Client } from "pg";
|
|
4
5
|
type MessageHandler<T> = (message: T) => any;
|
|
5
|
-
declare function eventEmitterAsyncIterator<T>(eventEmitter: EventEmitter, eventsNames: string | string[], commonMessageHandler
|
|
6
|
+
declare function eventEmitterAsyncIterator<T>(eventEmitter: EventEmitter, eventsNames: string | string[], commonMessageHandler: MessageHandler<T> | undefined, client: Client): {
|
|
6
7
|
next(): Promise<IteratorResult<any, any>>;
|
|
7
8
|
return(): Promise<{
|
|
8
9
|
value: undefined;
|
|
@@ -1,18 +1,31 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { $$asyncIterator } from "iterall";
|
|
2
|
-
function eventEmitterAsyncIterator(eventEmitter, eventsNames, commonMessageHandler = message => message) {
|
|
11
|
+
function eventEmitterAsyncIterator(eventEmitter, eventsNames, commonMessageHandler = message => message, client) {
|
|
3
12
|
const pullQueue = [];
|
|
4
13
|
const pushQueue = [];
|
|
5
14
|
const eventsArray = typeof eventsNames === "string" ? [eventsNames] : eventsNames;
|
|
6
15
|
let listening = true;
|
|
7
|
-
const pushValue = ({ payload: event })
|
|
8
|
-
const
|
|
16
|
+
const pushValue = (_a) => __awaiter(this, [_a], void 0, function* ({ payload: event }) {
|
|
17
|
+
const query = `SELECT payload FROM pubsub_payloads WHERE id = $1`;
|
|
18
|
+
const res = yield client.query(query, [event]);
|
|
19
|
+
const value = commonMessageHandler(res.rows[0].payload);
|
|
9
20
|
if (pullQueue.length !== 0) {
|
|
10
21
|
pullQueue.shift()({ value, done: false });
|
|
11
22
|
}
|
|
12
23
|
else {
|
|
13
24
|
pushQueue.push(value);
|
|
14
25
|
}
|
|
15
|
-
|
|
26
|
+
const deleteQuery = `DELETE FROM pubsub_payloads WHERE id = $1`;
|
|
27
|
+
yield client.query(deleteQuery, [event]);
|
|
28
|
+
});
|
|
16
29
|
const pullValue = () => {
|
|
17
30
|
return new Promise(resolve => {
|
|
18
31
|
if (pushQueue.length !== 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter-to-async-iterator.js","sourceRoot":"","sources":["../../../src/pubsub/event-emitter-to-async-iterator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"event-emitter-to-async-iterator.js","sourceRoot":"","sources":["../../../src/pubsub/event-emitter-to-async-iterator.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,13 +11,11 @@ declare class PostgresPubSub extends PubSubEngine {
|
|
|
11
11
|
private subscriptions;
|
|
12
12
|
private subIdCounter;
|
|
13
13
|
private commonMessageHandler;
|
|
14
|
-
private triggerSubscriptionsCount;
|
|
15
14
|
constructor(options?: PostgresPubSubOptions);
|
|
16
15
|
private ensureTableExists;
|
|
17
16
|
publish(triggerName: string, payload: any): Promise<void>;
|
|
18
17
|
subscribe(triggerName: string, onMessage: (message: any) => void): Promise<number>;
|
|
19
18
|
unsubscribe(subId: number): Promise<void>;
|
|
20
|
-
cleanUpOldPayloads(): Promise<void>;
|
|
21
19
|
asyncIterator<T>(triggers: string | string[]): AsyncIterator<T>;
|
|
22
20
|
}
|
|
23
21
|
export { PostgresPubSub, PostgresPubSubOptions };
|
|
@@ -37,7 +37,6 @@ class PostgresPubSub extends PubSubEngine {
|
|
|
37
37
|
this.subscriptions = {};
|
|
38
38
|
this.subIdCounter = 0;
|
|
39
39
|
this.commonMessageHandler = commonMessageHandler || defaultCommonMessageHandler;
|
|
40
|
-
this.triggerSubscriptionsCount = {};
|
|
41
40
|
this.ensureTableExists();
|
|
42
41
|
}
|
|
43
42
|
ensureTableExists() {
|
|
@@ -57,30 +56,18 @@ class PostgresPubSub extends PubSubEngine {
|
|
|
57
56
|
const payloadString = JSON.stringify(payload);
|
|
58
57
|
const result = yield this.client.query(`INSERT INTO pubsub_payloads (trigger, payload) VALUES ($1, $2) RETURNING id`, [triggerName, payloadString]);
|
|
59
58
|
const id = result.rows[0].id;
|
|
60
|
-
return this.ee.notify(triggerName,
|
|
59
|
+
return this.ee.notify(triggerName, id.toString());
|
|
61
60
|
});
|
|
62
61
|
}
|
|
63
62
|
subscribe(triggerName, onMessage) {
|
|
64
|
-
const callback = (message) =>
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const id = message.payload.id;
|
|
70
|
-
console.log(id);
|
|
71
|
-
const result = yield this.client.query(`SELECT payload FROM pubsub_payloads WHERE id = $1`, [id]);
|
|
72
|
-
console.log(result);
|
|
73
|
-
const payload = result.rows[0].payload;
|
|
74
|
-
onMessage(this.commonMessageHandler(JSON.parse(payload)));
|
|
75
|
-
}
|
|
76
|
-
});
|
|
63
|
+
const callback = (message) => {
|
|
64
|
+
onMessage(message instanceof Error
|
|
65
|
+
? message
|
|
66
|
+
: this.commonMessageHandler(message.payload));
|
|
67
|
+
};
|
|
77
68
|
this.ee.on(triggerName, callback);
|
|
78
69
|
this.subIdCounter += 1;
|
|
79
70
|
this.subscriptions[this.subIdCounter] = [triggerName, callback];
|
|
80
|
-
if (!this.triggerSubscriptionsCount[triggerName]) {
|
|
81
|
-
this.triggerSubscriptionsCount[triggerName] = 0;
|
|
82
|
-
}
|
|
83
|
-
this.triggerSubscriptionsCount[triggerName] += 1;
|
|
84
71
|
return Promise.resolve(this.subIdCounter);
|
|
85
72
|
}
|
|
86
73
|
unsubscribe(subId) {
|
|
@@ -88,21 +75,10 @@ class PostgresPubSub extends PubSubEngine {
|
|
|
88
75
|
const [triggerName, onMessage] = this.subscriptions[subId];
|
|
89
76
|
delete this.subscriptions[subId];
|
|
90
77
|
this.ee.removeListener(triggerName, onMessage);
|
|
91
|
-
if (this.triggerSubscriptionsCount[triggerName]) {
|
|
92
|
-
this.triggerSubscriptionsCount[triggerName] -= 1;
|
|
93
|
-
if (this.triggerSubscriptionsCount[triggerName] === 0) {
|
|
94
|
-
yield this.cleanUpOldPayloads();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
cleanUpOldPayloads() {
|
|
100
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
101
|
-
yield this.client.query(`DELETE FROM pubsub_payloads WHERE created_at < NOW() - INTERVAL '3 days'`);
|
|
102
78
|
});
|
|
103
79
|
}
|
|
104
80
|
asyncIterator(triggers) {
|
|
105
|
-
return eventEmitterAsyncIterator(this.ee, triggers, this.commonMessageHandler);
|
|
81
|
+
return eventEmitterAsyncIterator(this.ee, triggers, this.commonMessageHandler, this.client);
|
|
106
82
|
}
|
|
107
83
|
}
|
|
108
84
|
export { PostgresPubSub };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-pubsub.js","sourceRoot":"","sources":["../../../src/pubsub/postgres-pubsub.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY;AACZ,OAAO,KAAK,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAgB,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,MAAM,2BAA2B,GAAG,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC;AAQ9D,MAAM,cAAe,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"postgres-pubsub.js","sourceRoot":"","sources":["../../../src/pubsub/postgres-pubsub.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "graphql-pg-subscriptions",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "A graphql subscriptions implementation using postgres and apollo's graphql-subscriptions.",
|
|
5
5
|
"homepage": "https://github.com/siamahnaf/graphql-pg-subscriptions",
|
|
6
6
|
"main": "dist/cjs/index.js",
|