Skip to content

Commit e627db5

Browse files
author
Steve Browne
committed
Created RequestInit js interop type to force body to be a Uint8List and marshal to javascript Uint8Array.
1 parent da178b3 commit e627db5

File tree

1 file changed

+61
-20
lines changed

1 file changed

+61
-20
lines changed

lib/src/client/transport/fetch_transport.dart

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
// limitations under the License.
1515

1616
import 'dart:async';
17-
import 'dart:convert';
1817
import 'dart:html';
1918
import 'dart:js_util' as js_util;
2019
import 'dart:typed_data';
2120

2221
import 'package:async/async.dart';
22+
import 'package:js/js.dart';
2323
import 'package:meta/meta.dart';
2424

2525
import '../../client/call.dart';
@@ -32,6 +32,52 @@ import 'web_streams.dart';
3232

3333
const _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
3682
class 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

Comments
 (0)