Skip to content

Commit 113f0d7

Browse files
authored
Merge pull request #232 from cdmbase/refactor/graphql-ws
Refactor/graphql ws
2 parents 8b7b41c + da29d21 commit 113f0d7

10 files changed

Lines changed: 2930 additions & 1451 deletions

File tree

package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,16 +144,16 @@
144144
"@babel/preset-typescript": "^7.7.7",
145145
"@babel/register": "^7.7.7",
146146
"@babel/runtime": "^7.7.7",
147-
"@graphql-codegen/add": "^2.0.2",
148-
"@graphql-codegen/cli": "^1.21.8",
149-
"@graphql-codegen/fragment-matcher": "^2.0.1",
150-
"@graphql-codegen/import-types-preset": "^1.18.6",
151-
"@graphql-codegen/near-operation-file-preset": "^1.18.6",
152-
"@graphql-codegen/typescript": "^1.23.0",
153-
"@graphql-codegen/typescript-graphql-files-modules": "^1.18.1",
154-
"@graphql-codegen/typescript-operations": "^1.18.4",
155-
"@graphql-codegen/typescript-react-apollo": "^2.3.1",
156-
"@graphql-codegen/typescript-resolvers": "^1.20.0",
147+
"@graphql-codegen/add": "^3.1.1",
148+
"@graphql-codegen/cli": "^2.6.1",
149+
"@graphql-codegen/fragment-matcher": "^3.2.1",
150+
"@graphql-codegen/import-types-preset": "^2.1.10",
151+
"@graphql-codegen/near-operation-file-preset": "^2.2.4",
152+
"@graphql-codegen/typescript": "^2.4.3",
153+
"@graphql-codegen/typescript-graphql-files-modules": "^2.1.1",
154+
"@graphql-codegen/typescript-operations": "^2.3.0",
155+
"@graphql-codegen/typescript-react-apollo": "^3.2.5",
156+
"@graphql-codegen/typescript-resolvers": "^2.5.0",
157157
"@hot-loader/react-dom": "^17.0.0",
158158
"@larix/zen": "0.1.37",
159159
"@open-wc/building-rollup": "^1.10.0",

packages-modules/counter/browser/src/apollo-server-n-client/generated-model.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as Apollo from '@apollo/client';
66
import * as React from 'react';
77
import * as ApolloReactComponents from '@apollo/client/react/components';
88
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
9-
const defaultOptions = {}
9+
const defaultOptions = {} as const;
1010

