From ea29a61ace7ba2119c7f294f5f88530ea932c6f7 Mon Sep 17 00:00:00 2001 From: Joseph Cheung Date: Mon, 10 Sep 2018 22:42:27 +0800 Subject: [PATCH 1/2] Fix resolver in subscription --- src/SchemaBuilder.ts | 16 ++++++++++++---- src/VesperFramework.ts | 6 +++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/SchemaBuilder.ts b/src/SchemaBuilder.ts index 1a4e3b0..c71d54e 100644 --- a/src/SchemaBuilder.ts +++ b/src/SchemaBuilder.ts @@ -369,6 +369,14 @@ export class SchemaBuilder { resolvers[resolve.name][resolve.methodName] = (parent: any, args: any, context: any, info: any) => { this.loggers.resolver(`model property "${resolve.name}.${resolve.methodName}"`); + let request: any = undefined; + let response: any = undefined; + + try { + request = context.container.get(CurrentRequest); + response = context.container.get(CurrentResponse); + } catch (error) { } + if (resolve.dataLoader) { if (!context.dataLoaders[resolve.name] || !context.dataLoaders[resolve.name][resolve.methodName]) { @@ -378,9 +386,9 @@ export class SchemaBuilder { context.dataLoaders[resolve.name][resolve.methodName] = new DataLoader((keys: { parent: any, args: any, context: any, info: any }[]) => { const entities = keys.map(key => key.parent); const result = this.actionExecutor.executeResolver({ + request, + response, metadata: resolve, - request: context.container.get(CurrentRequest), - response: context.container.get(CurrentResponse), container: context.container, obj: entities, args: keys[0].args, @@ -402,9 +410,9 @@ export class SchemaBuilder { } else { return this.actionExecutor.executeResolver({ + request, + response, metadata: resolve, - request: context.container.get(CurrentRequest), - response: context.container.get(CurrentResponse), container: context.container, obj: parent, args: args, diff --git a/src/VesperFramework.ts b/src/VesperFramework.ts index 7154857..74ab4a1 100644 --- a/src/VesperFramework.ts +++ b/src/VesperFramework.ts @@ -98,7 +98,11 @@ export class VesperFramework { const hasSubscriptions = getMetadataArgsStorage().actions.filter(action => action.type === "subscription"); if (hasSubscriptions) { new SubscriptionServer( - { execute, subscribe, schema }, + { + execute, subscribe, schema, onConnect: () => { + return { dataLoaders: [] } as any; + } + }, { server: this.server, path: "/subscriptions" } ); } From 24802b2f4b89e7100c3e018b37b48a75ea106e45 Mon Sep 17 00:00:00 2001 From: Joseph Cheung Date: Tue, 11 Sep 2018 12:20:13 +0800 Subject: [PATCH 2/2] Fix #40 add connectionParams to subscription context, set context dataLoaders in subscribe resolver --- src/SchemaBuilder.ts | 3 ++- src/VesperFramework.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/SchemaBuilder.ts b/src/SchemaBuilder.ts index e9bfa4f..e0c7288 100644 --- a/src/SchemaBuilder.ts +++ b/src/SchemaBuilder.ts @@ -260,8 +260,9 @@ export class SchemaBuilder { const that = this; resolvers[resolverType][action.name || action.methodName] = { subscribe: withFilter(() => this.options.subscriptionAsyncIterator(action.name || action.methodName), function (playload: any, args: any, context: any, info: any) { - const container = Container.of(this); + const container = Container.of(that); context.container = container; + context.dataLoaders = {}; const executionResult = that.actionExecutor.executeControllerAction({ metadata: action, request: undefined, diff --git a/src/VesperFramework.ts b/src/VesperFramework.ts index 0eaa7ee..20a1d7b 100644 --- a/src/VesperFramework.ts +++ b/src/VesperFramework.ts @@ -99,8 +99,8 @@ export class VesperFramework { if (hasSubscriptions) { new SubscriptionServer( { - execute: execute as any, subscribe, schema, onConnect: () => { - return { dataLoaders: [] } as any; + execute: execute as any, subscribe, schema, onConnect: (connectionParams: any) => { + return { connectionParams }; } }, { server: this.server, path: "/subscriptions" }