@@ -53,10 +53,9 @@ func subscribe(
5353 operationName: operationName
5454 )
5555
56- return sourceFuture. map { subscriptionResult -> SubscriptionResult in
57- do {
58- let subscriptionObserver = try subscriptionResult. get ( )
59- let eventObserver = subscriptionObserver. map { eventPayload -> Future < GraphQLResult > in
56+ return sourceFuture. map { sourceResult -> SubscriptionResult in
57+ if let sourceObservable = sourceResult. observable {
58+ let subscriptionObservable = sourceObservable. map { eventPayload -> Future < GraphQLResult > in
6059
6160 // For each payload yielded from a subscription, map it over the normal
6261 // GraphQL `execute` function, with `payload` as the rootValue.
@@ -78,11 +77,9 @@ func subscribe(
7877 operationName: operationName
7978 )
8079 }
81- return SubscriptionResult . success ( eventObserver)
82- } catch let graphQLError as GraphQLError {
83- return SubscriptionResult . failure ( graphQLError)
84- } catch let error {
85- return SubscriptionResult . failure ( GraphQLError ( error) )
80+ return SubscriptionResult ( observable: subscriptionObservable)
81+ } else {
82+ return SubscriptionResult ( errors: sourceResult. errors)
8683 }
8784 }
8885}
@@ -164,9 +161,9 @@ func createSourceEventStream(
164161 result: nil
165162 )
166163
167- return eventLoopGroup. next ( ) . makeSucceededFuture ( SourceEventStreamResult . failure ( error) )
164+ return eventLoopGroup. next ( ) . makeSucceededFuture ( SourceEventStreamResult ( errors : [ error] ) )
168165 } catch {
169- return eventLoopGroup. next ( ) . makeSucceededFuture ( SourceEventStreamResult . failure ( GraphQLError ( error) ) )
166+ return eventLoopGroup. next ( ) . makeSucceededFuture ( SourceEventStreamResult ( errors : [ GraphQLError ( error) ] ) )
170167 }
171168}
172169
@@ -192,7 +189,7 @@ func executeSubscription(
192189 let fieldNode = fieldNodes. first!
193190
194191 guard let fieldDef = getFieldDef ( schema: context. schema, parentType: type, fieldAST: fieldNode) else {
195- throw GraphQLError . init (
192+ throw GraphQLError (
196193 message: " `The subscription field ' \( fieldNode. name. value) ' is not defined.` " ,
197194 nodes: fieldNodes
198195 )
@@ -237,34 +234,56 @@ func executeSubscription(
237234 let resolvedFuture : Future < Any ? >
238235 switch resolvedFutureOrError {
239236 case let . failure( error) :
240- throw error
237+ if let graphQLError = error as? GraphQLError {
238+ throw graphQLError
239+ } else {
240+ throw GraphQLError ( error)
241+ }
241242 case let . success( success) :
242243 resolvedFuture = success
243244 }
244245 return resolvedFuture. map { resolved -> SourceEventStreamResult in
245246 if !context. errors. isEmpty {
246- // TODO improve this to return multiple errors if we have them.
247- return SourceEventStreamResult . failure ( context. errors. first!)
247+ return SourceEventStreamResult ( errors: context. errors)
248248 } else if let error = resolved as? GraphQLError {
249- return SourceEventStreamResult . failure ( error)
249+ return SourceEventStreamResult ( errors : [ error] )
250250 } else if let observable = resolved as? SourceEventStreamObservable {
251- return SourceEventStreamResult . success ( observable)
251+ return SourceEventStreamResult ( observable : observable)
252252 } else if resolved == nil {
253- return SourceEventStreamResult . failure (
253+ return SourceEventStreamResult ( errors : [
254254 GraphQLError ( message: " Resolved subscription was nil " )
255- )
255+ ] )
256256 } else {
257257 let resolvedObj = resolved as AnyObject
258- return SourceEventStreamResult . failure (
258+ return SourceEventStreamResult ( errors : [
259259 GraphQLError (
260260 message: " Subscription field resolver must return SourceEventStreamObservable. Received: ' \( resolvedObj) ' "
261261 )
262- )
262+ ] )
263263 }
264264 }
265265}
266266
267- typealias SubscriptionObservable = Observable < Future < GraphQLResult > >
268- typealias SubscriptionResult = Result < SubscriptionObservable , GraphQLError >
267+ public struct SubscriptionResult {
268+ public var observable : SubscriptionObservable ?
269+ public var errors : [ GraphQLError ]
270+
271+ public init ( observable: SubscriptionObservable ? = nil , errors: [ GraphQLError ] = [ ] ) {
272+ self . observable = observable
273+ self . errors = errors
274+ }
275+ }
276+ public typealias SubscriptionObservable = Observable < Future < GraphQLResult > >
277+
278+ struct SourceEventStreamResult {
279+ public var observable : SourceEventStreamObservable ?
280+ public var errors : [ GraphQLError ]
281+
282+ public init ( observable: SourceEventStreamObservable ? = nil , errors: [ GraphQLError ] = [ ] ) {
283+ self . observable = observable
284+ self . errors = errors
285+ }
286+ }
269287typealias SourceEventStreamObservable = Observable < Any >
270- typealias SourceEventStreamResult = Result < SourceEventStreamObservable , GraphQLError >
288+
289+
0 commit comments