1111
export const AddCounterStateDocument = gql`
1212
mutation addCounterState($amount: Int!) {

packages-modules/counter/browser/src/generated-models.ts

Lines changed: 43 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import { GraphQLResolveInfo } from 'graphql';
33
import { gql } from '@apollo/client';
44
import * as Apollo from '@apollo/client';
55
export type Maybe<T> = T | null;
6+
export type InputMaybe<T> = Maybe<T>;
67
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
78
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
89
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
9-
export type RequireFields<T, K extends keyof T> = { [X in Exclude<keyof T, K>]?: T[X] } & { [P in K]-?: NonNullable<T[P]> };
10-
const defaultOptions = {}
10+
export type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };
11+
const defaultOptions = {} as const;
1112
/** All built-in and custom scalars, mapped to their actual values */
1213
export type Scalars = {
1314
ID: string;
@@ -17,9 +18,15 @@ export type Scalars = {
1718
Float: number;
1819
};
1920

20-
export type ClientCounter = {
21-
__typename?: 'ClientCounter';
22-
counter?: Maybe<Scalars['Int']>;
21+
export type Query = {
22+
__typename?: 'Query';
23+
/** Counter */
24+
counter?: Maybe<Counter>;
25+
/** Counter from Datasource */
26+
counterCache?: Maybe<Counter>;
27+
counterState?: Maybe<ClientCounter>;
28+
/** Moleculer Counter */
29+
moleculerCounter?: Maybe<Counter>;
2330
};
2431

2532
/** Database counter */
@@ -29,6 +36,11 @@ export type Counter = {
2936
amount: Scalars['Int'];
3037
};
3138

39+
export type ClientCounter = {
40+
__typename?: 'ClientCounter';
41+
counter?: Maybe<Scalars['Int']>;
42+
};
43+
3244
export type Mutation = {
3345
__typename?: 'Mutation';
3446
/** Increase counter value returns current counter amount */
@@ -42,7 +54,7 @@ export type Mutation = {
4254

4355

4456
export type MutationAddCounterArgs = {
45-
amount?: Maybe<Scalars['Int']>;
57+
amount?: InputMaybe<Scalars['Int']>;
4658
};
4759

4860

@@ -52,18 +64,7 @@ export type MutationAddCounterStateArgs = {
5264

5365

5466
export type MutationAddMoleculerCounterArgs = {
55-
amount?: Maybe<Scalars['Int']>;
56-
};
57-
58-
export type Query = {
59-
__typename?: 'Query';
60-
/** Counter */
61-
counter?: Maybe<Counter>;
62-
/** Counter from Datasource */
63-
counterCache?: Maybe<Counter>;
64-
counterState?: Maybe<ClientCounter>;
65-
/** Moleculer Counter */
66-
moleculerCounter?: Maybe<Counter>;
67+
amount?: InputMaybe<Scalars['Int']>;
6768
};
6869

6970
export type Subscription = {
@@ -78,91 +79,46 @@ export type AddCounterStateMutationVariables = Exact<{
7879
}>;
7980

8081

81-
export type AddCounterStateMutation = (
82-
{ __typename?: 'Mutation' }
83-
& { addCounterState?: Maybe<(
84-
{ __typename?: 'ClientCounter' }
85-
& Pick<ClientCounter, 'counter'>
86-
)> }
87-
);
82+
export type AddCounterStateMutation = { __typename?: 'Mutation', addCounterState?: { __typename?: 'ClientCounter', counter?: number | null } | null };
8883

8984
export type AddCounterMutationVariables = Exact<{
9085
amount: Scalars['Int'];
9186
}>;
9287

9388

94-
export type AddCounterMutation = (
95-
{ __typename?: 'Mutation' }
96-
& { addCounter?: Maybe<(
97-
{ __typename?: 'Counter' }
98-
& Pick<Counter, 'amount'>
99-
)> }
100-
);
89+
export type AddCounterMutation = { __typename?: 'Mutation', addCounter?: { __typename?: 'Counter', amount: number } | null };
10190

10291
export type AddCounter_WsMutationVariables = Exact<{
10392
amount: Scalars['Int'];
10493
}>;
10594

10695

107-
export type AddCounter_WsMutation = (
108-
{ __typename?: 'Mutation' }
109-
& { addCounter?: Maybe<(
110-
{ __typename?: 'Counter' }
111-
& Pick<Counter, 'amount'>
112-
)> }
113-
);
96+
export type AddCounter_WsMutation = { __typename?: 'Mutation', addCounter?: { __typename?: 'Counter', amount: number } | null };
11497

11598
export type SyncCachedCounterMutationVariables = Exact<{ [key: string]: never; }>;
11699

117100

118-
export type SyncCachedCounterMutation = (
119-
{ __typename?: 'Mutation' }
120-
& Pick<Mutation, 'syncCachedCounter'>
121-
);
101+
export type SyncCachedCounterMutation = { __typename?: 'Mutation', syncCachedCounter?: boolean | null };
122102

123103
export type CounterCacheQueryQueryVariables = Exact<{ [key: string]: never; }>;
124104

125105

126-
export type CounterCacheQueryQuery = (
127-
{ __typename?: 'Query' }
128-
& { counterCache?: Maybe<(
129-
{ __typename?: 'Counter' }
130-
& Pick<Counter, 'amount'>
131-
)> }
132-
);
106+
export type CounterCacheQueryQuery = { __typename?: 'Query', counterCache?: { __typename?: 'Counter', amount: number } | null };
133107

134108
export type CounterStateQueryVariables = Exact<{ [key: string]: never; }>;
135109

136110

137-
export type CounterStateQuery = (
138-
{ __typename?: 'Query' }
139-
& { counterState?: Maybe<(
140-
{ __typename?: 'ClientCounter' }
141-
& Pick<ClientCounter, 'counter'>
142-
)> }
143-
);
111+
export type CounterStateQuery = { __typename?: 'Query', counterState?: { __typename?: 'ClientCounter', counter?: number | null } | null };
144112

145113
export type CounterQueryQueryVariables = Exact<{ [key: string]: never; }>;
146114

147115

148-
export type CounterQueryQuery = (
149-
{ __typename?: 'Query' }
150-
& { counter?: Maybe<(
151-
{ __typename?: 'Counter' }
152-
& Pick<Counter, 'amount'>
153-
)> }
154-
);
116+
export type CounterQueryQuery = { __typename?: 'Query', counter?: { __typename?: 'Counter', amount: number } | null };
155117

156118
export type OnCounterUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>;
157119

158120

159-
export type OnCounterUpdatedSubscription = (
160-
{ __typename?: 'Subscription' }
161-
& { counterUpdated?: Maybe<(
162-
{ __typename?: 'Counter' }
163-
& Pick<Counter, 'amount'>
164-
)> }
165-
);
121+
export type OnCounterUpdatedSubscription = { __typename?: 'Subscription', counterUpdated?: { __typename?: 'Counter', amount: number } | null };
166122

167123

168124

@@ -172,21 +128,7 @@ export type ResolverTypeWrapper<T> = Promise<T> | T;
172128
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
173129
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
174130
};
175-
176-
export type LegacyStitchingResolver<TResult, TParent, TContext, TArgs> = {
177-
fragment: string;
178-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
179-
};
180-
181-
export type NewStitchingResolver<TResult, TParent, TContext, TArgs> = {
182-
selectionSet: string;
183-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
184-
};
185-
export type StitchingResolver<TResult, TParent, TContext, TArgs> = LegacyStitchingResolver<TResult, TParent, TContext, TArgs> | NewStitchingResolver<TResult, TParent, TContext, TArgs>;
186-
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
187-
| ResolverFn<TResult, TParent, TContext, TArgs>
188-
| ResolverWithResolve<TResult, TParent, TContext, TArgs>
189-
| StitchingResolver<TResult, TParent, TContext, TArgs>;
131+
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;
190132

191133
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
192134
parent: TParent,
@@ -200,7 +142,7 @@ export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (
200142
args: TArgs,
201143
context: TContext,
202144
info: GraphQLResolveInfo
203-
) => AsyncIterator<TResult> | Promise<AsyncIterator<TResult>>;
145+
) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;
204146

205147
export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (
206148
parent: TParent,
@@ -269,50 +211,44 @@ export type ResolversParentTypes = {
269211
String: Scalars['String'];
270212
};
271213

272-
export type ClientCounterResolvers<ContextType = any, ParentType extends ResolversParentTypes['ClientCounter'] = ResolversParentTypes['ClientCounter']> = {
273-
counter?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
274-
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
214+
export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
215+
counter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType>;
216+
counterCache?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType>;
217+
counterState?: Resolver<Maybe<ResolversTypes['ClientCounter']>, ParentType, ContextType>;
218+
moleculerCounter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType>;
275219
};
276220

277221
export type CounterResolvers<ContextType = any, ParentType extends ResolversParentTypes['Counter'] = ResolversParentTypes['Counter']> = {
278222
amount?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
279223
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
280224
};
281225

226+
export type ClientCounterResolvers<ContextType = any, ParentType extends ResolversParentTypes['ClientCounter'] = ResolversParentTypes['ClientCounter']> = {
227+
counter?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
228+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
229+
};
230+
282231
export type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {
283-
addCounter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType, RequireFields<MutationAddCounterArgs, never>>;
232+
addCounter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType, Partial<MutationAddCounterArgs>>;
284233
addCounterState?: Resolver<Maybe<ResolversTypes['ClientCounter']>, ParentType, ContextType, RequireFields<MutationAddCounterStateArgs, 'amount'>>;
285-
addMoleculerCounter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType, RequireFields<MutationAddMoleculerCounterArgs, never>>;
234+
addMoleculerCounter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType, Partial<MutationAddMoleculerCounterArgs>>;
286235
syncCachedCounter?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
287236
};
288237

289-
export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
290-
counter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType>;
291-
counterCache?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType>;
292-
counterState?: Resolver<Maybe<ResolversTypes['ClientCounter']>, ParentType, ContextType>;
293-
moleculerCounter?: Resolver<Maybe<ResolversTypes['Counter']>, ParentType, ContextType>;
294-
};
295-
296238
export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {
297239
counterUpdated?: SubscriptionResolver<Maybe<ResolversTypes['Counter']>, "counterUpdated", ParentType, ContextType>;
298240
moleculerCounterUpdate?: SubscriptionResolver<Maybe<ResolversTypes['Counter']>, "moleculerCounterUpdate", ParentType, ContextType>;
299241
};
300242

301243
export type Resolvers<ContextType = any> = {
302-
ClientCounter?: ClientCounterResolvers<ContextType>;
244+
Query?: QueryResolvers<ContextType>;
303245
Counter?: CounterResolvers<ContextType>;
246+
ClientCounter?: ClientCounterResolvers<ContextType>;
304247
Mutation?: MutationResolvers<ContextType>;
305-
Query?: QueryResolvers<ContextType>;
306248
Subscription?: SubscriptionResolvers<ContextType>;
307249
};
308250

309251

310-
/**
311-
* @deprecated
312-
* Use "Resolvers" root object instead. If you wish to get "IResolvers", add "typesPrefix: I" to your config.
313-
*/
314-
export type IResolvers<ContextType = any> = Resolvers<ContextType>;
315-
316252

317253
export const AddCounterStateDocument = gql`
318254
mutation addCounterState($amount: Int!) {

servers/backend-server/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
"@common-stack/core": "0.1.19",
6464
"@common-stack/server-core": "0.1.19",
6565
"@common-stack/store-mongo": "0.1.19",
66-
"@graphql-tools/links": "^7.0.0",
66+
"@graphql-tools/links": "^8.2.0",
6767
"@sample-stack/core": "link:../../packages/sample-core",
6868
"@sample-stack/counter-module-server": "link:../../packages-modules/counter/server",
6969
"@sample-stack/platform-server": "link:../../packages/sample-platform/server",
@@ -87,6 +87,7 @@
8787
"esm": "^3.2.25",
8888
"express": "^4.17.1",
8989
"graphql": "^14.7.0",
90+
"graphql-ws": "^5.5.5",
9091
"graphql-bigint": "^1.0.0",
9192
"graphql-nats-subscriptions": "^1.5.0",
9293
"graphql-subscriptions": "^1.2.0",

servers/backend-server/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable jest/require-hook */
12
/* eslint-disable import/first */
23
/// <reference types="webpack-env" />
34
// eslint-disable-next-line global-require, import/first, no-unused-expressions, @typescript-eslint/no-var-requires

servers/backend-server/src/server-setup/graphql-subscription-server.ts

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,10 @@ import { Context } from 'apollo-server-core';
77
import { RedisClusterCache, RedisCache } from 'apollo-server-cache-redis';
88
import { CdmLogger } from '@cdm-logger/core';
99
import { IModuleService } from '../interfaces';
10+
import { createContextFromConnectionParams } from './utils';
1011

1112
type ILogger = CdmLogger.ILogger;
1213

13-
// @workaround as the `dataSources` not available in Subscription (websocket) Context.
14-
// https://github.com/apollographql/apollo-server/issues/1526 need to revisit in Apollo-Server v3.
15-
const constructDataSourcesForSubscriptions = (context, cache, dataSources) => {
16-
const intializeDataSource = (instance) => {
17-
instance.initialize({ context, cache });
18-
};
19-
// tslint:disable-next-line:forin
20-
for (const prop in dataSources) {
21-
// tslint:disable-next-line:no-console
22-
intializeDataSource(dataSources[prop]);
23-
}
24-
return dataSources;
25-
};
26-
2714
export class GraphqlSubscriptionServer {
2815
private subscriptionServer: SubscriptionServer;
2916

@@ -47,27 +34,14 @@ export class GraphqlSubscriptionServer {
4734
subscribe,
4835
onConnect: async (connectionParams: any, webSocket: any, ctx: ConnectionContext) => {
4936
try {
50-
this.logger.debug(`Subscription client connected using built-in SubscriptionServer.`);
51-
const pureContext = await this.moduleService.createContext(connectionParams, webSocket);
52-
const contextServices = await this.moduleService.serviceContext(connectionParams, webSocket);
53-
const context = {
54-
...contextServices,
55-
...pureContext,
56-
preferences: this.moduleService.defaultPreferences,
57-
// update: updateContainers,
58-
wsCtx: ctx,
59-
};
60-
const addons = {
61-
dataSources: constructDataSourcesForSubscriptions(
62-
context,
63-
this.cache,
64-
this.moduleService.dataSource,
65-
),
66-
};
67-
return {
68-
...context,
69-
...addons,
70-
};
37+
// @ts-ignore
38+
extra.context = await createContextFromConnectionParams(
39+
connectionParams,
40+
webSocket,
41+
this.moduleService,
42+
this.cache,
43+
this.logger,
44+
);
7145
} catch (e) {
7246
this.logger.error(e);
7347
}

0 commit comments

Comments
 (0)