14
14
// limitations under the License.
15
15
16
16
import 'dart:async' ;
17
- import 'dart:convert' ;
18
17
import 'dart:html' ;
19
18
import 'dart:js_util' as js_util;
20
19
import 'dart:typed_data' ;
21
20
22
21
import 'package:async/async.dart' ;
22
+ import 'package:js/js.dart' ;
23
23
import 'package:meta/meta.dart' ;
24
24
25
25
import '../../client/call.dart' ;
@@ -32,6 +32,52 @@ import 'web_streams.dart';
32
32
33
33
const _contentTypeKey = 'Content-Type' ;
34
34
35
+ @anonymous
36
+ @JS ()
37
+ class RequestInit {
38
+ external factory RequestInit (
39
+ {required String method,
40
+ Object ? headers,
41
+ List <int >? body,
42
+ required String referrerPolicy,
43
+ required String mode,
44
+ required String credentials,
45
+ required String cache,
46
+ required String redirect,
47
+ required String integrity,
48
+ required bool keepalive});
49
+
50
+ external String get method;
51
+ external set method (String newValue);
52
+
53
+ external Object ? get headers;
54
+ external set headers (Object ? newValue);
55
+
56
+ external Uint8List ? get body;
57
+ external set body (Uint8List ? newValue);
58
+
59
+ external String get referrerPolicy;
60
+ external set referrerPolicy (String newValue);
61
+
62
+ external String get mode;
63
+ external set mode (String newValue);
64
+
65
+ external String get credentials;
66
+ external set credentials (String newValue);
67
+
68
+ external String get cache;
69
+ external set cache (String newValue);
70
+
71
+ external String get redirect;
72
+ external set redirect (String newValue);
73
+
74
+ external String get integrity;
75
+ external set integrity (String newValue);
76
+
77
+ external bool get keepalive;
78
+ external set keepalive (bool newValue);
79
+ }
80
+
35
81
/// Implementation of Fetch API simulating @HttpRequest for minimal changes
36
82
class FetchHttpRequest {
37
83
// Request parameters
@@ -81,25 +127,20 @@ class FetchHttpRequest {
81
127
Future send ([List <int >? data]) async {
82
128
final wgs = WorkerGlobalScope .instance;
83
129
_setReadyState (HttpRequest .LOADING );
84
- final headersStr =
85
- headers.isNotEmpty ? '"headers": ${json .encode (headers )},' : '' ;
86
- final bodyStr = data != null ? '"body": Uint8Array.from($data ),' : '' ;
87
- final initStr = '''{
88
- $headersStr
89
- $bodyStr
90
- "method": "$method ",
91
- "referrerPolicy": "$referrerPolicy ",
92
- "mode": "$mode ",
93
- "credentials": "$credentials ",
94
- "cache": "$cache ",
95
- "redirect": "$redirect ",
96
- "integrity": "$integrity ",
97
- "keepalive": $keepAlive
98
- }''' ;
99
-
100
- final promise = js_util.promiseToFuture (
101
- js_util.callMethod (wgs, 'eval' , ['fetch("$uri ", $initStr )' ]));
102
- final operation = _cancelable = CancelableOperation .fromFuture (promise);
130
+
131
+ final init = RequestInit (
132
+ cache: cache,
133
+ credentials: credentials,
134
+ integrity: integrity,
135
+ keepalive: keepAlive,
136
+ method: method,
137
+ mode: mode,
138
+ redirect: redirect,
139
+ referrerPolicy: referrerPolicy,
140
+ body: data,
141
+ headers: js_util.jsify (headers));
142
+ final operation = _cancelable = CancelableOperation .fromFuture (
143
+ js_util.promiseToFuture (js_util.callMethod (wgs, 'fetch' , [uri, init])));
103
144
104
145
_response = await operation.value;
105
146
_setReadyState (HttpRequest .HEADERS_RECEIVED );
0 commit comments