@aws-amplify/api-graphql 4.0.22 → 4.0.23
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/AWSAppSyncRealTimeProvider/index.js +40 -31
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -1
- package/dist/cjs/internals/APIClient.js +34 -19
- package/dist/cjs/internals/APIClient.js.map +1 -1
- package/dist/cjs/internals/InternalGraphQLAPI.js +10 -9
- package/dist/cjs/internals/InternalGraphQLAPI.js.map +1 -1
- package/dist/cjs/internals/generateClient.js +4 -1
- package/dist/cjs/internals/generateClient.js.map +1 -1
- package/dist/cjs/internals/generateCustomOperationsProperty.js +6 -1
- package/dist/cjs/internals/generateCustomOperationsProperty.js.map +1 -1
- package/dist/cjs/internals/operations/custom.js +90 -7
- package/dist/cjs/internals/operations/custom.js.map +1 -1
- package/dist/cjs/internals/operations/list.js +1 -1
- package/dist/cjs/internals/operations/list.js.map +1 -1
- package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js +1 -1
- package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js.map +1 -1
- package/dist/cjs/internals/server/generateModelsProperty.js +1 -1
- package/dist/cjs/internals/server/generateModelsProperty.js.map +1 -1
- package/dist/cjs/internals/v6.js +0 -2
- package/dist/cjs/internals/v6.js.map +1 -1
- package/dist/cjs/utils/errors/repackageAuthError.js +1 -1
- package/dist/cjs/utils/errors/repackageAuthError.js.map +1 -1
- package/dist/cjs/utils/resolveOwnerFields.js +3 -0
- package/dist/cjs/utils/resolveOwnerFields.js.map +1 -1
- package/dist/esm/GraphQLAPI.d.ts +2 -2
- package/dist/esm/GraphQLAPI.mjs.map +1 -1
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +8 -8
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +40 -31
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -1
- package/dist/esm/internals/APIClient.d.ts +5 -6
- package/dist/esm/internals/APIClient.mjs +34 -19
- package/dist/esm/internals/APIClient.mjs.map +1 -1
- package/dist/esm/internals/InternalGraphQLAPI.d.ts +1 -1
- package/dist/esm/internals/InternalGraphQLAPI.mjs +10 -9
- package/dist/esm/internals/InternalGraphQLAPI.mjs.map +1 -1
- package/dist/esm/internals/generateClient.mjs +5 -2
- package/dist/esm/internals/generateClient.mjs.map +1 -1
- package/dist/esm/internals/generateCustomOperationsProperty.d.ts +4 -3
- package/dist/esm/internals/generateCustomOperationsProperty.mjs +5 -1
- package/dist/esm/internals/generateCustomOperationsProperty.mjs.map +1 -1
- package/dist/esm/internals/operations/custom.d.ts +6 -3
- package/dist/esm/internals/operations/custom.mjs +90 -7
- package/dist/esm/internals/operations/custom.mjs.map +1 -1
- package/dist/esm/internals/operations/get.d.ts +1 -1
- package/dist/esm/internals/operations/get.mjs.map +1 -1
- package/dist/esm/internals/operations/indexQuery.d.ts +3 -3
- package/dist/esm/internals/operations/indexQuery.mjs.map +1 -1
- package/dist/esm/internals/operations/list.d.ts +1 -1
- package/dist/esm/internals/operations/list.mjs +1 -1
- package/dist/esm/internals/operations/list.mjs.map +1 -1
- package/dist/esm/internals/operations/subscription.d.ts +1 -1
- package/dist/esm/internals/operations/subscription.mjs.map +1 -1
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.d.ts +1 -1
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs +1 -1
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs.map +1 -1
- package/dist/esm/internals/server/generateModelsProperty.d.ts +3 -3
- package/dist/esm/internals/server/generateModelsProperty.mjs +1 -1
- package/dist/esm/internals/server/generateModelsProperty.mjs.map +1 -1
- package/dist/esm/internals/types.d.ts +2 -2
- package/dist/esm/internals/utils/clientProperties/generateModelsProperty.d.ts +2 -2
- package/dist/esm/internals/v6.d.ts +1 -1
- package/dist/esm/internals/v6.mjs +0 -2
- package/dist/esm/internals/v6.mjs.map +1 -1
- package/dist/esm/types/index.d.ts +34 -35
- package/dist/esm/utils/ConnectionStateMonitor.d.ts +2 -2
- package/dist/esm/utils/ConnectionStateMonitor.mjs.map +1 -1
- package/dist/esm/utils/ReachabilityMonitor/index.native.mjs.map +1 -1
- package/dist/esm/utils/errors/repackageAuthError.d.ts +2 -2
- package/dist/esm/utils/errors/repackageAuthError.mjs +1 -1
- package/dist/esm/utils/errors/repackageAuthError.mjs.map +1 -1
- package/dist/esm/utils/findIndexByFields.d.ts +1 -1
- package/dist/esm/utils/resolveOwnerFields.mjs +3 -0
- package/dist/esm/utils/resolveOwnerFields.mjs.map +1 -1
- package/package.json +8 -7
- package/src/GraphQLAPI.ts +4 -3
- package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +84 -64
- package/src/internals/APIClient.ts +83 -58
- package/src/internals/InternalGraphQLAPI.ts +26 -30
- package/src/internals/clientUtils.ts +1 -1
- package/src/internals/generateClient.ts +23 -10
- package/src/internals/generateCustomOperationsProperty.ts +31 -8
- package/src/internals/operations/custom.ts +159 -32
- package/src/internals/operations/get.ts +9 -8
- package/src/internals/operations/indexQuery.ts +12 -11
- package/src/internals/operations/list.ts +11 -15
- package/src/internals/operations/observeQuery.ts +3 -1
- package/src/internals/operations/subscription.ts +12 -10
- package/src/internals/server/generateClientWithAmplifyInstance.ts +7 -7
- package/src/internals/server/generateModelsProperty.ts +12 -6
- package/src/internals/types.ts +2 -2
- package/src/internals/utils/clientProperties/generateEnumsProperty.ts +7 -6
- package/src/internals/utils/clientProperties/generateModelsProperty.ts +8 -7
- package/src/internals/v6.ts +6 -4
- package/src/server/generateClient.ts +4 -1
- package/src/types/PubSub.ts +1 -0
- package/src/types/index.ts +51 -47
- package/src/utils/ConnectionStateMonitor.ts +8 -3
- package/src/utils/ReachabilityMonitor/index.native.ts +1 -1
- package/src/utils/ReachabilityMonitor/index.ts +1 -0
- package/src/utils/ReconnectionMonitor.ts +1 -0
- package/src/utils/errors/repackageAuthError.ts +6 -7
- package/src/utils/findIndexByFields.ts +1 -1
- package/src/utils/resolveConfig.ts +1 -0
- package/src/utils/resolveLibraryOptions.ts +1 -0
- package/src/utils/resolveOwnerFields.ts +16 -7
- package/src/utils/resolvePKFields.ts +1 -0
|
@@ -3,25 +3,26 @@
|
|
|
3
3
|
import { Observable, SubscriptionLike } from 'rxjs';
|
|
4
4
|
import { GraphQLError } from 'graphql';
|
|
5
5
|
import {
|
|
6
|
-
Hub,
|
|
7
|
-
fetchAuthSession,
|
|
8
6
|
ConsoleLogger,
|
|
7
|
+
Hub,
|
|
9
8
|
HubPayload,
|
|
9
|
+
fetchAuthSession,
|
|
10
10
|
} from '@aws-amplify/core';
|
|
11
11
|
import { signRequest } from '@aws-amplify/core/internals/aws-client-utils';
|
|
12
12
|
import {
|
|
13
|
-
|
|
14
|
-
GraphQLAuthMode,
|
|
13
|
+
AmplifyUrl,
|
|
15
14
|
CustomUserAgentDetails,
|
|
15
|
+
DocumentType,
|
|
16
|
+
GraphQLAuthMode,
|
|
16
17
|
NonRetryableError,
|
|
17
18
|
USER_AGENT_HEADER,
|
|
19
|
+
amplifyUuid,
|
|
20
|
+
base64Encoder,
|
|
18
21
|
getAmplifyUserAgent,
|
|
19
22
|
isNonRetryableError,
|
|
20
23
|
jitteredExponentialRetry,
|
|
21
|
-
DocumentType,
|
|
22
|
-
amplifyUuid,
|
|
23
|
-
AmplifyUrl,
|
|
24
24
|
} from '@aws-amplify/core/internals/utils';
|
|
25
|
+
import { CustomHeaders, RequestOptions } from '@aws-amplify/data-schema-types';
|
|
25
26
|
|
|
26
27
|
import {
|
|
27
28
|
CONTROL_MSG,
|
|
@@ -32,25 +33,24 @@ import {
|
|
|
32
33
|
AMPLIFY_SYMBOL,
|
|
33
34
|
AWS_APPSYNC_REALTIME_HEADERS,
|
|
34
35
|
CONNECTION_INIT_TIMEOUT,
|
|
35
|
-
|
|
36
|
+
CONNECTION_STATE_CHANGE,
|
|
36
37
|
DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT,
|
|
38
|
+
DEFAULT_KEEP_ALIVE_TIMEOUT,
|
|
37
39
|
MAX_DELAY_MS,
|
|
38
40
|
MESSAGE_TYPES,
|
|
39
41
|
NON_RETRYABLE_CODES,
|
|
40
42
|
SOCKET_STATUS,
|
|
41
43
|
START_ACK_TIMEOUT,
|
|
42
44
|
SUBSCRIPTION_STATUS,
|
|
43
|
-
CONNECTION_STATE_CHANGE,
|
|
44
45
|
} from '../constants';
|
|
45
46
|
import {
|
|
46
|
-
ConnectionStateMonitor,
|
|
47
47
|
CONNECTION_CHANGE,
|
|
48
|
+
ConnectionStateMonitor,
|
|
48
49
|
} from '../../utils/ConnectionStateMonitor';
|
|
49
50
|
import {
|
|
50
51
|
ReconnectEvent,
|
|
51
52
|
ReconnectionMonitor,
|
|
52
53
|
} from '../../utils/ReconnectionMonitor';
|
|
53
|
-
import { CustomHeaders, RequestOptions } from '@aws-amplify/data-schema-types';
|
|
54
54
|
|
|
55
55
|
const logger = new ConsoleLogger('AWSAppSyncRealTimeProvider');
|
|
56
56
|
|
|
@@ -58,38 +58,38 @@ const dispatchApiEvent = (payload: HubPayload) => {
|
|
|
58
58
|
Hub.dispatch('api', payload, 'PubSub', AMPLIFY_SYMBOL);
|
|
59
59
|
};
|
|
60
60
|
|
|
61
|
-
export
|
|
61
|
+
export interface ObserverQuery {
|
|
62
62
|
observer: PubSubContentObserver;
|
|
63
63
|
query: string;
|
|
64
64
|
variables: Record<string, DocumentType>;
|
|
65
65
|
subscriptionState: SUBSCRIPTION_STATUS;
|
|
66
|
-
subscriptionReadyCallback
|
|
67
|
-
subscriptionFailedCallback?:
|
|
66
|
+
subscriptionReadyCallback?(): void;
|
|
67
|
+
subscriptionFailedCallback?(reason?: any): void;
|
|
68
68
|
startAckTimeoutId?: ReturnType<typeof setTimeout>;
|
|
69
|
-
}
|
|
69
|
+
}
|
|
70
70
|
|
|
71
71
|
const standardDomainPattern =
|
|
72
|
-
/^https:\/\/\w{26}\.appsync
|
|
72
|
+
/^https:\/\/\w{26}\.appsync-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/graphql$/i;
|
|
73
73
|
|
|
74
74
|
const customDomainPath = '/realtime';
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
interface DataObject extends Record<string, unknown> {
|
|
77
77
|
data: Record<string, unknown>;
|
|
78
|
-
}
|
|
78
|
+
}
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
interface DataPayload {
|
|
81
81
|
id: string;
|
|
82
82
|
payload: DataObject;
|
|
83
83
|
type: string;
|
|
84
|
-
}
|
|
84
|
+
}
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
interface ParsedMessagePayload {
|
|
87
87
|
type: string;
|
|
88
88
|
payload: {
|
|
89
89
|
connectionTimeoutMs: number;
|
|
90
90
|
errors?: [{ errorType: string; errorCode: number }];
|
|
91
91
|
};
|
|
92
|
-
}
|
|
92
|
+
}
|
|
93
93
|
|
|
94
94
|
export interface AWSAppSyncRealTimeProviderOptions {
|
|
95
95
|
appSyncGraphqlEndpoint?: string;
|
|
@@ -98,7 +98,7 @@ export interface AWSAppSyncRealTimeProviderOptions {
|
|
|
98
98
|
variables?: Record<string, DocumentType>;
|
|
99
99
|
apiKey?: string;
|
|
100
100
|
region?: string;
|
|
101
|
-
libraryConfigHeaders
|
|
101
|
+
libraryConfigHeaders?(): Promise<Record<string, unknown> | Headers>;
|
|
102
102
|
additionalHeaders?: CustomHeaders;
|
|
103
103
|
additionalCustomHeaders?: Record<string, string>;
|
|
104
104
|
authToken?: string;
|
|
@@ -117,14 +117,14 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
117
117
|
private keepAliveTimeoutId?: ReturnType<typeof setTimeout>;
|
|
118
118
|
private keepAliveTimeout = DEFAULT_KEEP_ALIVE_TIMEOUT;
|
|
119
119
|
private keepAliveAlertTimeoutId?: ReturnType<typeof setTimeout>;
|
|
120
|
-
private subscriptionObserverMap
|
|
121
|
-
private promiseArray:
|
|
120
|
+
private subscriptionObserverMap = new Map<string, ObserverQuery>();
|
|
121
|
+
private promiseArray: { res(): void; rej(reason?: any): void }[] = [];
|
|
122
122
|
private connectionState: ConnectionState | undefined;
|
|
123
123
|
private readonly connectionStateMonitor = new ConnectionStateMonitor();
|
|
124
124
|
private readonly reconnectionMonitor = new ReconnectionMonitor();
|
|
125
125
|
private connectionStateMonitorSubscription: SubscriptionLike;
|
|
126
126
|
|
|
127
|
-
constructor(
|
|
127
|
+
constructor() {
|
|
128
128
|
// Monitor the connection state and pass changes along to Hub
|
|
129
129
|
this.connectionStateMonitorSubscription =
|
|
130
130
|
this.connectionStateMonitor.connectionStateObservable.subscribe(
|
|
@@ -253,12 +253,12 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
253
253
|
}
|
|
254
254
|
};
|
|
255
255
|
|
|
256
|
-
let reconnectSubscription: SubscriptionLike;
|
|
257
|
-
|
|
258
256
|
// Add an observable to the reconnection list to manage reconnection for this subscription
|
|
259
|
-
reconnectSubscription = new Observable(
|
|
260
|
-
|
|
261
|
-
|
|
257
|
+
const reconnectSubscription = new Observable(
|
|
258
|
+
reconnectSubscriptionObserver => {
|
|
259
|
+
this.reconnectionMonitor.addObserver(reconnectSubscriptionObserver);
|
|
260
|
+
},
|
|
261
|
+
).subscribe(() => {
|
|
262
262
|
startSubscription();
|
|
263
263
|
});
|
|
264
264
|
|
|
@@ -397,6 +397,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
397
397
|
});
|
|
398
398
|
} catch (err: any) {
|
|
399
399
|
this._logStartSubscriptionError(subscriptionId, observer, err);
|
|
400
|
+
|
|
400
401
|
return;
|
|
401
402
|
}
|
|
402
403
|
|
|
@@ -416,7 +417,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
416
417
|
subscriptionReadyCallback,
|
|
417
418
|
subscriptionFailedCallback,
|
|
418
419
|
startAckTimeoutId: setTimeout(() => {
|
|
419
|
-
this._timeoutStartSubscriptionAck
|
|
420
|
+
this._timeoutStartSubscriptionAck(subscriptionId);
|
|
420
421
|
}, START_ACK_TIMEOUT),
|
|
421
422
|
});
|
|
422
423
|
if (this.awsRealTimeSocket) {
|
|
@@ -433,9 +434,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
433
434
|
logger.debug({ err });
|
|
434
435
|
const message = String(err.message ?? '');
|
|
435
436
|
// Resolving to give the state observer time to propogate the update
|
|
436
|
-
|
|
437
|
-
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED),
|
|
438
|
-
);
|
|
437
|
+
this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);
|
|
439
438
|
|
|
440
439
|
// Capture the error only when the network didn't cause disruption
|
|
441
440
|
if (
|
|
@@ -474,16 +473,20 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
474
473
|
const { subscriptionState } = subscriptionObserver;
|
|
475
474
|
// This in case unsubscribe is invoked before sending start subscription message
|
|
476
475
|
if (subscriptionState === SUBSCRIPTION_STATUS.PENDING) {
|
|
477
|
-
return new Promise((
|
|
478
|
-
const {
|
|
479
|
-
|
|
476
|
+
return new Promise<void>((resolve, reject) => {
|
|
477
|
+
const {
|
|
478
|
+
observer,
|
|
479
|
+
subscriptionState: observedSubscriptionState,
|
|
480
|
+
variables,
|
|
481
|
+
query,
|
|
482
|
+
} = subscriptionObserver;
|
|
480
483
|
this.subscriptionObserverMap.set(subscriptionId, {
|
|
481
484
|
observer,
|
|
482
|
-
subscriptionState,
|
|
485
|
+
subscriptionState: observedSubscriptionState,
|
|
483
486
|
variables,
|
|
484
487
|
query,
|
|
485
|
-
subscriptionReadyCallback:
|
|
486
|
-
subscriptionFailedCallback:
|
|
488
|
+
subscriptionReadyCallback: resolve,
|
|
489
|
+
subscriptionFailedCallback: reject,
|
|
487
490
|
});
|
|
488
491
|
});
|
|
489
492
|
}
|
|
@@ -526,6 +529,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
526
529
|
|
|
527
530
|
if (!this.awsRealTimeSocket) {
|
|
528
531
|
this.socketStatus = SOCKET_STATUS.CLOSED;
|
|
532
|
+
|
|
529
533
|
return;
|
|
530
534
|
}
|
|
531
535
|
|
|
@@ -582,6 +586,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
582
586
|
} else {
|
|
583
587
|
logger.debug(`observer not found for id: ${id}`);
|
|
584
588
|
}
|
|
589
|
+
|
|
585
590
|
return;
|
|
586
591
|
}
|
|
587
592
|
|
|
@@ -621,14 +626,14 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
621
626
|
if (this.keepAliveTimeoutId) clearTimeout(this.keepAliveTimeoutId);
|
|
622
627
|
if (this.keepAliveAlertTimeoutId)
|
|
623
628
|
clearTimeout(this.keepAliveAlertTimeoutId);
|
|
624
|
-
this.keepAliveTimeoutId = setTimeout(
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
);
|
|
629
|
+
this.keepAliveTimeoutId = setTimeout(() => {
|
|
630
|
+
this._errorDisconnect(CONTROL_MSG.TIMEOUT_DISCONNECT);
|
|
631
|
+
}, this.keepAliveTimeout);
|
|
628
632
|
this.keepAliveAlertTimeoutId = setTimeout(() => {
|
|
629
633
|
this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE_MISSED);
|
|
630
634
|
}, DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT);
|
|
631
635
|
this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE);
|
|
636
|
+
|
|
632
637
|
return;
|
|
633
638
|
}
|
|
634
639
|
|
|
@@ -712,8 +717,11 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
712
717
|
if (this.socketStatus === SOCKET_STATUS.READY) {
|
|
713
718
|
return;
|
|
714
719
|
}
|
|
715
|
-
|
|
716
|
-
|
|
720
|
+
|
|
721
|
+
// TODO(Eslint): refactor to now use async function as the promise executor
|
|
722
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
723
|
+
return new Promise<void>(async (resolve, reject) => {
|
|
724
|
+
this.promiseArray.push({ res: resolve, rej: reject });
|
|
717
725
|
|
|
718
726
|
if (this.socketStatus === SOCKET_STATUS.CLOSED) {
|
|
719
727
|
try {
|
|
@@ -765,7 +773,9 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
765
773
|
this.promiseArray = [];
|
|
766
774
|
} catch (err) {
|
|
767
775
|
logger.debug('Connection exited with', err);
|
|
768
|
-
this.promiseArray.forEach(({ rej }) =>
|
|
776
|
+
this.promiseArray.forEach(({ rej }) => {
|
|
777
|
+
rej(err);
|
|
778
|
+
});
|
|
769
779
|
this.promiseArray = [];
|
|
770
780
|
if (
|
|
771
781
|
this.awsRealTimeSocket &&
|
|
@@ -795,23 +805,24 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
795
805
|
// Step 1: connect websocket
|
|
796
806
|
try {
|
|
797
807
|
await (() => {
|
|
798
|
-
return new Promise<void>((
|
|
808
|
+
return new Promise<void>((resolve, reject) => {
|
|
799
809
|
const newSocket = this.getNewWebSocket(awsRealTimeUrl, 'graphql-ws');
|
|
800
810
|
newSocket.onerror = () => {
|
|
801
811
|
logger.debug(`WebSocket connection error`);
|
|
802
812
|
};
|
|
803
813
|
newSocket.onclose = () => {
|
|
804
|
-
|
|
814
|
+
reject(new Error('Connection handshake error'));
|
|
805
815
|
};
|
|
806
816
|
newSocket.onopen = () => {
|
|
807
817
|
this.awsRealTimeSocket = newSocket;
|
|
808
|
-
|
|
818
|
+
|
|
819
|
+
resolve();
|
|
809
820
|
};
|
|
810
821
|
});
|
|
811
822
|
})();
|
|
812
823
|
// Step 2: wait for ack from AWS AppSyncReaTime after sending init
|
|
813
824
|
await (() => {
|
|
814
|
-
return new Promise((
|
|
825
|
+
return new Promise((resolve, reject) => {
|
|
815
826
|
if (this.awsRealTimeSocket) {
|
|
816
827
|
let ackOk = false;
|
|
817
828
|
this.awsRealTimeSocket.onerror = error => {
|
|
@@ -819,7 +830,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
819
830
|
};
|
|
820
831
|
this.awsRealTimeSocket.onclose = event => {
|
|
821
832
|
logger.debug(`WebSocket closed ${event.reason}`);
|
|
822
|
-
|
|
833
|
+
reject(new Error(JSON.stringify(event)));
|
|
823
834
|
};
|
|
824
835
|
|
|
825
836
|
this.awsRealTimeSocket.onmessage = (message: MessageEvent) => {
|
|
@@ -851,7 +862,8 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
851
862
|
this._errorDisconnect(CONTROL_MSG.CONNECTION_CLOSED);
|
|
852
863
|
};
|
|
853
864
|
}
|
|
854
|
-
|
|
865
|
+
resolve('Cool, connected to AWS AppSyncRealTime');
|
|
866
|
+
|
|
855
867
|
return;
|
|
856
868
|
}
|
|
857
869
|
|
|
@@ -862,7 +874,9 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
862
874
|
} = {},
|
|
863
875
|
} = data;
|
|
864
876
|
|
|
865
|
-
|
|
877
|
+
// TODO(Eslint): refactor to reject an Error object instead of a plain object
|
|
878
|
+
// eslint-disable-next-line prefer-promise-reject-errors
|
|
879
|
+
reject({ errorType, errorCode });
|
|
866
880
|
}
|
|
867
881
|
};
|
|
868
882
|
|
|
@@ -871,12 +885,12 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
871
885
|
};
|
|
872
886
|
this.awsRealTimeSocket.send(JSON.stringify(gqlInit));
|
|
873
887
|
|
|
874
|
-
const checkAckOk = (
|
|
875
|
-
if (!
|
|
888
|
+
const checkAckOk = (targetAckOk: boolean) => {
|
|
889
|
+
if (!targetAckOk) {
|
|
876
890
|
this.connectionStateMonitor.record(
|
|
877
891
|
CONNECTION_CHANGE.CONNECTION_FAILED,
|
|
878
892
|
);
|
|
879
|
-
|
|
893
|
+
reject(
|
|
880
894
|
new Error(
|
|
881
895
|
`Connection timeout: ack from AWSAppSyncRealTime was not received after ${CONNECTION_INIT_TIMEOUT} ms`,
|
|
882
896
|
),
|
|
@@ -884,7 +898,9 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
884
898
|
}
|
|
885
899
|
};
|
|
886
900
|
|
|
887
|
-
setTimeout(() =>
|
|
901
|
+
setTimeout(() => {
|
|
902
|
+
checkAckOk(ackOk);
|
|
903
|
+
}, CONNECTION_INIT_TIMEOUT);
|
|
888
904
|
}
|
|
889
905
|
});
|
|
890
906
|
})();
|
|
@@ -916,7 +932,9 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
916
932
|
Record<string, unknown> | undefined
|
|
917
933
|
> {
|
|
918
934
|
const headerHandler: {
|
|
919
|
-
[key in GraphQLAuthMode]: (
|
|
935
|
+
[key in GraphQLAuthMode]: (
|
|
936
|
+
arg0: AWSAppSyncRealTimeAuthInput,
|
|
937
|
+
) => Promise<Record<string, unknown>> | Record<string, unknown>;
|
|
920
938
|
} = {
|
|
921
939
|
apiKey: this._awsRealTimeApiKeyHeader.bind(this),
|
|
922
940
|
iam: this._awsRealTimeIAMHeader.bind(this),
|
|
@@ -928,6 +946,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
928
946
|
|
|
929
947
|
if (!authenticationType || !headerHandler[authenticationType]) {
|
|
930
948
|
logger.debug(`Authentication type ${authenticationType} not supported`);
|
|
949
|
+
|
|
931
950
|
return undefined;
|
|
932
951
|
} else {
|
|
933
952
|
const handler = headerHandler[authenticationType];
|
|
@@ -969,7 +988,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
969
988
|
host,
|
|
970
989
|
}: AWSAppSyncRealTimeAuthInput) {
|
|
971
990
|
const dt = new Date();
|
|
972
|
-
const dtStr = dt.toISOString().replace(/[
|
|
991
|
+
const dtStr = dt.toISOString().replace(/[:-]|\.\d{3}/g, '');
|
|
973
992
|
|
|
974
993
|
return {
|
|
975
994
|
host,
|
|
@@ -998,7 +1017,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
998
1017
|
headers: { ...AWS_APPSYNC_REALTIME_HEADERS },
|
|
999
1018
|
};
|
|
1000
1019
|
|
|
1001
|
-
const
|
|
1020
|
+
const signedParams = signRequest(
|
|
1002
1021
|
{
|
|
1003
1022
|
headers: request.headers,
|
|
1004
1023
|
method: request.method,
|
|
@@ -1012,7 +1031,8 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
1012
1031
|
signingService: endpointInfo.service,
|
|
1013
1032
|
},
|
|
1014
1033
|
);
|
|
1015
|
-
|
|
1034
|
+
|
|
1035
|
+
return signedParams.headers;
|
|
1016
1036
|
}
|
|
1017
1037
|
|
|
1018
1038
|
private _customAuthHeader({
|
|
@@ -1024,7 +1044,7 @@ export class AWSAppSyncRealTimeProvider {
|
|
|
1024
1044
|
* the headers that are returned by that function will already have been
|
|
1025
1045
|
* provided before this function is called.
|
|
1026
1046
|
*/
|
|
1027
|
-
if (!additionalCustomHeaders?.
|
|
1047
|
+
if (!additionalCustomHeaders?.Authorization) {
|
|
1028
1048
|
throw new Error('No auth token specified');
|
|
1029
1049
|
}
|
|
1030
1050
|
|