@aws-amplify/api-graphql 4.7.2-graphql-data-ka.518fb2c.0 → 4.7.2-publish-event-websocket.65d9752.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/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js +15 -14
- package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js.map +1 -1
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js +55 -49
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js.map +1 -1
- package/dist/cjs/Providers/constants.js +1 -5
- package/dist/cjs/Providers/constants.js.map +1 -1
- package/dist/cjs/internals/events/index.js +11 -1
- package/dist/cjs/internals/events/index.js.map +1 -1
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs +15 -14
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs.map +1 -1
- package/dist/esm/Providers/AWSWebSocketProvider/index.d.ts +3 -5
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs +56 -50
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs.map +1 -1
- package/dist/esm/Providers/constants.d.ts +0 -4
- package/dist/esm/Providers/constants.mjs +1 -5
- package/dist/esm/Providers/constants.mjs.map +1 -1
- package/dist/esm/internals/events/index.mjs +11 -1
- package/dist/esm/internals/events/index.mjs.map +1 -1
- package/dist/esm/internals/events/types.d.ts +10 -0
- package/package.json +4 -4
- package/src/Providers/AWSAppSyncEventsProvider/index.ts +15 -13
- package/src/Providers/AWSWebSocketProvider/index.ts +63 -64
- package/src/Providers/constants.ts +0 -5
- package/src/internals/events/index.ts +2 -2
- package/src/internals/events/types.ts +10 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../src/Providers/constants.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RECONNECT_INTERVAL = exports.RECONNECT_DELAY = exports.DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT = exports.
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../src/Providers/constants.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RECONNECT_INTERVAL = exports.RECONNECT_DELAY = exports.DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT = exports.DEFAULT_KEEP_ALIVE_TIMEOUT = exports.START_ACK_TIMEOUT = exports.CONNECTION_INIT_TIMEOUT = exports.AWS_APPSYNC_REALTIME_HEADERS = exports.SOCKET_STATUS = exports.SUBSCRIPTION_STATUS = exports.MESSAGE_TYPES = exports.CONNECTION_STATE_CHANGE = exports.NON_RETRYABLE_ERROR_TYPES = exports.NON_RETRYABLE_CODES = exports.MAX_DELAY_MS = exports.AMPLIFY_SYMBOL = void 0;\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nvar utils_1 = require(\"@aws-amplify/core/internals/utils\");\nObject.defineProperty(exports, \"AMPLIFY_SYMBOL\", { enumerable: true, get: function () { return utils_1.AMPLIFY_SYMBOL; } });\nexports.MAX_DELAY_MS = 5000;\nexports.NON_RETRYABLE_CODES = [400, 401, 403];\nexports.NON_RETRYABLE_ERROR_TYPES = [\n 'BadRequestException',\n 'UnauthorizedException',\n];\nexports.CONNECTION_STATE_CHANGE = 'ConnectionStateChange';\nvar MESSAGE_TYPES;\n(function (MESSAGE_TYPES) {\n /**\n * Client -> Server message.\n * This message type is the first message after handshake and this will initialize AWS AppSync RealTime communication\n */\n MESSAGE_TYPES[\"GQL_CONNECTION_INIT\"] = \"connection_init\";\n /**\n * Server -> Client message\n * This message type is in case there is an issue with AWS AppSync RealTime when establishing connection\n */\n MESSAGE_TYPES[\"GQL_CONNECTION_ERROR\"] = \"connection_error\";\n /**\n * Server -> Client message.\n * This message type is for the ack response from AWS AppSync RealTime for GQL_CONNECTION_INIT message\n */\n MESSAGE_TYPES[\"GQL_CONNECTION_ACK\"] = \"connection_ack\";\n /**\n * Client -> Server message.\n * This message type is for register subscriptions with AWS AppSync RealTime\n */\n MESSAGE_TYPES[\"GQL_START\"] = \"start\";\n /**\n * Server -> Client message.\n * This message type is for the ack response from AWS AppSync RealTime for GQL_START message\n */\n MESSAGE_TYPES[\"GQL_START_ACK\"] = \"start_ack\";\n /**\n * Server -> Client message.\n * This message type is for subscription message from AWS AppSync RealTime or Events\n */\n MESSAGE_TYPES[\"DATA\"] = \"data\";\n /**\n * Server -> Client message.\n * This message type helps the client to know is still receiving messages from AWS AppSync RealTime\n */\n MESSAGE_TYPES[\"GQL_CONNECTION_KEEP_ALIVE\"] = \"ka\";\n /**\n * Client -> Server message.\n * This message type is for unregister subscriptions with AWS AppSync RealTime\n */\n MESSAGE_TYPES[\"GQL_STOP\"] = \"stop\";\n /**\n * Server -> Client message.\n * This message type is for the ack response from AWS AppSync RealTime for GQL_STOP message\n */\n MESSAGE_TYPES[\"GQL_COMPLETE\"] = \"complete\";\n /**\n * Server -> Client message.\n * This message type is for sending error messages from AWS AppSync RealTime to the client\n */\n MESSAGE_TYPES[\"GQL_ERROR\"] = \"error\";\n /**\n * Client -> Server message.\n * This message type is for registering subscriptions with Events\n */\n MESSAGE_TYPES[\"EVENT_SUBSCRIBE\"] = \"subscribe\";\n /**\n * Client -> Server message.\n * This message type is for publishing a message with Events\n */\n MESSAGE_TYPES[\"EVENT_PUBLISH\"] = \"publish\";\n /**\n * Server -> Client message.\n * Server acknowledges successful subscription\n */\n MESSAGE_TYPES[\"EVENT_SUBSCRIBE_ACK\"] = \"subscribe_success\";\n /**\n * Server -> Client message.\n * Server acknowledges successful publish\n */\n MESSAGE_TYPES[\"EVENT_PUBLISH_ACK\"] = \"publish_success\";\n /**\n * Client -> Server message.\n * This message type is for unregister subscriptions with AWS AppSync RealTime\n */\n MESSAGE_TYPES[\"EVENT_STOP\"] = \"unsubscribe\";\n /**\n * Server -> Client message.\n * This is the ack response from AWS AppSync Events to EVENT_STOP message\n */\n MESSAGE_TYPES[\"EVENT_COMPLETE\"] = \"unsubscribe_success\";\n})(MESSAGE_TYPES = exports.MESSAGE_TYPES || (exports.MESSAGE_TYPES = {}));\nvar SUBSCRIPTION_STATUS;\n(function (SUBSCRIPTION_STATUS) {\n SUBSCRIPTION_STATUS[SUBSCRIPTION_STATUS[\"PENDING\"] = 0] = \"PENDING\";\n SUBSCRIPTION_STATUS[SUBSCRIPTION_STATUS[\"CONNECTED\"] = 1] = \"CONNECTED\";\n SUBSCRIPTION_STATUS[SUBSCRIPTION_STATUS[\"FAILED\"] = 2] = \"FAILED\";\n})(SUBSCRIPTION_STATUS = exports.SUBSCRIPTION_STATUS || (exports.SUBSCRIPTION_STATUS = {}));\nvar SOCKET_STATUS;\n(function (SOCKET_STATUS) {\n SOCKET_STATUS[SOCKET_STATUS[\"CLOSED\"] = 0] = \"CLOSED\";\n SOCKET_STATUS[SOCKET_STATUS[\"READY\"] = 1] = \"READY\";\n SOCKET_STATUS[SOCKET_STATUS[\"CONNECTING\"] = 2] = \"CONNECTING\";\n})(SOCKET_STATUS = exports.SOCKET_STATUS || (exports.SOCKET_STATUS = {}));\nexports.AWS_APPSYNC_REALTIME_HEADERS = {\n accept: 'application/json, text/javascript',\n 'content-encoding': 'amz-1.0',\n 'content-type': 'application/json; charset=UTF-8',\n};\n/**\n * Time in milleseconds to wait for GQL_CONNECTION_INIT message\n */\nexports.CONNECTION_INIT_TIMEOUT = 15000;\n/**\n * Time in milleseconds to wait for GQL_START_ACK message\n */\nexports.START_ACK_TIMEOUT = 15000;\n/**\n * Default Time in milleseconds to wait for GQL_CONNECTION_KEEP_ALIVE message\n */\nexports.DEFAULT_KEEP_ALIVE_TIMEOUT = 5 * 60 * 1000;\n/**\n * Default Time in milleseconds to alert for missed GQL_CONNECTION_KEEP_ALIVE message\n */\nexports.DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT = 65 * 1000;\n/**\n * Default delay time in milleseconds between when reconnect is triggered vs when it is attempted\n */\nexports.RECONNECT_DELAY = 5 * 1000;\n/**\n * Default interval time in milleseconds between when reconnect is re-attempted\n */\nexports.RECONNECT_INTERVAL = 60 * 1000;\n"],"names":[],"mappings":"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"}
|
|
@@ -41,13 +41,23 @@ async function connect(channel, options) {
|
|
|
41
41
|
.subscribe(observer);
|
|
42
42
|
return _subscription;
|
|
43
43
|
};
|
|
44
|
+
// WS publish is not enabled in the service yet. It will be a follow up feature
|
|
45
|
+
const pub = async (event, pubOptions) => {
|
|
46
|
+
const publishOptions = {
|
|
47
|
+
...providerOptions,
|
|
48
|
+
query: channel,
|
|
49
|
+
variables: event,
|
|
50
|
+
};
|
|
51
|
+
publishOptions.authenticationType = (0, utils_1.normalizeAuth)(pubOptions?.authMode, publishOptions.authenticationType);
|
|
52
|
+
return AWSAppSyncEventsProvider_1.AppSyncEventProvider.publish(publishOptions);
|
|
53
|
+
};
|
|
44
54
|
const close = () => {
|
|
45
55
|
_subscription && _subscription.unsubscribe();
|
|
46
56
|
};
|
|
47
57
|
return {
|
|
48
58
|
subscribe: sub,
|
|
49
59
|
close,
|
|
50
|
-
|
|
60
|
+
publish: pub,
|
|
51
61
|
};
|
|
52
62
|
}
|
|
53
63
|
exports.connect = connect;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/internals/events/index.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.closeAll = exports.post = exports.connect = void 0;\nconst core_1 = require(\"@aws-amplify/core\");\nconst AWSAppSyncEventsProvider_1 = require(\"../../Providers/AWSAppSyncEventsProvider\");\nconst appsyncRequest_1 = require(\"./appsyncRequest\");\nconst utils_1 = require(\"./utils\");\n/**\n * @experimental API may change in future versions\n *\n * Establish a WebSocket connection to an Events channel\n *\n * @example\n * const channel = await events.connect(\"default/channel\")\n *\n * channel.subscribe({\n * next: (data) => { console.log(data) },\n * error: (err) => { console.error(err) },\n * })\n *\n * @example // authMode override\n * const channel = await events.connect(\"default/channel\", { authMode: \"userPool\" })\n *\n * @param channel - channel path; `<namespace>/<channel>`\n * @param options - request overrides: `authMode`, `authToken`\n *\n */\nasync function connect(channel, options) {\n const providerOptions = (0, utils_1.configure)();\n providerOptions.authenticationType = (0, utils_1.normalizeAuth)(options?.authMode, providerOptions.authenticationType);\n await AWSAppSyncEventsProvider_1.AppSyncEventProvider.connect(providerOptions);\n let _subscription;\n const sub = (observer, subOptions) => {\n const subscribeOptions = { ...providerOptions, query: channel };\n subscribeOptions.authenticationType = (0, utils_1.normalizeAuth)(subOptions?.authMode, subscribeOptions.authenticationType);\n _subscription = AWSAppSyncEventsProvider_1.AppSyncEventProvider\n .subscribe(subscribeOptions)\n .subscribe(observer);\n return _subscription;\n };\n // WS publish is not enabled in the service yet. It will be a follow up feature\n const
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/internals/events/index.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.closeAll = exports.post = exports.connect = void 0;\nconst core_1 = require(\"@aws-amplify/core\");\nconst AWSAppSyncEventsProvider_1 = require(\"../../Providers/AWSAppSyncEventsProvider\");\nconst appsyncRequest_1 = require(\"./appsyncRequest\");\nconst utils_1 = require(\"./utils\");\n/**\n * @experimental API may change in future versions\n *\n * Establish a WebSocket connection to an Events channel\n *\n * @example\n * const channel = await events.connect(\"default/channel\")\n *\n * channel.subscribe({\n * next: (data) => { console.log(data) },\n * error: (err) => { console.error(err) },\n * })\n *\n * @example // authMode override\n * const channel = await events.connect(\"default/channel\", { authMode: \"userPool\" })\n *\n * @param channel - channel path; `<namespace>/<channel>`\n * @param options - request overrides: `authMode`, `authToken`\n *\n */\nasync function connect(channel, options) {\n const providerOptions = (0, utils_1.configure)();\n providerOptions.authenticationType = (0, utils_1.normalizeAuth)(options?.authMode, providerOptions.authenticationType);\n await AWSAppSyncEventsProvider_1.AppSyncEventProvider.connect(providerOptions);\n let _subscription;\n const sub = (observer, subOptions) => {\n const subscribeOptions = { ...providerOptions, query: channel };\n subscribeOptions.authenticationType = (0, utils_1.normalizeAuth)(subOptions?.authMode, subscribeOptions.authenticationType);\n _subscription = AWSAppSyncEventsProvider_1.AppSyncEventProvider\n .subscribe(subscribeOptions)\n .subscribe(observer);\n return _subscription;\n };\n // WS publish is not enabled in the service yet. It will be a follow up feature\n const pub = async (event, pubOptions) => {\n const publishOptions = {\n ...providerOptions,\n query: channel,\n variables: event,\n };\n publishOptions.authenticationType = (0, utils_1.normalizeAuth)(pubOptions?.authMode, publishOptions.authenticationType);\n return AWSAppSyncEventsProvider_1.AppSyncEventProvider.publish(publishOptions);\n };\n const close = () => {\n _subscription && _subscription.unsubscribe();\n };\n return {\n subscribe: sub,\n close,\n publish: pub,\n };\n}\nexports.connect = connect;\n/**\n * @experimental API may change in future versions\n *\n * Publish events to a channel via HTTP request\n *\n * @example\n * await events.post(\"default/channel\", { some: \"event\" })\n *\n * @example // event batching\n * await events.post(\"default/channel\", [{ some: \"event\" }, { some: \"event2\" }])\n *\n * @example // authMode override\n * await events.post(\"default/channel\", { some: \"event\" }, { authMode: \"userPool\" })\n *\n * @param channel - channel path; `<namespace>/<channel>`\n * @param event - JSON-serializable value or an array of values\n * @param options - request overrides: `authMode`, `authToken`\n *\n * @returns void on success\n * @throws on error\n */\nasync function post(channel, event, options) {\n const providerOptions = (0, utils_1.configure)();\n providerOptions.authenticationType = (0, utils_1.normalizeAuth)(options?.authMode, providerOptions.authenticationType);\n // trailing slash required in publish\n const normalizedChannelName = channel[0] === '/' ? channel : `/${channel}`;\n const publishOptions = {\n ...providerOptions,\n query: normalizedChannelName,\n variables: (0, utils_1.serializeEvents)(event),\n authToken: options?.authToken,\n };\n const abortController = new AbortController();\n const res = await (0, appsyncRequest_1.appsyncRequest)(core_1.Amplify, publishOptions, {}, abortController);\n if (res.failed?.length > 0) {\n return res.failed;\n }\n}\nexports.post = post;\n/**\n * @experimental API may change in future versions\n *\n * Close WebSocket connection, disconnect listeners and reconnect observers\n *\n * @example\n * await events.closeAll()\n *\n * @returns void on success\n * @throws on error\n */\nasync function closeAll() {\n await AWSAppSyncEventsProvider_1.AppSyncEventProvider.close();\n}\nexports.closeAll = closeAll;\n"],"names":[],"mappings":";;AACA;AACA;AACA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;AAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAC5C,MAAM,0BAA0B,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAC;AACvF,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE;AACzC,IAAI,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC;AACrD,IAAI,eAAe,CAAC,kBAAkB,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;AAC3H,IAAI,MAAM,0BAA0B,CAAC,oBAAoB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AACnF,IAAI,IAAI,aAAa,CAAC;AACtB,IAAI,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,UAAU,KAAK;AAC1C,QAAQ,MAAM,gBAAgB,GAAG,EAAE,GAAG,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACxE,QAAQ,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;AACpI,QAAQ,aAAa,GAAG,0BAA0B,CAAC,oBAAoB;AACvE,aAAa,SAAS,CAAC,gBAAgB,CAAC;AACxC,aAAa,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,QAAQ,OAAO,aAAa,CAAC;AAC7B,KAAK,CAAC;AACN;AACA,IAAI,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE,UAAU,KAAK;AAC7C,QAAQ,MAAM,cAAc,GAAG;AAC/B,YAAY,GAAG,eAAe;AAC9B,YAAY,KAAK,EAAE,OAAO;AAC1B,YAAY,SAAS,EAAE,KAAK;AAC5B,SAAS,CAAC;AACV,QAAQ,cAAc,CAAC,kBAAkB,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAChI,QAAQ,OAAO,0BAA0B,CAAC,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACvF,KAAK,CAAC;AACN,IAAI,MAAM,KAAK,GAAG,MAAM;AACxB,QAAQ,aAAa,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;AACrD,KAAK,CAAC;AACN,IAAI,OAAO;AACX,QAAQ,SAAS,EAAE,GAAG;AACtB,QAAQ,KAAK;AACb,QAAQ,OAAO,EAAE,GAAG;AACpB,KAAK,CAAC;AACN,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;AAC7C,IAAI,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC;AACrD,IAAI,eAAe,CAAC,kBAAkB,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;AAC3H;AACA,IAAI,MAAM,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/E,IAAI,MAAM,cAAc,GAAG;AAC3B,QAAQ,GAAG,eAAe;AAC1B,QAAQ,KAAK,EAAE,qBAAqB;AACpC,QAAQ,SAAS,EAAE,IAAI,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;AACtD,QAAQ,SAAS,EAAE,OAAO,EAAE,SAAS;AACrC,KAAK,CAAC;AACN,IAAI,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAClD,IAAI,MAAM,GAAG,GAAG,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;AAChH,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE;AAChC,QAAQ,OAAO,GAAG,CAAC,MAAM,CAAC;AAC1B,KAAK;AACL,CAAC;AACD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ,GAAG;AAC1B,IAAI,MAAM,0BAA0B,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;AAClE,CAAC;AACD,OAAO,CAAC,QAAQ,GAAG,QAAQ;;"}
|
|
@@ -29,12 +29,13 @@ class AWSAppSyncEventProvider extends AWSWebSocketProvider {
|
|
|
29
29
|
super.publish(options, customUserAgentDetails);
|
|
30
30
|
}
|
|
31
31
|
async _prepareSubscriptionPayload({ options, subscriptionId, customUserAgentDetails, additionalCustomHeaders, libraryConfigHeaders, publish, }) {
|
|
32
|
-
const { appSyncGraphqlEndpoint, authenticationType, query, apiKey, region, } = options;
|
|
32
|
+
const { appSyncGraphqlEndpoint, authenticationType, query, apiKey, region, variables, } = options;
|
|
33
33
|
// This will be needed for WS publish
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
const data = {
|
|
35
|
+
channel: query,
|
|
36
|
+
events: [variables],
|
|
37
|
+
};
|
|
38
|
+
const serializedData = JSON.stringify(data);
|
|
38
39
|
const headers = {
|
|
39
40
|
...(await awsRealTimeHeaderBasedAuth({
|
|
40
41
|
apiKey,
|
|
@@ -53,18 +54,18 @@ class AWSAppSyncEventProvider extends AWSWebSocketProvider {
|
|
|
53
54
|
const subscriptionMessage = {
|
|
54
55
|
id: subscriptionId,
|
|
55
56
|
channel: query,
|
|
56
|
-
|
|
57
|
+
events: [JSON.stringify(variables)],
|
|
57
58
|
authorization: {
|
|
58
59
|
...headers,
|
|
59
60
|
},
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
payload: {
|
|
62
|
+
events: serializedData,
|
|
63
|
+
extensions: {
|
|
64
|
+
authorization: {
|
|
65
|
+
...headers,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
68
69
|
type: publish
|
|
69
70
|
? MESSAGE_TYPES.EVENT_PUBLISH
|
|
70
71
|
: MESSAGE_TYPES.EVENT_SUBSCRIBE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/Providers/AWSAppSyncEventsProvider/index.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { USER_AGENT_HEADER, getAmplifyUserAgent, } from '@aws-amplify/core/internals/utils';\nimport { DEFAULT_KEEP_ALIVE_TIMEOUT, MESSAGE_TYPES } from '../constants';\nimport { AWSWebSocketProvider } from '../AWSWebSocketProvider';\nimport { awsRealTimeHeaderBasedAuth } from '../AWSWebSocketProvider/authHeaders';\nconst PROVIDER_NAME = 'AWSAppSyncEventsProvider';\nconst WS_PROTOCOL_NAME = 'aws-appsync-event-ws';\nconst CONNECT_URI = ''; // events does not expect a connect uri\nexport class AWSAppSyncEventProvider extends AWSWebSocketProvider {\n constructor() {\n super({\n providerName: PROVIDER_NAME,\n wsProtocolName: WS_PROTOCOL_NAME,\n connectUri: CONNECT_URI,\n });\n }\n getProviderName() {\n return PROVIDER_NAME;\n }\n async connect(options) {\n super.connect(options);\n }\n subscribe(options, customUserAgentDetails) {\n return super.subscribe(options, customUserAgentDetails).pipe();\n }\n async publish(options, customUserAgentDetails) {\n super.publish(options, customUserAgentDetails);\n }\n async _prepareSubscriptionPayload({ options, subscriptionId, customUserAgentDetails, additionalCustomHeaders, libraryConfigHeaders, publish, }) {\n const { appSyncGraphqlEndpoint, authenticationType, query, apiKey, region, } = options;\n // This will be needed for WS publish\n
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/Providers/AWSAppSyncEventsProvider/index.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { USER_AGENT_HEADER, getAmplifyUserAgent, } from '@aws-amplify/core/internals/utils';\nimport { DEFAULT_KEEP_ALIVE_TIMEOUT, MESSAGE_TYPES } from '../constants';\nimport { AWSWebSocketProvider } from '../AWSWebSocketProvider';\nimport { awsRealTimeHeaderBasedAuth } from '../AWSWebSocketProvider/authHeaders';\nconst PROVIDER_NAME = 'AWSAppSyncEventsProvider';\nconst WS_PROTOCOL_NAME = 'aws-appsync-event-ws';\nconst CONNECT_URI = ''; // events does not expect a connect uri\nexport class AWSAppSyncEventProvider extends AWSWebSocketProvider {\n constructor() {\n super({\n providerName: PROVIDER_NAME,\n wsProtocolName: WS_PROTOCOL_NAME,\n connectUri: CONNECT_URI,\n });\n }\n getProviderName() {\n return PROVIDER_NAME;\n }\n async connect(options) {\n super.connect(options);\n }\n subscribe(options, customUserAgentDetails) {\n return super.subscribe(options, customUserAgentDetails).pipe();\n }\n async publish(options, customUserAgentDetails) {\n super.publish(options, customUserAgentDetails);\n }\n async _prepareSubscriptionPayload({ options, subscriptionId, customUserAgentDetails, additionalCustomHeaders, libraryConfigHeaders, publish, }) {\n const { appSyncGraphqlEndpoint, authenticationType, query, apiKey, region, variables, } = options;\n // This will be needed for WS publish\n const data = {\n channel: query,\n events: [variables],\n };\n const serializedData = JSON.stringify(data);\n const headers = {\n ...(await awsRealTimeHeaderBasedAuth({\n apiKey,\n appSyncGraphqlEndpoint,\n authenticationType,\n payload: serializedData,\n canonicalUri: '',\n region,\n additionalCustomHeaders,\n })),\n ...libraryConfigHeaders,\n ...additionalCustomHeaders,\n [USER_AGENT_HEADER]: getAmplifyUserAgent(customUserAgentDetails),\n };\n // Commented out code will be needed for WS publish\n const subscriptionMessage = {\n id: subscriptionId,\n channel: query,\n events: [JSON.stringify(variables)],\n authorization: {\n ...headers,\n },\n payload: {\n events: serializedData,\n extensions: {\n authorization: {\n ...headers,\n },\n },\n },\n type: publish\n ? MESSAGE_TYPES.EVENT_PUBLISH\n : MESSAGE_TYPES.EVENT_SUBSCRIBE,\n };\n const serializedSubscriptionMessage = JSON.stringify(subscriptionMessage);\n return serializedSubscriptionMessage;\n }\n _handleSubscriptionData(message) {\n this.logger.debug(`subscription message from AWS AppSync Events: ${message.data}`);\n const { id = '', event: payload, type, } = JSON.parse(String(message.data));\n const { observer = null, query = '', variables = {}, } = this.subscriptionObserverMap.get(id) || {};\n this.logger.debug({ id, observer, query, variables });\n if (type === MESSAGE_TYPES.DATA && payload) {\n const deserializedEvent = JSON.parse(payload);\n if (observer) {\n observer.next({ id, type, event: deserializedEvent });\n }\n else {\n this.logger.debug(`observer not found for id: ${id}`);\n }\n return [true, { id, type, payload: deserializedEvent }];\n }\n return [false, { id, type, payload }];\n }\n _unsubscribeMessage(subscriptionId) {\n return {\n id: subscriptionId,\n type: MESSAGE_TYPES.EVENT_STOP,\n };\n }\n _extractConnectionTimeout(data) {\n const { connectionTimeoutMs = DEFAULT_KEEP_ALIVE_TIMEOUT } = data;\n return connectionTimeoutMs;\n }\n _extractErrorCodeAndType(data) {\n const { errors: [{ errorType = '', errorCode = 0 } = {}] = [] } = data;\n return { errorCode, errorType };\n }\n}\nexport const AppSyncEventProvider = new AWSAppSyncEventProvider();\n"],"names":[],"mappings":"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"}
|
|
@@ -23,8 +23,9 @@ export declare abstract class AWSWebSocketProvider {
|
|
|
23
23
|
protected subscriptionObserverMap: Map<string, ObserverQuery>;
|
|
24
24
|
protected awsRealTimeSocket?: WebSocket;
|
|
25
25
|
private socketStatus;
|
|
26
|
-
private
|
|
27
|
-
private
|
|
26
|
+
private keepAliveTimeoutId?;
|
|
27
|
+
private keepAliveTimeout;
|
|
28
|
+
private keepAliveAlertTimeoutId?;
|
|
28
29
|
private promiseArray;
|
|
29
30
|
private connectionState;
|
|
30
31
|
private readonly connectionStateMonitor;
|
|
@@ -75,11 +76,8 @@ export declare abstract class AWSWebSocketProvider {
|
|
|
75
76
|
errorCode: number;
|
|
76
77
|
errorType: string;
|
|
77
78
|
};
|
|
78
|
-
private maintainKeepAlive;
|
|
79
|
-
private keepAliveHeartbeat;
|
|
80
79
|
private _handleIncomingSubscriptionMessage;
|
|
81
80
|
private _errorDisconnect;
|
|
82
|
-
private _closeSocket;
|
|
83
81
|
private _timeoutStartSubscriptionAck;
|
|
84
82
|
private _initializeWebSocketConnection;
|
|
85
83
|
private _establishRetryableConnection;
|
|
@@ -3,7 +3,7 @@ import { GraphQLError } from 'graphql';
|
|
|
3
3
|
import { ConsoleLogger, Hub } from '@aws-amplify/core';
|
|
4
4
|
import { NonRetryableError, amplifyUuid, isNonRetryableError, base64Encoder, jitteredExponentialRetry, AMPLIFY_SYMBOL } from '@aws-amplify/core/internals/utils';
|
|
5
5
|
import { ConnectionState, CONTROL_MSG } from '../../types/PubSub.mjs';
|
|
6
|
-
import { SOCKET_STATUS, NON_RETRYABLE_CODES, NON_RETRYABLE_ERROR_TYPES, SUBSCRIPTION_STATUS, START_ACK_TIMEOUT,
|
|
6
|
+
import { SOCKET_STATUS, DEFAULT_KEEP_ALIVE_TIMEOUT, NON_RETRYABLE_CODES, NON_RETRYABLE_ERROR_TYPES, SUBSCRIPTION_STATUS, START_ACK_TIMEOUT, MESSAGE_TYPES, DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT, MAX_DELAY_MS, CONNECTION_INIT_TIMEOUT, CONNECTION_STATE_CHANGE } from '../constants.mjs';
|
|
7
7
|
import { ConnectionStateMonitor, CONNECTION_CHANGE } from '../../utils/ConnectionStateMonitor.mjs';
|
|
8
8
|
import { ReconnectionMonitor, ReconnectEvent } from '../../utils/ReconnectionMonitor.mjs';
|
|
9
9
|
import { additionalHeadersFromOptions, queryParamsFromCustomHeaders, realtimeUrlWithQueryString } from './appsyncUrl.mjs';
|
|
@@ -18,6 +18,7 @@ class AWSWebSocketProvider {
|
|
|
18
18
|
constructor(args) {
|
|
19
19
|
this.subscriptionObserverMap = new Map();
|
|
20
20
|
this.socketStatus = SOCKET_STATUS.CLOSED;
|
|
21
|
+
this.keepAliveTimeout = DEFAULT_KEEP_ALIVE_TIMEOUT;
|
|
21
22
|
this.promiseArray = [];
|
|
22
23
|
this.connectionStateMonitor = new ConnectionStateMonitor();
|
|
23
24
|
this.reconnectionMonitor = new ReconnectionMonitor();
|
|
@@ -69,7 +70,6 @@ class AWSWebSocketProvider {
|
|
|
69
70
|
return new Promise((resolve, reject) => {
|
|
70
71
|
if (this.awsRealTimeSocket) {
|
|
71
72
|
this.awsRealTimeSocket.onclose = (_) => {
|
|
72
|
-
this._closeSocket();
|
|
73
73
|
this.subscriptionObserverMap = new Map();
|
|
74
74
|
this.awsRealTimeSocket = undefined;
|
|
75
75
|
resolve();
|
|
@@ -110,7 +110,7 @@ class AWSWebSocketProvider {
|
|
|
110
110
|
})
|
|
111
111
|
.catch(err => {
|
|
112
112
|
this.logger.debug(`${CONTROL_MSG.REALTIME_SUBSCRIPTION_INIT_ERROR}: ${err}`);
|
|
113
|
-
this.
|
|
113
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);
|
|
114
114
|
})
|
|
115
115
|
.finally(() => {
|
|
116
116
|
subscriptionStartInProgress = false;
|
|
@@ -166,23 +166,47 @@ class AWSWebSocketProvider {
|
|
|
166
166
|
});
|
|
167
167
|
return new Promise((resolve, reject) => {
|
|
168
168
|
if (this.awsRealTimeSocket) {
|
|
169
|
+
const timeoutId = setTimeout(() => {
|
|
170
|
+
cleanup();
|
|
171
|
+
reject(new Error('Publish operation timed out'));
|
|
172
|
+
}, 30000); // 30 seconds timeout
|
|
169
173
|
const publishListener = (event) => {
|
|
170
174
|
const data = JSON.parse(event.data);
|
|
171
175
|
if (data.id === subscriptionId && data.type === 'publish_success') {
|
|
172
176
|
this.awsRealTimeSocket &&
|
|
173
177
|
this.awsRealTimeSocket.removeEventListener('message', publishListener);
|
|
178
|
+
cleanup();
|
|
174
179
|
resolve();
|
|
175
180
|
}
|
|
176
|
-
if (data.erroredEvents && data.erroredEvents.length > 0)
|
|
181
|
+
if (data.erroredEvents && data.erroredEvents.length > 0) {
|
|
182
|
+
// TODO: handle errors
|
|
183
|
+
const errors = data.erroredEvents.map((errorEvent) => errorEvent.error);
|
|
184
|
+
cleanup();
|
|
185
|
+
reject(new Error(`Publish errors: ${errors.join(', ')}`));
|
|
186
|
+
}
|
|
177
187
|
};
|
|
178
|
-
|
|
179
|
-
|
|
188
|
+
const errorListener = (error) => {
|
|
189
|
+
cleanup();
|
|
190
|
+
reject(new Error(`WebSocket error: ${error}`));
|
|
191
|
+
};
|
|
192
|
+
const closeListener = () => {
|
|
193
|
+
cleanup();
|
|
180
194
|
reject(new Error('WebSocket is closed'));
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
|
|
195
|
+
};
|
|
196
|
+
const cleanup = () => {
|
|
197
|
+
clearTimeout(timeoutId);
|
|
198
|
+
this.awsRealTimeSocket?.removeEventListener('message', publishListener);
|
|
199
|
+
this.awsRealTimeSocket?.removeEventListener('error', errorListener);
|
|
200
|
+
this.awsRealTimeSocket?.removeEventListener('close', closeListener);
|
|
201
|
+
};
|
|
202
|
+
this.awsRealTimeSocket.addEventListener('message', publishListener);
|
|
203
|
+
this.awsRealTimeSocket.addEventListener('error', errorListener);
|
|
204
|
+
this.awsRealTimeSocket.addEventListener('close', closeListener);
|
|
184
205
|
this.awsRealTimeSocket.send(serializedSubscriptionMessage);
|
|
185
206
|
}
|
|
207
|
+
else {
|
|
208
|
+
reject(new Error('WebSocket is not connected'));
|
|
209
|
+
}
|
|
186
210
|
});
|
|
187
211
|
}
|
|
188
212
|
async _cleanupSubscription(subscriptionId, reconnectSubscription) {
|
|
@@ -290,7 +314,7 @@ class AWSWebSocketProvider {
|
|
|
290
314
|
this.logger.debug({ err });
|
|
291
315
|
const message = String(err.message ?? '');
|
|
292
316
|
// Resolving to give the state observer time to propogate the update
|
|
293
|
-
this.
|
|
317
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);
|
|
294
318
|
// Capture the error only when the network didn't cause disruption
|
|
295
319
|
if (this.connectionState !== ConnectionState.ConnectionDisruptedPendingNetwork) {
|
|
296
320
|
// When the error is non-retriable, error out the observable
|
|
@@ -371,6 +395,12 @@ class AWSWebSocketProvider {
|
|
|
371
395
|
}
|
|
372
396
|
else {
|
|
373
397
|
this.logger.debug('closing WebSocket...');
|
|
398
|
+
if (this.keepAliveTimeoutId) {
|
|
399
|
+
clearTimeout(this.keepAliveTimeoutId);
|
|
400
|
+
}
|
|
401
|
+
if (this.keepAliveAlertTimeoutId) {
|
|
402
|
+
clearTimeout(this.keepAliveAlertTimeoutId);
|
|
403
|
+
}
|
|
374
404
|
const tempSocket = this.awsRealTimeSocket;
|
|
375
405
|
// Cleaning callbacks to avoid race condition, socket still exists
|
|
376
406
|
tempSocket.onclose = null;
|
|
@@ -378,26 +408,7 @@ class AWSWebSocketProvider {
|
|
|
378
408
|
tempSocket.close(1000);
|
|
379
409
|
this.awsRealTimeSocket = undefined;
|
|
380
410
|
this.socketStatus = SOCKET_STATUS.CLOSED;
|
|
381
|
-
this.
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
maintainKeepAlive() {
|
|
385
|
-
this.kaTimestamp = Date.now();
|
|
386
|
-
}
|
|
387
|
-
keepAliveHeartbeat(connectionTimeoutMs) {
|
|
388
|
-
const currentTime = Date.now();
|
|
389
|
-
// Check for missed KA message
|
|
390
|
-
if (this.kaTimestamp &&
|
|
391
|
-
currentTime - this.kaTimestamp > DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT) {
|
|
392
|
-
this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE_MISSED);
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE);
|
|
396
|
-
}
|
|
397
|
-
// Recognize we are disconnected if we haven't seen messages in the keep alive timeout period
|
|
398
|
-
if (this.kaTimestamp &&
|
|
399
|
-
currentTime - this.kaTimestamp > connectionTimeoutMs) {
|
|
400
|
-
this._errorDisconnect(CONTROL_MSG.TIMEOUT_DISCONNECT);
|
|
411
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);
|
|
401
412
|
}
|
|
402
413
|
}
|
|
403
414
|
_handleIncomingSubscriptionMessage(message) {
|
|
@@ -405,10 +416,8 @@ class AWSWebSocketProvider {
|
|
|
405
416
|
return;
|
|
406
417
|
}
|
|
407
418
|
const [isData, data] = this._handleSubscriptionData(message);
|
|
408
|
-
if (isData)
|
|
409
|
-
this.maintainKeepAlive();
|
|
419
|
+
if (isData)
|
|
410
420
|
return;
|
|
411
|
-
}
|
|
412
421
|
const { type, id, payload } = data;
|
|
413
422
|
const { observer = null, query = '', variables = {}, startAckTimeoutId, subscriptionReadyCallback, subscriptionFailedCallback, } = this.subscriptionObserverMap.get(id) || {};
|
|
414
423
|
if (type === MESSAGE_TYPES.GQL_START_ACK ||
|
|
@@ -440,7 +449,17 @@ class AWSWebSocketProvider {
|
|
|
440
449
|
return;
|
|
441
450
|
}
|
|
442
451
|
if (type === MESSAGE_TYPES.GQL_CONNECTION_KEEP_ALIVE) {
|
|
443
|
-
this.
|
|
452
|
+
if (this.keepAliveTimeoutId)
|
|
453
|
+
clearTimeout(this.keepAliveTimeoutId);
|
|
454
|
+
if (this.keepAliveAlertTimeoutId)
|
|
455
|
+
clearTimeout(this.keepAliveAlertTimeoutId);
|
|
456
|
+
this.keepAliveTimeoutId = setTimeout(() => {
|
|
457
|
+
this._errorDisconnect(CONTROL_MSG.TIMEOUT_DISCONNECT);
|
|
458
|
+
}, this.keepAliveTimeout);
|
|
459
|
+
this.keepAliveAlertTimeoutId = setTimeout(() => {
|
|
460
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE_MISSED);
|
|
461
|
+
}, DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT);
|
|
462
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE);
|
|
444
463
|
return;
|
|
445
464
|
}
|
|
446
465
|
if (type === MESSAGE_TYPES.GQL_ERROR) {
|
|
@@ -474,18 +493,11 @@ class AWSWebSocketProvider {
|
|
|
474
493
|
_errorDisconnect(msg) {
|
|
475
494
|
this.logger.debug(`Disconnect error: ${msg}`);
|
|
476
495
|
if (this.awsRealTimeSocket) {
|
|
477
|
-
this.
|
|
496
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);
|
|
478
497
|
this.awsRealTimeSocket.close();
|
|
479
498
|
}
|
|
480
499
|
this.socketStatus = SOCKET_STATUS.CLOSED;
|
|
481
500
|
}
|
|
482
|
-
_closeSocket() {
|
|
483
|
-
if (this.keepAliveHeartbeatIntervalId) {
|
|
484
|
-
clearInterval(this.keepAliveHeartbeatIntervalId);
|
|
485
|
-
this.keepAliveHeartbeatIntervalId = undefined;
|
|
486
|
-
}
|
|
487
|
-
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);
|
|
488
|
-
}
|
|
489
501
|
_timeoutStartSubscriptionAck(subscriptionId) {
|
|
490
502
|
const subscriptionObserver = this.subscriptionObserverMap.get(subscriptionId);
|
|
491
503
|
if (subscriptionObserver) {
|
|
@@ -499,7 +511,7 @@ class AWSWebSocketProvider {
|
|
|
499
511
|
variables,
|
|
500
512
|
subscriptionState: SUBSCRIPTION_STATUS.FAILED,
|
|
501
513
|
});
|
|
502
|
-
this.
|
|
514
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);
|
|
503
515
|
this.logger.debug('timeoutStartSubscription', JSON.stringify({ query, variables }));
|
|
504
516
|
}
|
|
505
517
|
}
|
|
@@ -572,7 +584,6 @@ class AWSWebSocketProvider {
|
|
|
572
584
|
this.logger.debug(`WebSocket connection error`);
|
|
573
585
|
};
|
|
574
586
|
newSocket.onclose = () => {
|
|
575
|
-
this._closeSocket();
|
|
576
587
|
reject(new Error('Connection handshake error'));
|
|
577
588
|
};
|
|
578
589
|
newSocket.onopen = () => {
|
|
@@ -596,7 +607,6 @@ class AWSWebSocketProvider {
|
|
|
596
607
|
};
|
|
597
608
|
this.awsRealTimeSocket.onclose = event => {
|
|
598
609
|
this.logger.debug(`WebSocket closed ${event.reason}`);
|
|
599
|
-
this._closeSocket();
|
|
600
610
|
reject(new Error(JSON.stringify(event)));
|
|
601
611
|
};
|
|
602
612
|
this.awsRealTimeSocket.onmessage = (message) => {
|
|
@@ -639,10 +649,7 @@ class AWSWebSocketProvider {
|
|
|
639
649
|
if (!this.awsRealTimeSocket) {
|
|
640
650
|
return;
|
|
641
651
|
}
|
|
642
|
-
|
|
643
|
-
this.keepAliveHeartbeatIntervalId = setInterval(() => {
|
|
644
|
-
this.keepAliveHeartbeat(connectionTimeoutMs);
|
|
645
|
-
}, DEFAULT_KEEP_ALIVE_HEARTBEAT_TIMEOUT);
|
|
652
|
+
this.keepAliveTimeout = connectionTimeoutMs;
|
|
646
653
|
this.awsRealTimeSocket.onmessage =
|
|
647
654
|
this._handleIncomingSubscriptionMessage.bind(this);
|
|
648
655
|
this.awsRealTimeSocket.onerror = err => {
|
|
@@ -651,7 +658,6 @@ class AWSWebSocketProvider {
|
|
|
651
658
|
};
|
|
652
659
|
this.awsRealTimeSocket.onclose = event => {
|
|
653
660
|
this.logger.debug(`WebSocket closed ${event.reason}`);
|
|
654
|
-
this._closeSocket();
|
|
655
661
|
this._errorDisconnect(CONTROL_MSG.CONNECTION_CLOSED);
|
|
656
662
|
};
|
|
657
663
|
}
|