1/* 2 * Copyright (C) 2025 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17import {AdbWebSocketStream, DataListener} from './adb_websocket_stream'; 18import {DevicesMsgListener, DevicesStream} from './devices_stream'; 19import {ShellStream} from './shell_stream'; 20import {SyncStream} from './sync_stream'; 21import {ErrorListener} from './websocket_stream'; 22 23export class StreamProvider { 24 private streams: AdbWebSocketStream[] = []; 25 private devicesStream: DevicesStream | undefined; 26 27 createSyncStream( 28 deviceSerialNumber: string, 29 sock: WebSocket, 30 errorListener: ErrorListener, 31 ): SyncStream { 32 const stream = new SyncStream(sock, deviceSerialNumber, errorListener); 33 this.streams.push(stream); 34 return stream; 35 } 36 37 createShellStream( 38 deviceSerialNumber: string, 39 sock: WebSocket, 40 dataListener: DataListener, 41 errorListener: ErrorListener, 42 ): ShellStream { 43 const stream = new ShellStream( 44 sock, 45 deviceSerialNumber, 46 dataListener, 47 errorListener, 48 ); 49 this.streams.push(stream); 50 return stream; 51 } 52 53 removeStream(stream: AdbWebSocketStream) { 54 this.streams = this.streams.filter((s) => s !== stream); 55 } 56 57 createDevicesStream( 58 sock: WebSocket, 59 msgListener: DevicesMsgListener, 60 errorListener: () => void, 61 ): DevicesStream { 62 if (this.devicesStream) { 63 this.devicesStream.close(); 64 this.devicesStream = undefined; 65 } 66 this.devicesStream = new DevicesStream(sock, msgListener, errorListener); 67 return this.devicesStream; 68 } 69 70 closeAllStreams() { 71 this.streams.forEach((stream) => stream.close()); 72 this.devicesStream?.close(); 73 } 74} 75