1414// limitations under the License.
1515
1616import 'dart:async' ;
17- import 'dart:convert' ;
1817import 'dart:html' ;
1918import 'dart:js_util' as js_util;
2019import 'dart:typed_data' ;
2120
2221import 'package:async/async.dart' ;
22+ import 'package:js/js.dart' ;
2323import 'package:meta/meta.dart' ;
2424
2525import '../../client/call.dart' ;
@@ -32,6 +32,52 @@ import 'web_streams.dart';
3232
3333const _contentTypeKey = 'Content-Type' ;
3434
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+
3581/// Implementation of Fetch API simulating @HttpRequest for minimal changes
3682class FetchHttpRequest {
3783 // Request parameters
@@ -81,25 +127,20 @@ class FetchHttpRequest {
81127 Future send ([List <int >? data]) async {
82128 final wgs = WorkerGlobalScope .instance;
83129 _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])));
103144
104145 _response = await operation.value;
105146 _setReadyState (HttpRequest .HEADERS_RECEIVED );
0 commit comments