Line data Source code
1 : import 'package:flutter/foundation.dart';
2 :
3 : import '../worker.dart';
4 :
5 : /// Connect to a WebSocket endpoint, send messages, and receive responses.
6 : ///
7 : /// The worker connects to [url], sends each string in [messages] after the
8 : /// connection is established, waits for [receiveMessages] server responses,
9 : /// then closes the connection cleanly.
10 : ///
11 : /// **Platform support:** Android only. Calling this on iOS will return a
12 : /// failure result with message `"WebSocketWorker is not supported on iOS"`.
13 : ///
14 : /// ```dart
15 : /// await NativeWorkManager.enqueue(
16 : /// taskId: 'ws-ping',
17 : /// worker: NativeWorker.webSocket(
18 : /// url: 'wss://api.example.com/ws',
19 : /// messages: ['{"type":"ping"}'],
20 : /// receiveMessages: 1,
21 : /// ),
22 : /// );
23 : /// ```
24 : ///
25 : /// **Result data (success):**
26 : /// ```json
27 : /// {
28 : /// "connected": true,
29 : /// "messagesSent": 1,
30 : /// "messagesReceived": 1,
31 : /// "messages": ["{\"type\":\"pong\"}"]
32 : /// }
33 : /// ```
34 : ///
35 : /// Optionally persist received messages to disk via [storeResponseAt].
36 : @immutable
37 : final class WebSocketWorker extends Worker {
38 1 : const WebSocketWorker({
39 : required this.url,
40 : this.messages = const [],
41 : this.headers = const {},
42 : this.timeoutSeconds = 30,
43 : this.receiveMessages = 1,
44 : this.storeResponseAt,
45 : this.pingIntervalSeconds,
46 : });
47 :
48 : /// WebSocket endpoint URL. Must use `ws://` or `wss://` scheme.
49 : final String url;
50 :
51 : /// Messages to send after the connection is established.
52 : final List<String> messages;
53 :
54 : /// Optional HTTP upgrade headers (e.g. `Authorization: Bearer …`).
55 : final Map<String, String> headers;
56 :
57 : /// Total connection timeout in seconds. Default `30`.
58 : final int timeoutSeconds;
59 :
60 : /// Number of server messages to wait for before closing. Default `1`.
61 : final int receiveMessages;
62 :
63 : /// Optional absolute path to write received messages as a JSON array.
64 : final String? storeResponseAt;
65 :
66 : /// Optional WebSocket ping interval in seconds (keep-alive).
67 : final int? pingIntervalSeconds;
68 :
69 1 : @override
70 : String get workerClassName => 'WebSocketWorker';
71 :
72 1 : @override
73 1 : Map<String, dynamic> toMap() => {
74 1 : 'workerType': 'webSocket',
75 2 : 'url': url,
76 2 : 'messages': messages,
77 4 : if (headers.isNotEmpty) 'headers': headers,
78 2 : 'timeoutSeconds': timeoutSeconds,
79 2 : 'receiveMessages': receiveMessages,
80 3 : if (storeResponseAt != null) 'storeResponseAt': storeResponseAt,
81 1 : if (pingIntervalSeconds != null)
82 2 : 'pingIntervalSeconds': pingIntervalSeconds,
83 : };
84 : }
|