From 783f7e233701ee0632f8c4e59f8cc109fb1f67f3 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Fri, 22 Jan 2021 20:25:01 -0600 Subject: [PATCH] fix write function being cancelled on disconnect --- src/sagas/lwp3-bootloader-ble.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/sagas/lwp3-bootloader-ble.ts b/src/sagas/lwp3-bootloader-ble.ts index f22c155e..0fbcbe60 100644 --- a/src/sagas/lwp3-bootloader-ble.ts +++ b/src/sagas/lwp3-bootloader-ble.ts @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -// Copyright (c) 2020 The Pybricks Authors +// Copyright (c) 2020-2021 The Pybricks Authors // File: sagas/lwp3-bootloader-ble.ts // Handles Bluetooth Low Energy connection to LEGO Wireless Protocol v3 Bootloader service. import { END, eventChannel } from 'redux-saga'; -import { call, cancel, put, takeEvery, takeMaybe } from 'redux-saga/effects'; +import { call, cancel, put, spawn, takeEvery, takeMaybe } from 'redux-saga/effects'; import { BootloaderConnectionAction, BootloaderConnectionActionType, @@ -141,8 +141,15 @@ function* connect(_action: BootloaderConnectionAction): Generator { return; } + // Spawning write so that it can't be canceled. This is important because + // other sagas always expect it to complete with success action or error + // action. + function* spawnWrite(action: BootloaderConnectionSendAction): Generator { + yield spawn(write, characteristic, action); + } + yield takeEvery(notificationChannel, handleNotify); - yield takeEvery(BootloaderConnectionActionType.Send, write, characteristic); + yield takeEvery(BootloaderConnectionActionType.Send, spawnWrite); yield takeEvery( BootloaderConnectionActionType.Disconnect, server.disconnect.bind(server),