   func extractAll<C: ExecutionContext>(
     context: C,
     executor: Executor? = nil,
-    _ block: @escaping (_ strongContext: C, _ updates: [Update], _ completion: Fallible<Success>) -> Void) {
-    var updates = [Update]()
-    let executor_ = (executor ?? context.executor).makeDerivedSerialExecutor()
-    self.onEvent(context: context, executor: executor_) { (context, value) in
-      switch value {
-      case let .update(update):
-        updates.append(update)
-      case let .completion(completion):
+    _ block: @escaping (_ strongContext: C, _ updates: [Update], _ completion: Fallible<Success>) -> Void)
+  {
+    extractAll(executor: executor ?? context.executor) {
+      [weak context] (updates, completion) in
+      if let context = context {
         block(context, updates, completion)
       }
     }

}

public extension EventsSource {
  /// Subscribes for buffered and new values (both update and completion) for the channel
  ///
  /// - Parameters:

    context: C,
    executor: Executor? = nil,
    _ block: @escaping (_ strongContext: C, _ event: Event) -> Void) {
    _onEvent(context: context, executor: executor) {
      (context, event, originalExecutor) in
      block(context, event)
    }
  }

