From 9d58cdb62254f4d543e7b941eb3b516cf5e36d0e Mon Sep 17 00:00:00 2001 From: Steve Scruff Date: Sun, 24 Sep 2023 12:10:53 -0700 Subject: [PATCH 1/3] upgrade to typings --- .../cloudflare-durable-objects/lib/main.dart | 4 +- .../cloudflare_workers/example/lib/main.dart | 2 +- .../lib/interop/cache_interop.dart | 2 +- .../lib/interop/durable_object_interop.dart | 91 +++++--------- .../lib/interop/email_message_interop.dart | 9 +- .../lib/interop/html_rewriter_interop.dart | 17 +-- .../lib/interop/request_init_interop.dart | 12 +- .../lib/interop/request_interop.dart | 2 +- .../lib/public/cloudflare_workers.dart | 34 +++-- .../lib/public/do/durable_object.dart | 5 +- .../lib/public/fetcher.dart | 60 ++++----- .../lib/public/kv_namespace.dart | 19 ++- .../lib/public/request.dart | 4 +- .../cloudflare_workers/lib/public/socket.dart | 2 +- .../cloudflare_workers/lib/public/top.dart | 60 ++++----- packages/cloudflare_workers/pubspec.yaml | 2 +- .../cloudflare_workers/test/_playground.dart | 24 ++-- .../lib/src/interop/deno_interop.dart | 9 +- packages/deno_deploy/pubspec.yaml | 4 +- .../test/http_client_test.dart | 2 +- packages/edge_runtime/lib/edge_runtime.dart | 38 +++--- packages/edge_runtime/lib/src/abort.dart | 5 +- packages/edge_runtime/lib/src/blob.dart | 8 +- .../edge_runtime/lib/src/cache/cache.dart | 31 +++-- .../lib/src/cache/cache_query_options.dart | 2 +- .../lib/src/cache/cache_storage.dart | 10 +- packages/edge_runtime/lib/src/crypto.dart | 36 ++---- .../edge_runtime/lib/src/fetch_event.dart | 13 +- packages/edge_runtime/lib/src/file.dart | 8 +- packages/edge_runtime/lib/src/form_data.dart | 6 +- packages/edge_runtime/lib/src/headers.dart | 7 +- .../lib/src/interop/cache_interop.dart | 2 +- .../lib/src/interop/crypto_interop.dart | 5 - .../lib/src/interop/scope_interop.dart | 4 +- .../lib/src/interop/utils_interop.dart | 5 +- .../edge_runtime/lib/src/io_http_client.dart | 12 +- packages/edge_runtime/lib/src/request.dart | 115 ----------------- packages/edge_runtime/lib/src/resource.dart | 4 +- packages/edge_runtime/lib/src/response.dart | 9 +- .../edge_runtime/lib/src/text_decoder.dart | 10 +- .../edge_runtime/lib/src/text_encoder.dart | 12 +- packages/edge_runtime/lib/src/top.dart | 64 +++++----- packages/edge_runtime/pubspec.yaml | 6 +- packages/edge_runtime/test/cache_test.dart | 32 +++-- packages/edge_runtime/test/fetch_test.dart | 1 - packages/edge_runtime/test/headers_test.dart | 9 +- packages/edge_runtime/test/request_test.dart | 100 ++++++++------- packages/edge_runtime/test/utils.dart | 117 ++++++++---------- packages/netlify_edge/lib/netlify_edge.dart | 12 +- packages/netlify_edge/pubspec.yaml | 2 +- .../lib/supabase_functions.dart | 10 +- packages/supabase_functions/pubspec.yaml | 2 +- .../lib/interop/request_interop.dart | 2 +- packages/vercel_edge/lib/public/request.dart | 8 +- packages/vercel_edge/lib/vercel_edge.dart | 11 +- .../vercel_edge/lib/vercel_edge_shelf.dart | 12 +- packages/vercel_edge/pubspec.yaml | 2 +- pubspec.yaml | 2 +- 58 files changed, 431 insertions(+), 667 deletions(-) delete mode 100644 packages/edge_runtime/lib/src/interop/crypto_interop.dart delete mode 100644 packages/edge_runtime/lib/src/request.dart diff --git a/examples/cloudflare-durable-objects/lib/main.dart b/examples/cloudflare-durable-objects/lib/main.dart index e4f5de0..3afc0f8 100644 --- a/examples/cloudflare-durable-objects/lib/main.dart +++ b/examples/cloudflare-durable-objects/lib/main.dart @@ -12,7 +12,7 @@ class TestClass extends DurableObject { await state.storage.setAlarm(DateTime.now().add(Duration(seconds: 2))); } - return Response('Path "${request.url.path}" called $views times.'); + return Response('Path "${Uri.parse(request.url).path}" called $views times.'); } @override @@ -36,7 +36,7 @@ void main() { final namespace = env.getDurableObjectNamespace('TEST'); // Get an ID for the DO (this can be based on the request, name, user ID etc) - final id = namespace.idFromName(request.url.path); + final id = namespace.idFromName(Uri.parse(request.url).path); // Send the DO a request instance. return namespace.get(id).fetch(request); diff --git a/packages/cloudflare_workers/example/lib/main.dart b/packages/cloudflare_workers/example/lib/main.dart index 17310bd..4844b1d 100644 --- a/packages/cloudflare_workers/example/lib/main.dart +++ b/packages/cloudflare_workers/example/lib/main.dart @@ -10,7 +10,7 @@ void main() { final durable = env.getDurableObjectNamespace('FOO_BAR'); // Generate an ID for the Durable Object (can be any string). - final id = durable.idFromName(request.url.path); + final id = durable.idFromName(Uri.parse(request.url).path); // Send a request to the Durable Object. return durable.get(id).fetch(request); diff --git a/packages/cloudflare_workers/lib/interop/cache_interop.dart b/packages/cloudflare_workers/lib/interop/cache_interop.dart index 621b207..551ae96 100644 --- a/packages/cloudflare_workers/lib/interop/cache_interop.dart +++ b/packages/cloudflare_workers/lib/interop/cache_interop.dart @@ -2,7 +2,7 @@ library cache; import 'package:js/js.dart' as js; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; @js.JS('default') external interop.Cache get defaultCache; diff --git a/packages/cloudflare_workers/lib/interop/durable_object_interop.dart b/packages/cloudflare_workers/lib/interop/durable_object_interop.dart index 88e5fb6..fa40adb 100644 --- a/packages/cloudflare_workers/lib/interop/durable_object_interop.dart +++ b/packages/cloudflare_workers/lib/interop/durable_object_interop.dart @@ -1,7 +1,7 @@ import 'dart:js_util' as js_util; import 'package:js/js.dart'; import 'package:js/js_util.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'package:edge_runtime/src/interop/promise_interop.dart'; import 'package:edge_runtime/src/interop/utils_interop.dart'; @@ -30,8 +30,7 @@ extension PropsDurableObject on DurableObject { js_util.setProperty(this, 'env', env); } - set fetch( - Promise Function(interop.Request request) function) { + set fetch(Promise Function(interop.Request request) function) { js_util.setProperty(this, 'fetch', function); } @@ -52,38 +51,32 @@ class DurableObjectStorage { } extension PropsDurableObjectStorage on DurableObjectStorage { - Future get(/* String | List */ dynamic keys, - DurableObjectGetOptions options) async { + Future get( + /* String | List */ dynamic keys, DurableObjectGetOptions options) async { return js_util.promiseToFuture( js_util.callMethod(this, 'get', [keys, options]), ); } - Future put( - String key, dynamic value, DurableObjectPutOptions options) { + Future put(String key, dynamic value, DurableObjectPutOptions options) { var newValue = value; if (value is Map || value is Iterable) { newValue = jsify(value); } - return js_util.promiseToFuture( - js_util.callMethod(this, 'put', [key, newValue, options])); + return js_util.promiseToFuture(js_util.callMethod(this, 'put', [key, newValue, options])); } - Future putEntries( - Map entries, DurableObjectPutOptions options) => - js_util.promiseToFuture( - js_util.callMethod(this, 'put', [jsify(entries), options])); + Future putEntries(Map entries, DurableObjectPutOptions options) => + js_util.promiseToFuture(js_util.callMethod(this, 'put', [jsify(entries), options])); - Future delete(String key, DurableObjectPutOptions options) => js_util - .promiseToFuture(js_util.callMethod(this, 'delete', [key, options])); + Future delete(String key, DurableObjectPutOptions options) => + js_util.promiseToFuture(js_util.callMethod(this, 'delete', [key, options])); Future deleteAll(DurableObjectPutOptions options) => js_util.promiseToFuture(js_util.callMethod(this, 'deleteAll', [options])); - Future deleteEntries(Iterable keys, - [DurableObjectPutOptions? options]) => - js_util - .promiseToFuture(js_util.callMethod(this, 'delete', [keys, options])); + Future deleteEntries(Iterable keys, [DurableObjectPutOptions? options]) => + js_util.promiseToFuture(js_util.callMethod(this, 'delete', [keys, options])); Future> list([DurableObjectListOptions? options]) => js_util.promiseToFuture(js_util.callMethod(this, 'list', [options])); @@ -91,8 +84,7 @@ extension PropsDurableObjectStorage on DurableObjectStorage { Future getAlarm([DurableObjectGetAlarmOptions? options]) => js_util.promiseToFuture(js_util.callMethod(this, 'getAlarm', [options])); - Future setAlarm(DateTime scheduled, - [DurableObjectSetAlarmOptions? options]) => + Future setAlarm(DateTime scheduled, [DurableObjectSetAlarmOptions? options]) => js_util.promiseToFuture(js_util.callMethod(this, 'setAlarm', [ scheduled.millisecondsSinceEpoch, options, @@ -103,11 +95,9 @@ extension PropsDurableObjectStorage on DurableObjectStorage { options, ])); - Future sync() => - js_util.promiseToFuture(js_util.callMethod(this, 'sync', [])); + Future sync() => js_util.promiseToFuture(js_util.callMethod(this, 'sync', [])); - Future transaction( - Future Function(DurableObjectTransaction tsx) callback) { + Future transaction(Future Function(DurableObjectTransaction tsx) callback) { return js_util.promiseToFuture( js_util.callMethod(this, 'transaction', [ allowInterop((tsx) async { @@ -127,8 +117,7 @@ class DurableObjectGetOptions { extension PropsDurableObjectGetOptions on DurableObjectGetOptions { set allowConcurrency(bool? allowConcurrency) { - js_util.setProperty( - this, 'allowConcurrency', allowConcurrency ?? jsUndefined); + js_util.setProperty(this, 'allowConcurrency', allowConcurrency ?? jsUndefined); } set noCache(bool? noCache) { @@ -145,8 +134,7 @@ class DurableObjectGetAlarmOptions { extension PropsDurableObjectGetAlarmOptions on DurableObjectGetAlarmOptions { set allowConcurrency(bool? allowConcurrency) { - js_util.setProperty( - this, 'allowConcurrency', allowConcurrency ?? jsUndefined); + js_util.setProperty(this, 'allowConcurrency', allowConcurrency ?? jsUndefined); } } @@ -159,13 +147,11 @@ class DurableObjectSetAlarmOptions { extension PropsDurableObjectSetAlarmOptions on DurableObjectSetAlarmOptions { set allowConcurrency(bool? allowConcurrency) { - js_util.setProperty( - this, 'allowConcurrency', allowConcurrency ?? jsUndefined); + js_util.setProperty(this, 'allowConcurrency', allowConcurrency ?? jsUndefined); } set allowUnconfirmed(bool? allowUnconfirmed) { - js_util.setProperty( - this, 'allowUnconfirmed', allowUnconfirmed ?? jsUndefined); + js_util.setProperty(this, 'allowUnconfirmed', allowUnconfirmed ?? jsUndefined); } } @@ -178,13 +164,11 @@ class DurableObjectPutOptions { extension PropsDurableObjectPutOptions on DurableObjectPutOptions { set allowConcurrency(bool? allowConcurrency) { - js_util.setProperty( - this, 'allowConcurrency', allowConcurrency ?? jsUndefined); + js_util.setProperty(this, 'allowConcurrency', allowConcurrency ?? jsUndefined); } set allowUnconfirmed(bool? allowUnconfirmed) { - js_util.setProperty( - this, 'allowUnconfirmed', allowUnconfirmed ?? jsUndefined); + js_util.setProperty(this, 'allowUnconfirmed', allowUnconfirmed ?? jsUndefined); } set noCache(bool? noCache) { @@ -225,8 +209,7 @@ extension PropsDurableObjectListOptions on DurableObjectListOptions { } set allowConcurrency(bool? allowConcurrency) { - js_util.setProperty( - this, 'allowConcurrency', allowConcurrency ?? jsUndefined); + js_util.setProperty(this, 'allowConcurrency', allowConcurrency ?? jsUndefined); } set noCache(bool? noCache) { @@ -262,8 +245,7 @@ extension PropsDurableObjectState on DurableObjectState { DurableObjectStorage get storage => js_util.getProperty(this, 'storage'); - void waitUntil(Future f) => - js_util.callMethod(this, 'waitUntil', [futureToPromise(f)]); + void waitUntil(Future f) => js_util.callMethod(this, 'waitUntil', [futureToPromise(f)]); Future blockConcurrencyWhile(Future Function() callback) { return js_util.promiseToFuture( @@ -284,15 +266,11 @@ class DurableObjectNamespace { } extension PropsDurableObjectNamespace on DurableObjectNamespace { - DurableObjectId newUniqueId( - [DurableObjectNamespaceNewUniqueIdOptions? options]) => + DurableObjectId newUniqueId([DurableObjectNamespaceNewUniqueIdOptions? options]) => js_util.callMethod(this, 'newUniqueId', [options]); - DurableObjectId idFromName(String name) => - js_util.callMethod(this, 'idFromName', [name]); - DurableObjectId idFromString(String id) => - js_util.callMethod(this, 'idFromString', [id]); - DurableObjectStub get(DurableObjectId id) => - js_util.callMethod(this, 'get', [id]); + DurableObjectId idFromName(String name) => js_util.callMethod(this, 'idFromName', [name]); + DurableObjectId idFromString(String id) => js_util.callMethod(this, 'idFromString', [id]); + DurableObjectStub get(DurableObjectId id) => js_util.callMethod(this, 'get', [id]); } @anonymous @@ -304,8 +282,7 @@ class DurableObjectId { extension PropsDurableObjectId on DurableObjectId { String get name => js_util.getProperty(this, 'name'); - bool equals(DurableObjectId other) => - js_util.callMethod(this, 'equals', [other]); + bool equals(DurableObjectId other) => js_util.callMethod(this, 'equals', [other]); String mToString() => js_util.callMethod(this, 'toString', []); } @@ -318,10 +295,8 @@ class Fetcher { extension PropsFetcher on Fetcher { // TODO RequestInit - Future fetch(interop.Request resource, - [interop.RequestInit? init]) => - js_util - .promiseToFuture(js_util.callMethod(this, 'fetch', [resource, init])); + Future fetch(interop.Request resource, [interop.RequestInit? init]) => + js_util.promiseToFuture(js_util.callMethod(this, 'fetch', [resource, init])); Socket connect(String address, [SocketOptions? options]) => js_util.callMethod(this, 'connect', [address, options]); @@ -335,10 +310,8 @@ class Socket { } extension PropsSocket on Socket { - Future get readable => - js_util.getProperty(this, 'readable'); - Future get writable => - js_util.getProperty(this, 'writable'); + Future get readable => js_util.getProperty(this, 'readable'); + Future get writable => js_util.getProperty(this, 'writable'); Future get closed => js_util.getProperty(this, 'closed'); Future close() => js_util.callMethod(this, 'close', []); } diff --git a/packages/cloudflare_workers/lib/interop/email_message_interop.dart b/packages/cloudflare_workers/lib/interop/email_message_interop.dart index fbd5d5e..6719242 100644 --- a/packages/cloudflare_workers/lib/interop/email_message_interop.dart +++ b/packages/cloudflare_workers/lib/interop/email_message_interop.dart @@ -1,7 +1,7 @@ import 'dart:js_util' as js_util; import 'package:js/js.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; @anonymous @JS() @@ -17,8 +17,7 @@ extension PropsEmailMessage on EmailMessage { interop.ReadableStream get raw => js_util.getProperty(this, 'raw'); int get rawSize => js_util.getProperty(this, 'rawSize'); - void setReject(String reason) => - js_util.callMethod(this, 'setReject', [reason]); - Future forward(String to, [interop.Headers? headers]) => js_util - .promiseToFuture(js_util.callMethod(this, 'forward', [to, headers])); + void setReject(String reason) => js_util.callMethod(this, 'setReject', [reason]); + Future forward(String to, [interop.Headers? headers]) => + js_util.promiseToFuture(js_util.callMethod(this, 'forward', [to, headers])); } diff --git a/packages/cloudflare_workers/lib/interop/html_rewriter_interop.dart b/packages/cloudflare_workers/lib/interop/html_rewriter_interop.dart index 7d937d6..cdd793f 100644 --- a/packages/cloudflare_workers/lib/interop/html_rewriter_interop.dart +++ b/packages/cloudflare_workers/lib/interop/html_rewriter_interop.dart @@ -1,6 +1,6 @@ import 'dart:js_util' as js_util; import 'package:js/js.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'package:edge_runtime/src/interop/promise_interop.dart'; typedef HandlerMethod = Promise Function(T type); @@ -152,17 +152,14 @@ extension PropsElement on Element { bool get removed => js_util.getProperty(this, 'removed'); String get namespaceURI => js_util.getProperty(this, 'namespaceURI'); - String? getAttribute(String name) => - js_util.callMethod(this, 'getAttribute', [name]); + String? getAttribute(String name) => js_util.callMethod(this, 'getAttribute', [name]); - bool hasAttribute(String name) => - js_util.callMethod(this, 'hasAttribute', [name]); + bool hasAttribute(String name) => js_util.callMethod(this, 'hasAttribute', [name]); Element setAttribute(String name, String value) => js_util.callMethod(this, 'setAttribute', [name, value]); - Element removeAttribute(String name) => - js_util.callMethod(this, 'removeAttribute', [name]); + Element removeAttribute(String name) => js_util.callMethod(this, 'removeAttribute', [name]); Element before(String text, [ContentOptions? options]) => js_util.callMethod(this, 'before', [text, options]); @@ -181,14 +178,12 @@ extension PropsElement on Element { Element remove() => js_util.callMethod(this, 'remove', []); - Element removeAndKeepContent() => - js_util.callMethod(this, 'removeAndKeepContent', []); + Element removeAndKeepContent() => js_util.callMethod(this, 'removeAndKeepContent', []); Element setInnerContent(String text, [ContentOptions? options]) => js_util.callMethod(this, 'setInnerContent', [text, options]); - void onEndTag(dynamic handler) => - js_util.callMethod(this, 'onEndTag', [handler]); + void onEndTag(dynamic handler) => js_util.callMethod(this, 'onEndTag', [handler]); } @anonymous diff --git a/packages/cloudflare_workers/lib/interop/request_init_interop.dart b/packages/cloudflare_workers/lib/interop/request_init_interop.dart index 844967d..280fbec 100644 --- a/packages/cloudflare_workers/lib/interop/request_init_interop.dart +++ b/packages/cloudflare_workers/lib/interop/request_init_interop.dart @@ -1,6 +1,6 @@ import 'dart:js_util' as js_util; import 'package:js/js.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'package:edge_runtime/src/interop/utils_interop.dart'; extension CloudflareWorkersRequestInteropExtension on interop.RequestInit { @@ -45,11 +45,11 @@ extension PropsCloudflareRequestInit on CloudflareRequestInit { js_util.setProperty(this, 'apps', value ?? jsUndefined); } - set image(dynamic? value) { + set image(dynamic value) { js_util.setProperty(this, 'image', value ?? jsUndefined); } - set minify(dynamic? value) { + set minify(dynamic value) { js_util.setProperty(this, 'minify', value ?? jsUndefined); } @@ -73,8 +73,7 @@ class RequestInitCfPropertiesImageMinify { external factory RequestInitCfPropertiesImageMinify(); } -extension PropsRequestInitCfPropertiesImageMinify - on RequestInitCfPropertiesImageMinify { +extension PropsRequestInitCfPropertiesImageMinify on RequestInitCfPropertiesImageMinify { set javascript(bool? value) { js_util.setProperty(this, 'javascript', value ?? jsUndefined); } @@ -130,8 +129,7 @@ class RequestInitCfPropertiesImageDraw extends BasicImageTransformations { }); } -extension PropsRequestInitCfPropertiesImageDraw - on RequestInitCfPropertiesImageDraw { +extension PropsRequestInitCfPropertiesImageDraw on RequestInitCfPropertiesImageDraw { set opacity(num? value) { js_util.setProperty(this, 'opacity', value ?? jsUndefined); } diff --git a/packages/cloudflare_workers/lib/interop/request_interop.dart b/packages/cloudflare_workers/lib/interop/request_interop.dart index 9770609..ac63eda 100644 --- a/packages/cloudflare_workers/lib/interop/request_interop.dart +++ b/packages/cloudflare_workers/lib/interop/request_interop.dart @@ -1,6 +1,6 @@ import 'dart:js_util' as js_util; import 'package:js/js.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; extension CloudflareWorkersRequestInteropExtension on interop.Request { IncomingRequestCfProperties get cf => js_util.getProperty(this, 'cf'); diff --git a/packages/cloudflare_workers/lib/public/cloudflare_workers.dart b/packages/cloudflare_workers/lib/public/cloudflare_workers.dart index 4eb80d3..ee4b30e 100644 --- a/packages/cloudflare_workers/lib/public/cloudflare_workers.dart +++ b/packages/cloudflare_workers/lib/public/cloudflare_workers.dart @@ -3,10 +3,9 @@ import 'dart:js_util' as js_util; import 'package:edge_runtime/edge_runtime.dart'; import 'package:js/js.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; -import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import '../interop/environment_interop.dart' as interop; import '../interop/scheduled_event_interop.dart' as interop; import '../interop/email_message_interop.dart' as interop; @@ -21,20 +20,20 @@ import '../public/environment.dart'; @JS('__dartCloudflareFetchHandler') external set globalDartFetchHandler( - Promise Function(interop.Request req, - interop.Environment env, interop.ExecutionContext ctx) + Promise Function( + interop.Request req, interop.Environment env, interop.ExecutionContext ctx) f); @JS('__dartCloudflareScheduledHandler') external set globalDartScheduledHandler( - Promise Function(interop.ScheduledEvent event, - interop.Environment env, interop.ExecutionContext ctx) + Promise Function( + interop.ScheduledEvent event, interop.Environment env, interop.ExecutionContext ctx) f); @JS('__dartCloudflareEmailHandler') external set globalDartEmailHandler( - Promise Function(interop.EmailMessage message, - interop.Environment env, interop.ExecutionContext ctx) + Promise Function( + interop.EmailMessage message, interop.Environment env, interop.ExecutionContext ctx) f); @JS('__dartCloudflareDurableObjects') @@ -52,11 +51,11 @@ typedef CloudflareWorkersEmailEvent = FutureOr Function( typedef CloudflareWorkersDurableObjects = Map; void attachFetchHandler(CloudflareWorkersFetchEvent handler) { - globalDartFetchHandler = allowInterop((interop.Request req, - interop.Environment env, interop.ExecutionContext ctx) { + globalDartFetchHandler = + allowInterop((interop.Request req, interop.Environment env, interop.ExecutionContext ctx) { return futureToPromise(Future(() async { final response = await handler( - requestFromJsObject(req), + req, environmentFromJsObject(env), executionContextFromJsObject(ctx), ); @@ -66,8 +65,8 @@ void attachFetchHandler(CloudflareWorkersFetchEvent handler) { } void attachScheduledHandler(CloudflareWorkersScheduledEvent handler) { - globalDartScheduledHandler = allowInterop((interop.ScheduledEvent event, - interop.Environment env, interop.ExecutionContext ctx) { + globalDartScheduledHandler = allowInterop( + (interop.ScheduledEvent event, interop.Environment env, interop.ExecutionContext ctx) { return futureToPromise(Future(() async { return handler( scheduledEventFromJsObject(event), @@ -79,8 +78,8 @@ void attachScheduledHandler(CloudflareWorkersScheduledEvent handler) { } void attachEmailHandler(CloudflareWorkersEmailEvent handler) { - globalDartEmailHandler = allowInterop((interop.EmailMessage message, - interop.Environment env, interop.ExecutionContext ctx) { + globalDartEmailHandler = allowInterop( + (interop.EmailMessage message, interop.Environment env, interop.ExecutionContext ctx) { return futureToPromise(Future(() async { return handler( emailMessageFromJsObject(message), @@ -94,8 +93,7 @@ void attachEmailHandler(CloudflareWorkersEmailEvent handler) { void attachDurableObjects(CloudflareWorkersDurableObjects instances) { globalDurableObjects = js_util.jsify({ for (final instance in instances.entries) - instance.key: allowInterop( - (interop.DurableObjectState state, interop.Environment env) { + instance.key: allowInterop((interop.DurableObjectState state, interop.Environment env) { final cls = instance.value(); // Attach the state and environment to the delegate. @@ -106,7 +104,7 @@ void attachDurableObjects(CloudflareWorkersDurableObjects instances) { // Call the instance fetch handler, and return the delegate request. delegate.fetch = allowInterop((interop.Request requestObj) { return futureToPromise(Future(() async { - final response = await cls.fetch(requestFromJsObject(requestObj)); + final response = await cls.fetch(requestObj); return response.delegate; })); }); diff --git a/packages/cloudflare_workers/lib/public/do/durable_object.dart b/packages/cloudflare_workers/lib/public/do/durable_object.dart index d841a07..69ab435 100644 --- a/packages/cloudflare_workers/lib/public/do/durable_object.dart +++ b/packages/cloudflare_workers/lib/public/do/durable_object.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:edge_runtime/src/request.dart'; +import 'package:typings/core.dart' show Request; import 'package:edge_runtime/src/response.dart'; import '../../interop/durable_object_interop.dart' as interop; @@ -10,8 +10,7 @@ import 'durable_object_state.dart'; abstract class DurableObject { final interop.DurableObject _delegate; - DurableObjectState get state => - durableObjectStateFromJsObject(_delegate.state); + DurableObjectState get state => durableObjectStateFromJsObject(_delegate.state); Environment get env => environmentFromJsObject(_delegate.env); diff --git a/packages/cloudflare_workers/lib/public/fetcher.dart b/packages/cloudflare_workers/lib/public/fetcher.dart index bbf5a8b..d0bde41 100644 --- a/packages/cloudflare_workers/lib/public/fetcher.dart +++ b/packages/cloudflare_workers/lib/public/fetcher.dart @@ -2,9 +2,8 @@ import 'dart:async'; import 'package:edge_runtime/src/abort.dart'; import 'package:edge_runtime/src/headers.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; -import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; import '../interop/durable_object_interop.dart' as interop; @@ -15,39 +14,34 @@ abstract class Fetcher { Fetcher(this._delegate); - Future fetch( - Request request, { - String? method, - Headers? headers, - Object? body, - String? referrer, - interop.ReferrerPolicy? referrerPolicy, - interop.RequestMode? mode, - interop.RequestCredentials? credentials, - interop.RequestCache? cache, - interop.RequestRedirect? redirect, - String? integrity, - bool? keepalive, - AbortSignal? signal, - interop.RequestDuplex? duplex, - }) async { + Future fetch(interop.Request request, + {String? method, + Headers? headers, + Object? body, + String? referrer, + interop.ReferrerPolicy? referrerPolicy, + interop.RequestMode? mode, + interop.RequestCredentials? credentials, + interop.RequestCache? cache, + interop.RequestRedirect? redirect, + String? integrity, + bool? keepalive, + AbortSignal? signal}) async { final response = await _delegate.fetch( - request.delegate, + request, interop.RequestInit( - method: method, - headers: headers?.delegate, - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal?.delegate, - duplex: duplex, - ), + method: method, + headers: headers?.delegate, + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal?.delegate), ); return responseFromJsObject(response); } diff --git a/packages/cloudflare_workers/lib/public/kv_namespace.dart b/packages/cloudflare_workers/lib/public/kv_namespace.dart index e9afca3..40ee969 100644 --- a/packages/cloudflare_workers/lib/public/kv_namespace.dart +++ b/packages/cloudflare_workers/lib/public/kv_namespace.dart @@ -50,8 +50,7 @@ class KVNamespace { return dartify(json) as Map; } - Future?>> - getJsonWithMetadata( + Future?>> getJsonWithMetadata( String name, { int? cacheTtl, }) async { @@ -114,8 +113,7 @@ class KVNamespace { return streamFromJSReader(reader); } - Future> - getStreamWithMetadata( + Future> getStreamWithMetadata( String name, { int? cacheTtl, }) async { @@ -162,8 +160,7 @@ class KVNamespace { ); } -KVNamespace kvNamespaceFromJsObject(interop.KVNamespace obj) => - KVNamespace._(obj); +KVNamespace kvNamespaceFromJsObject(interop.KVNamespace obj) => KVNamespace._(obj); class KVNamespaceGetWithMetadataResult { final interop.KVNamespaceGetWithMetadataResult _delegate; @@ -175,12 +172,10 @@ class KVNamespaceGetWithMetadataResult { class KVNamespaceListResult { final interop.KVNamespaceListResult _delegate; KVNamespaceListResult._(this._delegate); - Iterable get keys sync* { - // TODO fix me. - throw UnimplementedError('Returns a JsArray/List, but its not iterable?'); - for (var i = 0; i < _delegate.keys.length; i++) { - yield KVNamespaceListKey._(_delegate.keys[i]); - } + Iterable get keys { + return [ + for (int i = 0; i < _delegate.keys.length; i++) KVNamespaceListKey._(_delegate.keys[i]) + ]; } bool get listComplete => _delegate.listComplete; diff --git a/packages/cloudflare_workers/lib/public/request.dart b/packages/cloudflare_workers/lib/public/request.dart index e12e5fc..4fc7f65 100644 --- a/packages/cloudflare_workers/lib/public/request.dart +++ b/packages/cloudflare_workers/lib/public/request.dart @@ -1,10 +1,10 @@ -import 'package:edge_runtime/src/request.dart'; +import 'package:edge_runtime/edge_runtime.dart' show Request; import '../interop/request_interop.dart' as interop; extension CloudflareWorkersRequestExtension on Request { IncomingRequestCfProperties get cf => - IncomingRequestCfProperties._(delegate.cf); + IncomingRequestCfProperties._(interop.CloudflareWorkersRequestInteropExtension(this).cf); } class IncomingRequestCfProperties { diff --git a/packages/cloudflare_workers/lib/public/socket.dart b/packages/cloudflare_workers/lib/public/socket.dart index 261a145..f6a8ef6 100644 --- a/packages/cloudflare_workers/lib/public/socket.dart +++ b/packages/cloudflare_workers/lib/public/socket.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import '../interop/durable_object_interop.dart' as interop; class Socket { diff --git a/packages/cloudflare_workers/lib/public/top.dart b/packages/cloudflare_workers/lib/public/top.dart index dd9c6bf..73fb695 100644 --- a/packages/cloudflare_workers/lib/public/top.dart +++ b/packages/cloudflare_workers/lib/public/top.dart @@ -5,45 +5,39 @@ import 'package:edge_runtime/src/headers.dart'; import 'package:edge_runtime/src/response.dart'; import 'package:edge_runtime/src/abort.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'package:edge_runtime/src/interop/utils_interop.dart' as interop; -import 'package:edge_runtime/src/interop/scope_interop.dart' as interop; import '../interop/request_init_interop.dart' as interop; import 'request_init.dart'; -Future fetch( - Resource resource, { - CloudflareRequestInit? cf, - String? method, - Headers? headers, - Object? body, - String? referrer, - interop.ReferrerPolicy? referrerPolicy, - interop.RequestMode? mode, - interop.RequestCredentials? credentials, - interop.RequestCache? cache, - interop.RequestRedirect? redirect, - String? integrity, - bool? keepalive, - AbortSignal? signal, - interop.RequestDuplex? duplex, -}) async { +Future fetch(Resource resource, + {CloudflareRequestInit? cf, + String? method, + Headers? headers, + Object? body, + String? referrer, + interop.ReferrerPolicy? referrerPolicy, + interop.RequestMode? mode, + interop.RequestCredentials? credentials, + interop.RequestCache? cache, + interop.RequestRedirect? redirect, + String? integrity, + bool? keepalive, + AbortSignal? signal}) async { final init = interop.RequestInit( - method: method, - headers: headers?.delegate, - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal?.delegate, - duplex: duplex, - ); + method: method, + headers: headers?.delegate, + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal?.delegate); // Attach the non-standard Cloudflare properties to the Request Init object. if (cf != null) { diff --git a/packages/cloudflare_workers/pubspec.yaml b/packages/cloudflare_workers/pubspec.yaml index a62aa14..d806886 100644 --- a/packages/cloudflare_workers/pubspec.yaml +++ b/packages/cloudflare_workers/pubspec.yaml @@ -10,8 +10,8 @@ environment: dependencies: edge: ^0.0.7 edge_runtime: ^0.0.4+2 - js_bindings: ^0.1.0 js: ^0.6.5 + typings: ^0.0.3 dev_dependencies: lints: ^2.0.0 diff --git a/packages/cloudflare_workers/test/_playground.dart b/packages/cloudflare_workers/test/_playground.dart index 3c24b4e..2543a42 100644 --- a/packages/cloudflare_workers/test/_playground.dart +++ b/packages/cloudflare_workers/test/_playground.dart @@ -1,17 +1,15 @@ -import 'dart:async'; - import 'package:cloudflare_workers/cloudflare_workers.dart'; void main() { -CloudflareWorkers( - fetch: (request, env, ctx) async { - try { - final KV = env.getKVNamespace('TEST_KV'); - final res = await KV.getWithMetadata('foo'); - return Response(res.metadata, status: 200); - } catch (e) { - return Response(e.toString(), status: 500); - } - }, -); + CloudflareWorkers( + fetch: (request, env, ctx) async { + try { + final kv = env.getKVNamespace('TEST_KV'); + final res = await kv.getWithMetadata('foo'); + return Response(res.metadata, status: 200); + } catch (e) { + return Response(e.toString(), status: 500); + } + }, + ); } diff --git a/packages/deno_deploy/lib/src/interop/deno_interop.dart b/packages/deno_deploy/lib/src/interop/deno_interop.dart index 6c838b5..4db318e 100644 --- a/packages/deno_deploy/lib/src/interop/deno_interop.dart +++ b/packages/deno_deploy/lib/src/interop/deno_interop.dart @@ -3,7 +3,7 @@ import 'dart:typed_data'; import 'package:js/js.dart'; import 'dart:js_util' as js_util; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'package:edge_runtime/src/interop/utils_interop.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; import 'package:edge_runtime/src/interop/iterator_interop.dart'; @@ -18,12 +18,11 @@ class Env { extension PropsEnv on Env { String? get(String key) => js_util.callMethod(this, 'get', [key]); - void set(String key, String value) => - js_util.callMethod(this, 'set', [key, value]); + void set(String key, String value) => js_util.callMethod(this, 'set', [key, value]); void delete(String key) => js_util.callMethod(this, 'delete', [key]); bool has(String key) => js_util.callMethod(this, 'has', [key]); - Map toObject() => Map.from( - dartify(js_util.callMethod(this, 'toObject', []))); + Map toObject() => + Map.from(dartify(js_util.callMethod(this, 'toObject', []))); } @JS() diff --git a/packages/deno_deploy/pubspec.yaml b/packages/deno_deploy/pubspec.yaml index 7ac9185..b3b8b85 100644 --- a/packages/deno_deploy/pubspec.yaml +++ b/packages/deno_deploy/pubspec.yaml @@ -9,5 +9,5 @@ environment: dependencies: js: ^0.6.5 - js_bindings: ^0.1.0 - edge_runtime: ^0.0.4+2 \ No newline at end of file + edge_runtime: ^0.0.4+2 + typings: ^0.0.3 diff --git a/packages/edge_http_client/test/http_client_test.dart b/packages/edge_http_client/test/http_client_test.dart index 3de1a2d..01b2bf6 100644 --- a/packages/edge_http_client/test/http_client_test.dart +++ b/packages/edge_http_client/test/http_client_test.dart @@ -12,7 +12,7 @@ Future Function() run(Future Function() fn) { void main() { group('package:http Client', () { - group('perfroms GET request', () { + group('performs GET request', () { test('without body', run(() async { final Uri uri = Uri.parse('http://localhost:3001/200'); final res = await http.get(uri); diff --git a/packages/edge_runtime/lib/edge_runtime.dart b/packages/edge_runtime/lib/edge_runtime.dart index 5138f2e..8be509e 100644 --- a/packages/edge_runtime/lib/edge_runtime.dart +++ b/packages/edge_runtime/lib/edge_runtime.dart @@ -2,37 +2,35 @@ import 'dart:js'; export 'dart:async' show FutureOr; -export 'src/top.dart'; +export 'package:typings/core.dart' + show + ReferrerPolicy, + ResponseType, + RequestCache, + RequestCredentials, + RequestDestination, + RequestMode, + RequestRedirect, + Request, + RequestInit, + Request$Typings, + RequestInit$Typings; export 'src/abort.dart' show AbortController, AbortSignal; export 'src/blob.dart' show Blob, BlobPropertyBag; -export 'src/cache/cache_query_options.dart' - show CacheQueryOptions, MultiCacheQueryOptions; -export 'src/cache/cache_storage.dart' show CacheStorage, caches; export 'src/cache/cache.dart' show Cache; +export 'src/cache/cache_query_options.dart' show CacheQueryOptions, MultiCacheQueryOptions; +export 'src/cache/cache_storage.dart' show CacheStorage, caches; export 'src/fetch_event.dart' show FetchEvent; export 'src/file.dart' show File; export 'src/form_data.dart' show FormData, FormDataEntryValue; export 'src/headers.dart' show Headers; -export 'src/request.dart' show Request; +export 'src/io_http_client.dart'; export 'src/resource.dart' show Resource; export 'src/response.dart' show Response; -export 'src/text_decoder.dart' - show TextDecoder, TextDecodeOptions, TextDecoderOptions; +export 'src/text_decoder.dart' show TextDecoder, TextDecodeOptions, TextDecoderOptions; export 'src/text_encoder.dart' show TextEncoder, TextEncoderEncodeIntoResult; - -export 'src/io_http_client.dart'; - -export 'package:js_bindings/bindings/referrer_policy.dart' show ReferrerPolicy; -export 'package:js_bindings/bindings/fetch.dart' - show - ResponseType, - RequestDuplex, - RequestCache, - RequestCredentials, - RequestDestination, - RequestMode, - RequestRedirect; +export 'src/top.dart'; /// This should be called before any other platform code is run. void setupRuntime() { diff --git a/packages/edge_runtime/lib/src/abort.dart b/packages/edge_runtime/lib/src/abort.dart index 910acb0..1b11ebc 100644 --- a/packages/edge_runtime/lib/src/abort.dart +++ b/packages/edge_runtime/lib/src/abort.dart @@ -1,6 +1,6 @@ import 'dart:js_util' show jsify; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import './interop/utils_interop.dart'; class AbortController { @@ -8,8 +8,7 @@ class AbortController { AbortController() : _delegate = interop.AbortController(); AbortSignal get signal => AbortSignal._(_delegate.signal); - void abort([Object? reason]) => - _delegate.abort(reason != null ? jsify(reason) : jsUndefined); + void abort([Object? reason]) => _delegate.abort(reason != null ? jsify(reason) : jsUndefined); } class AbortSignal { diff --git a/packages/edge_runtime/lib/src/blob.dart b/packages/edge_runtime/lib/src/blob.dart index 0664652..99075ba 100644 --- a/packages/edge_runtime/lib/src/blob.dart +++ b/packages/edge_runtime/lib/src/blob.dart @@ -2,9 +2,7 @@ import 'dart:js_util'; import 'dart:typed_data'; import 'package:edge_runtime/src/interop/readable_stream.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; - -export 'package:js_bindings/js_bindings.dart' show EndingType; +import 'package:typings/core.dart' as interop; class Blob { final interop.Blob _delegate; @@ -13,11 +11,11 @@ class Blob { Blob([Iterable? blobParts, BlobPropertyBag? options]) : _delegate = interop.Blob( - blobParts, + blobParts?.toList() as List?, options?.delegate ?? interop.BlobPropertyBag(), ); - int get size => _delegate.size; + int get size => _delegate.size as int; String get type => _delegate.type; Blob slice([int? start, int? end, String? contentType]) { diff --git a/packages/edge_runtime/lib/src/cache/cache.dart b/packages/edge_runtime/lib/src/cache/cache.dart index fe762df..bf9959d 100644 --- a/packages/edge_runtime/lib/src/cache/cache.dart +++ b/packages/edge_runtime/lib/src/cache/cache.dart @@ -1,9 +1,8 @@ import 'dart:js_util'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import '../interop/utils_interop.dart' as interop; -import '../request.dart'; import '../response.dart'; import 'cache_query_options.dart'; @@ -12,39 +11,37 @@ class Cache { Cache._(this._delegate); - Future add(Request request) async { - await _delegate.add(request.delegate); + Future add(interop.Request request) async { + await _delegate.add(request); } - Future addAll(Iterable requests) async { - await _delegate.addAll(requests.map((r) => r.delegate).toList()); + Future addAll(Iterable requests) async { + await _delegate.addAll(requests.toList()); } - Future delete(Request request, - [MultiCacheQueryOptions? options]) async { - await _delegate.delete(request.delegate, options?.delegate); + Future delete(interop.Request request, [MultiCacheQueryOptions? options]) async { + await _delegate.delete(request, options?.delegate); } - Future match(Request request, [CacheQueryOptions? options]) async { - final obj = await promiseToFuture( - _delegate.match(request.delegate, options?.delegate)); + Future match(interop.Request request, [CacheQueryOptions? options]) async { + final obj = await promiseToFuture(_delegate.match(request, options?.delegate)); return obj == null ? null : responseFromJsObject(obj); } Future> matchAll( - [Request? request, CacheQueryOptions? options]) async { + [interop.Request? request, CacheQueryOptions? options]) async { final matches = await _delegate.matchAll( - request?.delegate ?? interop.jsUndefined, + request ?? interop.jsUndefined, options?.delegate, ); - return matches.map((obj) => responseFromJsObject(obj)); + return matches.map((obj, _, __) => responseFromJsObject(obj)); } Future put( - Request request, + interop.Request request, Response response, ) async { - return _delegate.put(request.delegate, response.delegate); + return _delegate.put(request, response.delegate); } } diff --git a/packages/edge_runtime/lib/src/cache/cache_query_options.dart b/packages/edge_runtime/lib/src/cache/cache_query_options.dart index 3b72871..f47808f 100644 --- a/packages/edge_runtime/lib/src/cache/cache_query_options.dart +++ b/packages/edge_runtime/lib/src/cache/cache_query_options.dart @@ -1,4 +1,4 @@ -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; class CacheQueryOptions { bool? ignoreSearch; diff --git a/packages/edge_runtime/lib/src/cache/cache_storage.dart b/packages/edge_runtime/lib/src/cache/cache_storage.dart index 60fdc5f..fdb86f1 100644 --- a/packages/edge_runtime/lib/src/cache/cache_storage.dart +++ b/packages/edge_runtime/lib/src/cache/cache_storage.dart @@ -1,8 +1,7 @@ import 'dart:js_util'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop hide caches; import '../interop/cache_interop.dart' as interop; -import '../request.dart'; import '../response.dart'; import 'cache.dart'; import 'cache_query_options.dart'; @@ -26,10 +25,9 @@ class CacheStorage { return _delegate.keys(); } - Future match(Request request, - [MultiCacheQueryOptions? options]) async { - final obj = await promiseToFuture( - _delegate.match(request.delegate, options?.delegate)); + Future match(interop.Request request, [MultiCacheQueryOptions? options]) async { + final obj = + await promiseToFuture(_delegate.match(request, options?.delegate)); return obj == null ? null : responseFromJsObject(obj); } diff --git a/packages/edge_runtime/lib/src/crypto.dart b/packages/edge_runtime/lib/src/crypto.dart index f55e5ee..ef24cd9 100644 --- a/packages/edge_runtime/lib/src/crypto.dart +++ b/packages/edge_runtime/lib/src/crypto.dart @@ -1,11 +1,8 @@ import 'dart:typed_data'; -import 'package:js_bindings/js_bindings.dart' as interop; -import 'interop/crypto_interop.dart' as interop; +import 'package:typings/core.dart' as interop; -export 'package:js_bindings/js_bindings.dart' show KeyFormat, KeyType; - -final crypto = Crypto._(interop.crypto); +final crypto = Crypto._(interop.crypto.call()); class Crypto { final interop.Crypto _delegate; @@ -15,7 +12,7 @@ class Crypto { SubtleCrypto get subtle => SubtleCrypto._(_delegate.subtle); // TODO Is this the right way to do this? - TypedData getRandomValues(TypedData typedArray) => + interop.ArrayBufferView getRandomValues(interop.ArrayBufferView typedArray) => _delegate.getRandomValues(typedArray); String randomUUID() => _delegate.randomUUID(); @@ -31,21 +28,11 @@ class SubtleCrypto { CryptoKey key, dynamic data, ) { - final obj = _delegate.encrypt(algorithm._delegate, key._delegate, data); - throw UnimplementedError('TODO - how to handle return type?'); + return _delegate.encrypt(algorithm._delegate, key._delegate, data); + // TODO - how to handle return type? } - // TODO decrypt - // TODO sign - // TODO verify - // TODO digest - // TODO generateKey - // TODO deriveKey - // TODO deriveBits - // TODO importKey - // TODO exportKey - // TODO wrapKey - // TODO unwrapKey + // TODO decrypt, sign, verify, digest, generateKey, deriveKey, deriveBits, importKey, exportKey, wrapKey, unwrapKey } abstract class Algorithm { @@ -57,17 +44,14 @@ abstract class Algorithm { class RsaOaepParams extends Algorithm { final interop.RsaOaepParams _rsaDelegate; - RsaOaepParams._(this._rsaDelegate) - : super._(interop.Algorithm(name: 'RSA-OAEP')); + RsaOaepParams._(this._rsaDelegate) : super._(interop.Algorithm(name: 'RSA-OAEP')); factory RsaOaepParams({ ByteBuffer? label, }) => - RsaOaepParams._(interop.RsaOaepParams( - label: label, - )); + RsaOaepParams._(interop.RsaOaepParams(label: label, name: "RSA-OAEP")); - ByteBuffer? get label => _rsaDelegate.label; + ByteBuffer? get label => _rsaDelegate.label as interop.ArrayBufferLike; set label(ByteBuffer? value) => _rsaDelegate.label = value; } @@ -78,5 +62,5 @@ class CryptoKey { interop.KeyType get type => _delegate.type; bool get extractable => _delegate.extractable; - List get usages => _delegate.usages; + List get usages => _delegate.usages; } diff --git a/packages/edge_runtime/lib/src/fetch_event.dart b/packages/edge_runtime/lib/src/fetch_event.dart index e524e22..3e2213c 100644 --- a/packages/edge_runtime/lib/src/fetch_event.dart +++ b/packages/edge_runtime/lib/src/fetch_event.dart @@ -1,24 +1,19 @@ import 'dart:js_util' as js_util; import 'dart:async'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:edge_runtime/edge_runtime.dart' as interop; import 'interop/promise_interop.dart'; -import 'interop/scope_interop.dart'; -import 'request.dart'; -import 'response.dart'; class FetchEvent { final interop.FetchEvent _delegate; FetchEvent._(this._delegate); String get type => _delegate.type; - Request get request => requestFromJsObject(_delegate.request); + interop.Request get request => _delegate.request; - void respondWith(FutureOr response) { - return _delegate.respondWithPromise(Future(() async { - return (await response).delegate; - })); + void respondWith(FutureOr response) { + return _delegate.respondWithPromise(Future.value(response)); } void waitUntil(FutureOr future) { diff --git a/packages/edge_runtime/lib/src/file.dart b/packages/edge_runtime/lib/src/file.dart index 9813c1f..6350dc2 100644 --- a/packages/edge_runtime/lib/src/file.dart +++ b/packages/edge_runtime/lib/src/file.dart @@ -1,9 +1,9 @@ import 'dart:js_util'; import 'dart:typed_data'; -import 'package:edge_runtime/src/interop/readable_stream.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; +import './interop/readable_stream.dart'; import 'blob.dart'; class File implements Blob { @@ -12,7 +12,7 @@ class File implements Blob { File._(this._delegate); String get name => _delegate.name; - int get lastModified => _delegate.lastModified; + int get lastModified => _delegate.lastModified as int; String? get webkitRelativePath { try { return _delegate.webkitRelativePath; @@ -28,7 +28,7 @@ class File implements Blob { Future arrayBuffer() => _delegate.arrayBuffer(); @override - int get size => _delegate.size; + int get size => _delegate.size as int; @override Blob slice([int? start, int? end, String? contentType]) { diff --git a/packages/edge_runtime/lib/src/form_data.dart b/packages/edge_runtime/lib/src/form_data.dart index c2b70af..ad33bbb 100644 --- a/packages/edge_runtime/lib/src/form_data.dart +++ b/packages/edge_runtime/lib/src/form_data.dart @@ -1,5 +1,5 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'file.dart'; @@ -15,7 +15,7 @@ class FormData { value.when(file: (value) { throw UnimplementedError(); }, string: (value) { - _delegate.append( + _delegate.append.$3( name, interop.Blob( [value], @@ -59,7 +59,7 @@ class FormData { value.when(file: (value) { throw UnimplementedError(); }, string: (value) { - _delegate.set( + _delegate.set.$3( name, interop.Blob( [value], diff --git a/packages/edge_runtime/lib/src/headers.dart b/packages/edge_runtime/lib/src/headers.dart index 6a6e80f..8aa1406 100644 --- a/packages/edge_runtime/lib/src/headers.dart +++ b/packages/edge_runtime/lib/src/headers.dart @@ -1,13 +1,12 @@ import 'dart:js_util' show jsify; -import 'package:js_bindings/js_bindings.dart' as js_bindings; +import 'package:typings/core.dart' as js_interop; import 'interop/headers.dart' as interop; class Headers { final interop.Headers _delegate; - Headers([Map? headers]) - : _delegate = interop.Headers(jsify(headers ?? {})); + Headers([Map? headers]) : _delegate = interop.Headers(jsify(headers ?? {})); Headers._(this._delegate); @@ -28,7 +27,7 @@ class Headers { Iterable get values => _delegate.values; Map toMap() => _delegate.toMap(); - js_bindings.Headers toJsBindingsHeaders() => _delegate as js_bindings.Headers; + js_interop.Headers toJsBindingsHeaders() => _delegate as js_interop.Headers; } extension HeadersExtension on Headers { diff --git a/packages/edge_runtime/lib/src/interop/cache_interop.dart b/packages/edge_runtime/lib/src/interop/cache_interop.dart index 684582e..c9d888d 100644 --- a/packages/edge_runtime/lib/src/interop/cache_interop.dart +++ b/packages/edge_runtime/lib/src/interop/cache_interop.dart @@ -1,5 +1,5 @@ import 'package:js/js.dart' as js; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; @js.JS('caches') external interop.CacheStorage get caches; diff --git a/packages/edge_runtime/lib/src/interop/crypto_interop.dart b/packages/edge_runtime/lib/src/interop/crypto_interop.dart deleted file mode 100644 index 9de6264..0000000 --- a/packages/edge_runtime/lib/src/interop/crypto_interop.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:js/js.dart' as js; -import 'package:js_bindings/js_bindings.dart' as interop; - -@js.JS('crypto') -external interop.Crypto get crypto; diff --git a/packages/edge_runtime/lib/src/interop/scope_interop.dart b/packages/edge_runtime/lib/src/interop/scope_interop.dart index 48f2cf3..a03e29e 100644 --- a/packages/edge_runtime/lib/src/interop/scope_interop.dart +++ b/packages/edge_runtime/lib/src/interop/scope_interop.dart @@ -1,12 +1,12 @@ import 'package:js/js.dart' as js; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'promise_interop.dart'; @js.JS() external void addEventListener( String type, - void Function(interop.ExtendableEvent event) callback, + void Function(interop.Event event) callback, ); @js.JS('fetch') diff --git a/packages/edge_runtime/lib/src/interop/utils_interop.dart b/packages/edge_runtime/lib/src/interop/utils_interop.dart index 896d43e..daa6dc7 100644 --- a/packages/edge_runtime/lib/src/interop/utils_interop.dart +++ b/packages/edge_runtime/lib/src/interop/utils_interop.dart @@ -1,10 +1,9 @@ import 'dart:js_util' as js_util; import 'package:js/js.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import '../resource.dart'; -import '../request.dart'; interop.Request requestFromResource(Resource resource) { switch (resource.runtimeType) { @@ -13,7 +12,7 @@ interop.Request requestFromResource(Resource resource) { case UriValue: return interop.Request((resource as UriValue).uri.toString()); case RequestValue: - return (resource as RequestValue).request.delegate; + return (resource as RequestValue).request; default: throw Exception('Unknown resource type ${resource.runtimeType}'); } diff --git a/packages/edge_runtime/lib/src/io_http_client.dart b/packages/edge_runtime/lib/src/io_http_client.dart index 4593cec..d9e0110 100644 --- a/packages/edge_runtime/lib/src/io_http_client.dart +++ b/packages/edge_runtime/lib/src/io_http_client.dart @@ -61,8 +61,7 @@ class HttpClient implements io.HttpClient { int port, String scheme, String? realm, - )? - f, + )? f, ) { // TODO: implement authenticateProxy } @@ -87,8 +86,7 @@ class HttpClient implements io.HttpClient { Uri url, String? proxyHost, int? proxyPort, - )? - f, + )? f, ) { throw UnsupportedError(kUnsupportedEnv); } @@ -568,14 +566,12 @@ class HttpClientResponse implements io.HttpClientResponse { headers = HttpHeaders.fromFetchResponseHeaders(_response.headers); _body = _response.body ?? Stream.empty(); - final contentLengthHeader = - headers.value(io.HttpHeaders.contentLengthHeader); + final contentLengthHeader = headers.value(io.HttpHeaders.contentLengthHeader); contentLength = int.parse(contentLengthHeader ?? '-1'); } @override - io.X509Certificate? get certificate => - throw UnsupportedError(kUnsupportedEnv); + io.X509Certificate? get certificate => throw UnsupportedError(kUnsupportedEnv); @override io.HttpClientResponseCompressionState get compressionState { diff --git a/packages/edge_runtime/lib/src/request.dart b/packages/edge_runtime/lib/src/request.dart deleted file mode 100644 index ff2ac37..0000000 --- a/packages/edge_runtime/lib/src/request.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'dart:js_util'; -import 'dart:typed_data'; - -import 'abort.dart'; -import 'blob.dart'; -import 'body.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; -import 'interop/readable_stream.dart'; -import 'interop/utils_interop.dart' as interop; -import 'interop/headers.dart' as headers_interop; - -import 'form_data.dart'; -import 'headers.dart'; -import 'resource.dart'; - -class Request implements Body { - final interop.Request _delegate; - - Request._(this._delegate); - - Request( - Resource resource, { - String? method, - Headers? headers, - Object? body, - String? referrer, - interop.ReferrerPolicy? referrerPolicy, - interop.RequestMode? mode, - interop.RequestCredentials? credentials, - interop.RequestCache? cache, - interop.RequestRedirect? redirect, - String? integrity, - bool? keepalive, - AbortSignal? signal, - interop.RequestDuplex? duplex, - }) : _delegate = interop.Request( - interop.requestFromResource(resource), - interop.RequestInit( - method: method, - headers: headers?.delegate, - // TODO(lesnitsky): support streams - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal?.delegate, - duplex: duplex, - ), - ); - - String get method => _delegate.method; - Uri get url => Uri.parse(_delegate.url); - Headers get headers { - return headersFromJsObject( - getProperty(_delegate, 'headers'), - ); - } - - interop.RequestDestination get destination => _delegate.destination; - String get referrer => _delegate.referrer; - interop.ReferrerPolicy get referrerPolicy => _delegate.referrerPolicy; - interop.RequestMode get mode => _delegate.mode; - interop.RequestCredentials get credentials => _delegate.credentials; - interop.RequestCache get cache => _delegate.cache; - interop.RequestRedirect get redirect => _delegate.redirect; - String get integrity => _delegate.integrity; - bool get keepalive => _delegate.keepalive; - AbortSignal get signal => abortSignalToJsObject(_delegate.signal); - Request clone() => Request._(_delegate.clone()); - - @override - Future arrayBuffer() => _delegate.arrayBuffer(); - - @override - Future blob() async => blobFromJsObject(await _delegate.blob()); - - ReadableStreamDefaultReader? _reader; - - Stream>? get body { - final body = getProperty(_delegate, 'body'); - if (body == null) return null; - - if (_reader == null) { - _reader = body.getReader(); - } - - return streamFromJSReader(_reader!); - } - - @override - bool get bodyUsed => _delegate.bodyUsed; - - @override - Future formData() async => - formDataFromJsObject(await _delegate.formData()); - - @override - Future json() async => - // ignore: unnecessary_cast, Dart issue - interop.dartify(await (_delegate as interop.Body).json()); - - @override - Future text() => _delegate.text(); -} - -extension RequestExtension on Request { - interop.Request get delegate => _delegate; -} - -Request requestFromJsObject(interop.Request request) => Request._(request); diff --git a/packages/edge_runtime/lib/src/resource.dart b/packages/edge_runtime/lib/src/resource.dart index 925916f..61eb942 100644 --- a/packages/edge_runtime/lib/src/resource.dart +++ b/packages/edge_runtime/lib/src/resource.dart @@ -1,4 +1,4 @@ -import 'request.dart'; +import 'package:typings/core.dart'; abstract class Resource { const factory Resource(String url) = StringValue; @@ -11,7 +11,7 @@ abstract class Resource { } else if (resource is UriValue) { return resource.uri; } else { - return (resource as RequestValue).request.url; + return Uri.parse((resource as RequestValue).request.url); } } } diff --git a/packages/edge_runtime/lib/src/response.dart b/packages/edge_runtime/lib/src/response.dart index 142a69a..40bcb7b 100644 --- a/packages/edge_runtime/lib/src/response.dart +++ b/packages/edge_runtime/lib/src/response.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'dart:js_util' show jsify, getProperty; import 'dart:typed_data'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import './utils.dart'; import 'blob.dart'; @@ -49,7 +49,7 @@ class Response implements Body { Headers? headers, }) { return Response._( - interop.Response.json( + interop.Response( data != null ? jsify(data) : null, interop.ResponseInit( status: status ?? 200, @@ -63,7 +63,7 @@ class Response implements Body { interop.ResponseType get type => _delegate.type; Uri get url => Uri.parse(_delegate.url); bool get redirected => _delegate.redirected; - int get status => _delegate.status; + int get status => _delegate.status as int; bool get ok => _delegate.ok; String get statusText => _delegate.statusText; Headers get headers { @@ -89,8 +89,7 @@ class Response implements Body { bool get bodyUsed => _delegate.bodyUsed; @override - Future formData() async => - formDataFromJsObject(await _delegate.formData()); + Future formData() async => formDataFromJsObject(await _delegate.formData()); @override Future json() async { diff --git a/packages/edge_runtime/lib/src/text_decoder.dart b/packages/edge_runtime/lib/src/text_decoder.dart index 87c7012..abfb217 100644 --- a/packages/edge_runtime/lib/src/text_decoder.dart +++ b/packages/edge_runtime/lib/src/text_decoder.dart @@ -1,11 +1,9 @@ -import 'dart:typed_data' show Uint8List; - -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; class TextDecoder { final interop.TextDecoder _delegate; - TextDecoder._(this._delegate); + // TextDecoder._(this._delegate); // TODO: What happens if label is null? do we need to use undefined? TextDecoder([String? label, TextDecoderOptions? options]) @@ -29,13 +27,13 @@ class TextDecoderOptions { TextDecoderOptions._(this._delegate); - bool get fatal => _delegate.fatal; + bool get fatal => _delegate.fatal ?? false; set fatal(bool newValue) { _delegate.fatal = newValue; } - bool get ignoreBOM => _delegate.ignoreBOM; + bool get ignoreBOM => _delegate.ignoreBOM ?? false; set ignoreBOM(bool newValue) { _delegate.ignoreBOM = newValue; diff --git a/packages/edge_runtime/lib/src/text_encoder.dart b/packages/edge_runtime/lib/src/text_encoder.dart index 607bb88..3118aa9 100644 --- a/packages/edge_runtime/lib/src/text_encoder.dart +++ b/packages/edge_runtime/lib/src/text_encoder.dart @@ -1,6 +1,6 @@ import 'dart:typed_data' show Uint8List; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; class TextEncoder { final interop.TextEncoder _delegate; @@ -21,21 +21,20 @@ extension TextEncoderExtension on TextEncoder { interop.TextEncoder get delegate => _delegate; } -TextEncoder textEncoderFromJsObject(interop.TextEncoder jsObject) => - TextEncoder._(jsObject); +TextEncoder textEncoderFromJsObject(interop.TextEncoder jsObject) => TextEncoder._(jsObject); class TextEncoderEncodeIntoResult { final interop.TextEncoderEncodeIntoResult _delegate; TextEncoderEncodeIntoResult._(this._delegate); - int get read => _delegate.read; + int get read => _delegate.read as int? ?? 0; set read(int newValue) { _delegate.read = newValue; } - int get written => _delegate.written; + int get written => _delegate.written as int? ?? 0; set written(int newValue) { _delegate.written = newValue; @@ -46,6 +45,5 @@ extension TextEncoderEncodeIntoResultExtension on TextEncoderEncodeIntoResult { interop.TextEncoderEncodeIntoResult get delegate => _delegate; } -TextEncoder textEncoderEncodeIntoResultFromJsObject( - interop.TextEncoder jsObject) => +TextEncoder textEncoderEncodeIntoResultFromJsObject(interop.TextEncoder jsObject) => TextEncoder._(jsObject); diff --git a/packages/edge_runtime/lib/src/top.dart b/packages/edge_runtime/lib/src/top.dart index b4232a7..60813bb 100644 --- a/packages/edge_runtime/lib/src/top.dart +++ b/packages/edge_runtime/lib/src/top.dart @@ -1,50 +1,44 @@ import 'dart:js' as js; import 'dart:js_util'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop hide AbortSignal; + import 'abort.dart'; import 'headers.dart'; -import 'interop/scope_interop.dart' as interop; import 'interop/utils_interop.dart' as interop; - import 'resource.dart'; import 'response.dart'; -Future fetch( - Resource resource, { - String? method, - Headers? headers, - Object? body, - String? referrer, - interop.ReferrerPolicy? referrerPolicy, - interop.RequestMode? mode, - interop.RequestCredentials? credentials, - interop.RequestCache? cache, - interop.RequestRedirect? redirect, - String? integrity, - bool? keepalive, - AbortSignal? signal, - interop.RequestDuplex? duplex, -}) async { +Future fetch(Resource resource, + {String? method, + Headers? headers, + Object? body, + String? referrer, + interop.ReferrerPolicy? referrerPolicy, + interop.RequestMode? mode, + interop.RequestCredentials? credentials, + interop.RequestCache? cache, + interop.RequestRedirect? redirect, + String? integrity, + bool? keepalive, + AbortSignal? signal}) async { return responseFromJsObject( await promiseToFuture( interop.fetch( interop.requestFromResource(resource), interop.RequestInit( - method: method, - headers: headers?.delegate, - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal?.delegate, - duplex: duplex, - ), + method: method, + headers: headers?.delegate, + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal?.delegate), ), ), ); @@ -55,11 +49,11 @@ String atob(String encodedData) => interop.atob(encodedData); String btoa(String stringToEncode) => interop.btoa(stringToEncode); int setInterval(void Function() callback, Duration duration) => - interop.setInterval(js.allowInterop(callback), duration.inMilliseconds); + interop.setInterval(js.allowInterop(callback), duration.inMilliseconds) as int; void clearInterval(int handle) => interop.clearInterval(handle); int setTimeout(void Function() callback, Duration duration) => - interop.setTimeout(js.allowInterop(callback), duration.inMilliseconds); + interop.setTimeout(js.allowInterop(callback), duration.inMilliseconds) as int; void clearTimeout(int handle) => interop.clearTimeout(handle); diff --git a/packages/edge_runtime/pubspec.yaml b/packages/edge_runtime/pubspec.yaml index 55c09a2..6ce17e5 100644 --- a/packages/edge_runtime/pubspec.yaml +++ b/packages/edge_runtime/pubspec.yaml @@ -5,12 +5,12 @@ repository: https://github.com/invertase/dart_edge/tree/main/packages/edge_runti version: 0.0.4+2 environment: - sdk: ">=2.18.5 <3.0.0" + sdk: ">3.1.0 <4.0.0" dependencies: freezed_annotation: ^2.2.0 js: ^0.6.5 - js_bindings: ^0.1.0 + typings: ^0.0.3 dev_dependencies: build_runner: ^2.3.3 @@ -19,4 +19,4 @@ dev_dependencies: test: ^1.16.0 shelf: ^1.4.0 shelf_router: ^1.1.3 - http: ^0.13.0 + http: ^1.1.0 diff --git a/packages/edge_runtime/test/cache_test.dart b/packages/edge_runtime/test/cache_test.dart index b5dff7f..b18187d 100644 --- a/packages/edge_runtime/test/cache_test.dart +++ b/packages/edge_runtime/test/cache_test.dart @@ -24,12 +24,11 @@ void main() { expect(await caches.has('exists'), isFalse); }); - // TODO: keys() api not working - // test('.keys()', () async { - // await caches.open('one'); - // await caches.open('two'); - // expect(await caches.keys(), ['one', 'two']); - // }); + test('.keys()', () async { + await caches.open('one'); + await caches.open('two'); + expect(await caches.keys(), ['one', 'two']); + }); test('.match()', () async { final request = Request(Resource('https://foo.com')); @@ -78,17 +77,16 @@ void main() { expect(await cache.match(request), isNotNull); }); - // TODO matchAll() api not working - // test('.matchAll()', () async { - // final request = serverRequest('/200'); - // final cache = await caches.open('matchAll'); - // expect(await cache.matchAll(), isEmpty); - // await cache.add(request); - // expect(await cache.matchAll(), isNotEmpty); - // final matches = await cache.matchAll(request); - // expect(await cache.matchAll(request), isNotEmpty); - // expect(matches.first.url.path, '/200'); - // }); + test('.matchAll()', () async { + final request = serverRequest('/200'); + final cache = await caches.open('matchAll'); + expect(await cache.matchAll(), isEmpty); + await cache.add(request); + expect(await cache.matchAll(), isNotEmpty); + final matches = await cache.matchAll(request); + expect(await cache.matchAll(request), isNotEmpty); + expect(matches.first.url.path, '/200'); + }); test('.put()', () async { final request = serverRequest('/200'); diff --git a/packages/edge_runtime/test/fetch_test.dart b/packages/edge_runtime/test/fetch_test.dart index b9ceaf8..76e84b3 100644 --- a/packages/edge_runtime/test/fetch_test.dart +++ b/packages/edge_runtime/test/fetch_test.dart @@ -1,5 +1,4 @@ import 'package:test/test.dart'; -import 'package:edge_runtime/edge_runtime.dart'; import 'utils.dart'; diff --git a/packages/edge_runtime/test/headers_test.dart b/packages/edge_runtime/test/headers_test.dart index 3931759..6cd7fa6 100644 --- a/packages/edge_runtime/test/headers_test.dart +++ b/packages/edge_runtime/test/headers_test.dart @@ -18,11 +18,10 @@ void main() { expect(headers['foo'], 'bar, baz'); }); - // TODO: See https://github.com/jodinathan/js_bindings/issues/24 - // test('.keys()', () { - // final headers = Headers({'foo': 'bar'}); - // expect(headers.keys().toList(), ['foo']); - // }); + test('.keys()', () { + final headers = Headers({'foo': 'bar'}); + expect(headers.keys.toList(), ['foo']); + }); test('.delete()', () { final headers = Headers({'foo': 'bar'})..delete('foo'); diff --git a/packages/edge_runtime/test/request_test.dart b/packages/edge_runtime/test/request_test.dart index de003d1..e2170f7 100644 --- a/packages/edge_runtime/test/request_test.dart +++ b/packages/edge_runtime/test/request_test.dart @@ -1,6 +1,9 @@ import 'package:edge_runtime/edge_runtime.dart'; import 'package:test/test.dart'; +import 'package:typings/core.dart' + hide Headers, AbortSignal; // TODO export the needed types from edge_runtime itself + void main() { group('Request', () { test('.method', () { @@ -12,9 +15,9 @@ void main() { reason: 'The default method is should be GET', ); - expect(Request(resource, method: 'GET').method, 'GET'); - expect(Request(resource, method: 'POST').method, 'POST'); - expect(Request(resource, method: 'OPTIONS').method, 'OPTIONS'); + expect(Request(resource, RequestInit(method: 'GET')).method, 'GET'); + expect(Request(resource, RequestInit(method: 'POST')).method, 'POST'); + expect(Request(resource, RequestInit(method: 'OPTIONS')).method, 'OPTIONS'); }); test('.url', () { @@ -23,7 +26,7 @@ void main() { final resource = Resource.uri(uri); expect(Request(resource).url, uri); - expect(Request(Resource('https://foo.com?foo=bar')).url.queryParameters, { + expect(Uri.parse(Request(Resource('https://foo.com?foo=bar')).url).queryParameters, { 'foo': 'bar', }); }); @@ -33,12 +36,13 @@ void main() { Resource( 'https://foo.com', ), - headers: Headers({ + RequestInit( + headers: Headers({ 'foo': 'bar', - }), + })), ); - expect(request.headers['foo'], 'bar'); + expect(request.headers.get('foo'), 'bar'); }); test('.destination', () { @@ -48,63 +52,70 @@ void main() { test('.destination', () { final request = Request( - Resource('https://foo.com'), - referrer: 'https://example.com', - ); + Resource('https://foo.com'), + RequestInit( + referrer: 'https://example.com', + )); expect(request.referrer.isNotEmpty, true); }); test('.referrerPolicy', () { final request = Request( - Resource('https://foo.com'), - referrerPolicy: ReferrerPolicy.origin, - ); + Resource('https://foo.com'), + RequestInit( + referrerPolicy: ReferrerPolicy.origin, + )); expect(request.referrerPolicy, ReferrerPolicy.origin); }); test('.mode', () { final request = Request( - Resource('https://foo.com'), - mode: RequestMode.cors, - ); + Resource('https://foo.com'), + RequestInit( + mode: RequestMode.cors, + )); expect(request.mode, RequestMode.cors); }); test('.mode', () { final request = Request( - Resource('https://foo.com'), - credentials: RequestCredentials.sameOrigin, - ); + Resource('https://foo.com'), + RequestInit( + credentials: RequestCredentials.sameOrigin, + )); expect(request.credentials, RequestCredentials.sameOrigin); }); test('.cache', () { final request = Request( - Resource('https://foo.com'), - cache: RequestCache.noStore, - ); + Resource('https://foo.com'), + RequestInit( + cache: RequestCache.noStore, + )); expect(request.cache, RequestCache.noStore); }); test('.redirect', () { final request = Request( - Resource('https://foo.com'), - redirect: RequestRedirect.error, - ); + Resource('https://foo.com'), + RequestInit( + redirect: RequestRedirect.error, + )); expect(request.redirect, RequestRedirect.error); }); test('.destination', () { final request = Request( - Resource('https://foo.com'), - integrity: 'foo', - ); + Resource('https://foo.com'), + RequestInit( + integrity: 'foo', + )); expect(request.integrity, 'foo'); }); @@ -113,9 +124,10 @@ void main() { final request = Request(Resource('https://foo.com')); final request2 = Request( - Resource('https://foo.com'), - keepalive: true, - ); + Resource('https://foo.com'), + RequestInit( + keepalive: true, + )); expect(request.keepalive, false); expect(request2.keepalive, true); @@ -131,12 +143,13 @@ void main() { test('.bodyUsed', () async { final request = Request( - Resource( - 'https://foo.com', - ), - method: 'POST', - body: 'foo', - ); + Resource( + 'https://foo.com', + ), + RequestInit( + method: 'POST', + body: 'foo', + )); expect(request.bodyUsed, false); expect(await request.text(), 'foo'); expect(request.bodyUsed, true); @@ -154,12 +167,13 @@ void main() { test('.text()', () async { final request = Request( - Resource( - 'https://foo.com', - ), - method: 'POST', - body: 'foo', - ); + Resource( + 'https://foo.com', + ), + RequestInit( + method: 'POST', + body: 'foo', + )); expect(await request.text(), 'foo'); }); diff --git a/packages/edge_runtime/test/utils.dart b/packages/edge_runtime/test/utils.dart index 6c17217..e200594 100644 --- a/packages/edge_runtime/test/utils.dart +++ b/packages/edge_runtime/test/utils.dart @@ -1,69 +1,60 @@ import 'package:edge_runtime/edge_runtime.dart'; +import 'package:edge_runtime/src/abort.dart'; // TODO this import should not be necessary -Request serverRequest( - String path, { - String? method, - Headers? headers, - Object? body, - String? referrer, - ReferrerPolicy? referrerPolicy, - RequestMode? mode, - RequestCredentials? credentials, - RequestCache? cache, - RequestRedirect? redirect, - String? integrity, - bool? keepalive, - AbortSignal? signal, - RequestDuplex? duplex, -}) { +Request serverRequest(String path, + {String? method, + Headers? headers, + Object? body, + String? referrer, + ReferrerPolicy? referrerPolicy, + RequestMode? mode, + RequestCredentials? credentials, + RequestCache? cache, + RequestRedirect? redirect, + String? integrity, + bool? keepalive, + AbortSignal? signal}) { return Request( - Resource('http://0.0.0.0:3001$path'), - method: method, - headers: headers, - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal, - duplex: duplex, - ); + Resource('http://0.0.0.0:3001$path'), + RequestInit( + method: method, + headers: headers, + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal?.delegate)); } -Future fetchFromServer( - String path, { - String? method, - Headers? headers, - Object? body, - String? referrer, - ReferrerPolicy? referrerPolicy, - RequestMode? mode, - RequestCredentials? credentials, - RequestCache? cache, - RequestRedirect? redirect, - String? integrity, - bool? keepalive, - AbortSignal? signal, - RequestDuplex? duplex, -}) { - return fetch( - Resource('http://0.0.0.0:3001$path'), - method: method, - headers: headers, - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal, - duplex: duplex, - ); +Future fetchFromServer(String path, + {String? method, + Headers? headers, + Object? body, + String? referrer, + ReferrerPolicy? referrerPolicy, + RequestMode? mode, + RequestCredentials? credentials, + RequestCache? cache, + RequestRedirect? redirect, + String? integrity, + bool? keepalive, + AbortSignal? signal}) { + return fetch(Resource('http://0.0.0.0:3001$path'), + method: method, + headers: headers, + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal); } diff --git a/packages/netlify_edge/lib/netlify_edge.dart b/packages/netlify_edge/lib/netlify_edge.dart index 0bf67b8..34ebed5 100644 --- a/packages/netlify_edge/lib/netlify_edge.dart +++ b/packages/netlify_edge/lib/netlify_edge.dart @@ -2,9 +2,8 @@ import 'package:js/js.dart'; import 'package:netlify_edge/public/context.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; import 'package:edge_runtime/edge_runtime.dart'; -import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; import 'interop/context_interop.dart' as interop; export 'package:edge_runtime/edge_runtime.dart'; @@ -12,13 +11,10 @@ export './public/context.dart' hide netlifyContextFromJsObject; @JS('__dartNetlifyFetchHandler') external set __dartNetlifyFetchHandler( - Promise Function( - interop.Request req, interop.NetlifyContext) - f); + Promise Function(interop.Request req, interop.NetlifyContext) f); class NetlifyEdge { - final FutureOr Function(Request request, NetlifyContext context)? - fetch; + final FutureOr Function(Request request, NetlifyContext context)? fetch; NetlifyEdge({ this.fetch, @@ -31,7 +27,7 @@ class NetlifyEdge { allowInterop((interop.Request req, interop.NetlifyContext context) { return futureToPromise(Future(() async { final response = await fetch!( - requestFromJsObject(req), + req, netlifyContextFromJsObject(context), ); return response.delegate; diff --git a/packages/netlify_edge/pubspec.yaml b/packages/netlify_edge/pubspec.yaml index b154fc4..91f665c 100644 --- a/packages/netlify_edge/pubspec.yaml +++ b/packages/netlify_edge/pubspec.yaml @@ -10,9 +10,9 @@ environment: dependencies: edge: ^0.0.7 edge_runtime: ^0.0.4+2 - js_bindings: ^0.1.0 js: ^0.6.5 path: ^1.8.3 + typings: ^0.0.3 dev_dependencies: lints: ^2.0.0 diff --git a/packages/supabase_functions/lib/supabase_functions.dart b/packages/supabase_functions/lib/supabase_functions.dart index c5fd651..7ebfcb4 100644 --- a/packages/supabase_functions/lib/supabase_functions.dart +++ b/packages/supabase_functions/lib/supabase_functions.dart @@ -1,19 +1,17 @@ import 'package:js/js.dart'; import 'package:edge_runtime/edge_runtime.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; -import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; export 'package:edge_runtime/edge_runtime.dart'; export 'package:deno_deploy/deno_deploy.dart'; @JS('__dartSupabaseFetchHandler') -external set __dartSupabaseFetchHandler( - Promise Function(interop.Request req) f); +external set __dartSupabaseFetchHandler(Promise Function(interop.Request req) f); class SupabaseFunctions { - final FutureOr Function(Request request)? fetch; + final FutureOr Function(interop.Request request)? fetch; SupabaseFunctions({ this.fetch, @@ -24,7 +22,7 @@ class SupabaseFunctions { if (fetch != null) { __dartSupabaseFetchHandler = allowInterop((interop.Request request) { return futureToPromise(Future(() async { - final response = await fetch!(requestFromJsObject(request)); + final response = await fetch!(request); return response.delegate; })); }); diff --git a/packages/supabase_functions/pubspec.yaml b/packages/supabase_functions/pubspec.yaml index e3fb854..c3c3748 100644 --- a/packages/supabase_functions/pubspec.yaml +++ b/packages/supabase_functions/pubspec.yaml @@ -11,8 +11,8 @@ dependencies: deno_deploy: ^0.0.1-dev.6 edge: ^0.0.7 edge_runtime: ^0.0.4+2 - js_bindings: ^0.1.0 js: ^0.6.5 + typings: ^0.0.3 dev_dependencies: lints: ^2.0.0 diff --git a/packages/vercel_edge/lib/interop/request_interop.dart b/packages/vercel_edge/lib/interop/request_interop.dart index a783c9a..6988bdd 100644 --- a/packages/vercel_edge/lib/interop/request_interop.dart +++ b/packages/vercel_edge/lib/interop/request_interop.dart @@ -1,4 +1,4 @@ -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:typings/core.dart' as interop; extension CloudflareWorkersRequestInteropExtension on interop.Request { String? get ipAddress => headers.get('x-real-ip'); diff --git a/packages/vercel_edge/lib/public/request.dart b/packages/vercel_edge/lib/public/request.dart index f611798..b2a37c6 100644 --- a/packages/vercel_edge/lib/public/request.dart +++ b/packages/vercel_edge/lib/public/request.dart @@ -1,11 +1,9 @@ -import 'package:js_bindings/js_bindings.dart' as interop; -import 'package:edge_runtime/src/request.dart'; +import 'package:typings/core.dart' as interop; import '../interop/request_interop.dart'; -extension VercelEdgeRequestExtension on Request { - IncomingRequestVercelProperties get vc => - IncomingRequestVercelProperties._(delegate); +extension VercelEdgeRequestExtension on interop.Request { + IncomingRequestVercelProperties get vc => IncomingRequestVercelProperties._(this); } class IncomingRequestVercelProperties { diff --git a/packages/vercel_edge/lib/vercel_edge.dart b/packages/vercel_edge/lib/vercel_edge.dart index abfff71..bdb00d0 100644 --- a/packages/vercel_edge/lib/vercel_edge.dart +++ b/packages/vercel_edge/lib/vercel_edge.dart @@ -1,16 +1,13 @@ -import 'package:js/js.dart'; import 'package:edge_runtime/edge_runtime.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; -import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; -import 'package:js_bindings/js_bindings.dart' as interop; +import 'package:js/js.dart'; +import 'package:typings/core.dart' as interop; -export 'package:edge_runtime/edge_runtime.dart'; export './public/request.dart'; @JS('__dartVercelFetchHandler') -external set __dartVercelFetchHandler( - Promise Function(interop.Request req) f); +external set __dartVercelFetchHandler(Promise Function(interop.Request req) f); class VercelEdge { final FutureOr Function(Request request)? fetch; @@ -24,7 +21,7 @@ class VercelEdge { if (fetch != null) { __dartVercelFetchHandler = allowInterop((interop.Request request) { return futureToPromise(Future(() async { - final response = await fetch!(requestFromJsObject(request)); + final response = await fetch!(request); return response.delegate; })); }); diff --git a/packages/vercel_edge/lib/vercel_edge_shelf.dart b/packages/vercel_edge/lib/vercel_edge_shelf.dart index fa118f3..7f226d8 100644 --- a/packages/vercel_edge/lib/vercel_edge_shelf.dart +++ b/packages/vercel_edge/lib/vercel_edge_shelf.dart @@ -1,14 +1,14 @@ -import 'package:js/js.dart'; -import 'package:edge_runtime/edge_runtime.dart'; import 'dart:js_util' as js_util; -import 'package:js_bindings/js_bindings.dart' as interop; -import 'package:shelf/shelf.dart' as shelf; + +import 'package:edge_runtime/edge_runtime.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; import 'package:edge_runtime/src/response.dart'; +import 'package:js/js.dart'; +import 'package:shelf/shelf.dart' as shelf; +import 'package:typings/core.dart' as interop; @JS('__dartVercelFetchHandler') -external set __dartVercelFetchHandler( - Promise Function(interop.Request req) f); +external set __dartVercelFetchHandler(Promise Function(interop.Request req) f); class VercelEdgeShelf { final FutureOr Function(shelf.Request request)? fetch; diff --git a/packages/vercel_edge/pubspec.yaml b/packages/vercel_edge/pubspec.yaml index 7280469..560fa47 100644 --- a/packages/vercel_edge/pubspec.yaml +++ b/packages/vercel_edge/pubspec.yaml @@ -10,9 +10,9 @@ environment: dependencies: edge: ^0.0.7 edge_runtime: ^0.0.4+2 - js_bindings: ^0.1.0 js: ^0.6.5 shelf: ^1.4.0 + typings: ^0.0.3 dev_dependencies: lints: ^2.0.0 diff --git a/pubspec.yaml b/pubspec.yaml index 4c07bbf..f0749f2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,6 +2,6 @@ name: dart_edge_workspace publish_to: none environment: - sdk: '>=2.18.0 <3.0.0' + sdk: '>3.1.0 <4.0.0' dev_dependencies: melos: ^3.0.0 From 54cbfba564c746d28f168abe544a7af61b8c18f5 Mon Sep 17 00:00:00 2001 From: Elliot Hesp Date: Tue, 10 Oct 2023 10:51:17 +0100 Subject: [PATCH 2/3] fix: revert request changes --- .../cloudflare-durable-objects/lib/main.dart | 4 +- .../cloudflare_workers/example/lib/main.dart | 2 +- .../lib/public/cloudflare_workers.dart | 32 ++--- .../lib/public/do/durable_object.dart | 2 +- .../lib/public/fetcher.dart | 5 +- .../lib/public/request.dart | 4 +- .../cloudflare_workers/lib/public/top.dart | 55 +++++---- packages/edge_runtime/lib/edge_runtime.dart | 8 +- packages/edge_runtime/lib/src/blob.dart | 2 +- .../edge_runtime/lib/src/cache/cache.dart | 23 ++-- .../lib/src/cache/cache_storage.dart | 8 +- packages/edge_runtime/lib/src/crypto.dart | 3 +- .../edge_runtime/lib/src/fetch_event.dart | 8 +- packages/edge_runtime/lib/src/file.dart | 4 +- .../lib/src/interop/utils_interop.dart | 3 +- packages/edge_runtime/lib/src/request.dart | 113 ++++++++++++++++++ packages/edge_runtime/lib/src/resource.dart | 4 +- packages/edge_runtime/lib/src/response.dart | 5 +- packages/edge_runtime/lib/src/top.dart | 10 +- packages/netlify_edge/lib/netlify_edge.dart | 10 +- .../lib/supabase_functions.dart | 8 +- packages/vercel_edge/lib/public/request.dart | 6 +- packages/vercel_edge/lib/vercel_edge.dart | 6 +- 23 files changed, 234 insertions(+), 91 deletions(-) create mode 100644 packages/edge_runtime/lib/src/request.dart diff --git a/examples/cloudflare-durable-objects/lib/main.dart b/examples/cloudflare-durable-objects/lib/main.dart index 3afc0f8..e4f5de0 100644 --- a/examples/cloudflare-durable-objects/lib/main.dart +++ b/examples/cloudflare-durable-objects/lib/main.dart @@ -12,7 +12,7 @@ class TestClass extends DurableObject { await state.storage.setAlarm(DateTime.now().add(Duration(seconds: 2))); } - return Response('Path "${Uri.parse(request.url).path}" called $views times.'); + return Response('Path "${request.url.path}" called $views times.'); } @override @@ -36,7 +36,7 @@ void main() { final namespace = env.getDurableObjectNamespace('TEST'); // Get an ID for the DO (this can be based on the request, name, user ID etc) - final id = namespace.idFromName(Uri.parse(request.url).path); + final id = namespace.idFromName(request.url.path); // Send the DO a request instance. return namespace.get(id).fetch(request); diff --git a/packages/cloudflare_workers/example/lib/main.dart b/packages/cloudflare_workers/example/lib/main.dart index 4844b1d..17310bd 100644 --- a/packages/cloudflare_workers/example/lib/main.dart +++ b/packages/cloudflare_workers/example/lib/main.dart @@ -10,7 +10,7 @@ void main() { final durable = env.getDurableObjectNamespace('FOO_BAR'); // Generate an ID for the Durable Object (can be any string). - final id = durable.idFromName(Uri.parse(request.url).path); + final id = durable.idFromName(request.url.path); // Send a request to the Durable Object. return durable.get(id).fetch(request); diff --git a/packages/cloudflare_workers/lib/public/cloudflare_workers.dart b/packages/cloudflare_workers/lib/public/cloudflare_workers.dart index ee4b30e..d4e2b17 100644 --- a/packages/cloudflare_workers/lib/public/cloudflare_workers.dart +++ b/packages/cloudflare_workers/lib/public/cloudflare_workers.dart @@ -4,6 +4,7 @@ import 'package:edge_runtime/edge_runtime.dart'; import 'package:js/js.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; import 'package:edge_runtime/src/response.dart'; +import 'package:edge_runtime/src/request.dart'; import 'package:typings/core.dart' as interop; import '../interop/environment_interop.dart' as interop; @@ -20,20 +21,20 @@ import '../public/environment.dart'; @JS('__dartCloudflareFetchHandler') external set globalDartFetchHandler( - Promise Function( - interop.Request req, interop.Environment env, interop.ExecutionContext ctx) + Promise Function(interop.Request req, + interop.Environment env, interop.ExecutionContext ctx) f); @JS('__dartCloudflareScheduledHandler') external set globalDartScheduledHandler( - Promise Function( - interop.ScheduledEvent event, interop.Environment env, interop.ExecutionContext ctx) + Promise Function(interop.ScheduledEvent event, + interop.Environment env, interop.ExecutionContext ctx) f); @JS('__dartCloudflareEmailHandler') external set globalDartEmailHandler( - Promise Function( - interop.EmailMessage message, interop.Environment env, interop.ExecutionContext ctx) + Promise Function(interop.EmailMessage message, + interop.Environment env, interop.ExecutionContext ctx) f); @JS('__dartCloudflareDurableObjects') @@ -51,11 +52,11 @@ typedef CloudflareWorkersEmailEvent = FutureOr Function( typedef CloudflareWorkersDurableObjects = Map; void attachFetchHandler(CloudflareWorkersFetchEvent handler) { - globalDartFetchHandler = - allowInterop((interop.Request req, interop.Environment env, interop.ExecutionContext ctx) { + globalDartFetchHandler = allowInterop((interop.Request req, + interop.Environment env, interop.ExecutionContext ctx) { return futureToPromise(Future(() async { final response = await handler( - req, + requestFromJsObject(req), environmentFromJsObject(env), executionContextFromJsObject(ctx), ); @@ -65,8 +66,8 @@ void attachFetchHandler(CloudflareWorkersFetchEvent handler) { } void attachScheduledHandler(CloudflareWorkersScheduledEvent handler) { - globalDartScheduledHandler = allowInterop( - (interop.ScheduledEvent event, interop.Environment env, interop.ExecutionContext ctx) { + globalDartScheduledHandler = allowInterop((interop.ScheduledEvent event, + interop.Environment env, interop.ExecutionContext ctx) { return futureToPromise(Future(() async { return handler( scheduledEventFromJsObject(event), @@ -78,8 +79,8 @@ void attachScheduledHandler(CloudflareWorkersScheduledEvent handler) { } void attachEmailHandler(CloudflareWorkersEmailEvent handler) { - globalDartEmailHandler = allowInterop( - (interop.EmailMessage message, interop.Environment env, interop.ExecutionContext ctx) { + globalDartEmailHandler = allowInterop((interop.EmailMessage message, + interop.Environment env, interop.ExecutionContext ctx) { return futureToPromise(Future(() async { return handler( emailMessageFromJsObject(message), @@ -93,7 +94,8 @@ void attachEmailHandler(CloudflareWorkersEmailEvent handler) { void attachDurableObjects(CloudflareWorkersDurableObjects instances) { globalDurableObjects = js_util.jsify({ for (final instance in instances.entries) - instance.key: allowInterop((interop.DurableObjectState state, interop.Environment env) { + instance.key: allowInterop( + (interop.DurableObjectState state, interop.Environment env) { final cls = instance.value(); // Attach the state and environment to the delegate. @@ -104,7 +106,7 @@ void attachDurableObjects(CloudflareWorkersDurableObjects instances) { // Call the instance fetch handler, and return the delegate request. delegate.fetch = allowInterop((interop.Request requestObj) { return futureToPromise(Future(() async { - final response = await cls.fetch(requestObj); + final response = await cls.fetch(requestFromJsObject(requestObj)); return response.delegate; })); }); diff --git a/packages/cloudflare_workers/lib/public/do/durable_object.dart b/packages/cloudflare_workers/lib/public/do/durable_object.dart index 69ab435..43a02af 100644 --- a/packages/cloudflare_workers/lib/public/do/durable_object.dart +++ b/packages/cloudflare_workers/lib/public/do/durable_object.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:typings/core.dart' show Request; +import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; import '../../interop/durable_object_interop.dart' as interop; diff --git a/packages/cloudflare_workers/lib/public/fetcher.dart b/packages/cloudflare_workers/lib/public/fetcher.dart index d0bde41..5e8241f 100644 --- a/packages/cloudflare_workers/lib/public/fetcher.dart +++ b/packages/cloudflare_workers/lib/public/fetcher.dart @@ -4,6 +4,7 @@ import 'package:edge_runtime/src/abort.dart'; import 'package:edge_runtime/src/headers.dart'; import 'package:typings/core.dart' as interop; +import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; import '../interop/durable_object_interop.dart' as interop; @@ -14,7 +15,7 @@ abstract class Fetcher { Fetcher(this._delegate); - Future fetch(interop.Request request, + Future fetch(Request request, {String? method, Headers? headers, Object? body, @@ -28,7 +29,7 @@ abstract class Fetcher { bool? keepalive, AbortSignal? signal}) async { final response = await _delegate.fetch( - request, + request.delegate, interop.RequestInit( method: method, headers: headers?.delegate, diff --git a/packages/cloudflare_workers/lib/public/request.dart b/packages/cloudflare_workers/lib/public/request.dart index 4fc7f65..e12e5fc 100644 --- a/packages/cloudflare_workers/lib/public/request.dart +++ b/packages/cloudflare_workers/lib/public/request.dart @@ -1,10 +1,10 @@ -import 'package:edge_runtime/edge_runtime.dart' show Request; +import 'package:edge_runtime/src/request.dart'; import '../interop/request_interop.dart' as interop; extension CloudflareWorkersRequestExtension on Request { IncomingRequestCfProperties get cf => - IncomingRequestCfProperties._(interop.CloudflareWorkersRequestInteropExtension(this).cf); + IncomingRequestCfProperties._(delegate.cf); } class IncomingRequestCfProperties { diff --git a/packages/cloudflare_workers/lib/public/top.dart b/packages/cloudflare_workers/lib/public/top.dart index 73fb695..116ee87 100644 --- a/packages/cloudflare_workers/lib/public/top.dart +++ b/packages/cloudflare_workers/lib/public/top.dart @@ -11,33 +11,36 @@ import '../interop/request_init_interop.dart' as interop; import 'request_init.dart'; -Future fetch(Resource resource, - {CloudflareRequestInit? cf, - String? method, - Headers? headers, - Object? body, - String? referrer, - interop.ReferrerPolicy? referrerPolicy, - interop.RequestMode? mode, - interop.RequestCredentials? credentials, - interop.RequestCache? cache, - interop.RequestRedirect? redirect, - String? integrity, - bool? keepalive, - AbortSignal? signal}) async { +Future fetch( + Resource resource, { + CloudflareRequestInit? cf, + String? method, + Headers? headers, + Object? body, + String? referrer, + interop.ReferrerPolicy? referrerPolicy, + interop.RequestMode? mode, + interop.RequestCredentials? credentials, + interop.RequestCache? cache, + interop.RequestRedirect? redirect, + String? integrity, + bool? keepalive, + AbortSignal? signal, +}) async { final init = interop.RequestInit( - method: method, - headers: headers?.delegate, - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal?.delegate); + method: method, + headers: headers?.delegate, + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal?.delegate, + ); // Attach the non-standard Cloudflare properties to the Request Init object. if (cf != null) { diff --git a/packages/edge_runtime/lib/edge_runtime.dart b/packages/edge_runtime/lib/edge_runtime.dart index 8be509e..f1d2abc 100644 --- a/packages/edge_runtime/lib/edge_runtime.dart +++ b/packages/edge_runtime/lib/edge_runtime.dart @@ -11,7 +11,6 @@ export 'package:typings/core.dart' RequestDestination, RequestMode, RequestRedirect, - Request, RequestInit, Request$Typings, RequestInit$Typings; @@ -19,16 +18,19 @@ export 'package:typings/core.dart' export 'src/abort.dart' show AbortController, AbortSignal; export 'src/blob.dart' show Blob, BlobPropertyBag; export 'src/cache/cache.dart' show Cache; -export 'src/cache/cache_query_options.dart' show CacheQueryOptions, MultiCacheQueryOptions; +export 'src/cache/cache_query_options.dart' + show CacheQueryOptions, MultiCacheQueryOptions; export 'src/cache/cache_storage.dart' show CacheStorage, caches; export 'src/fetch_event.dart' show FetchEvent; export 'src/file.dart' show File; export 'src/form_data.dart' show FormData, FormDataEntryValue; export 'src/headers.dart' show Headers; export 'src/io_http_client.dart'; +export 'src/request.dart' show Request; export 'src/resource.dart' show Resource; export 'src/response.dart' show Response; -export 'src/text_decoder.dart' show TextDecoder, TextDecodeOptions, TextDecoderOptions; +export 'src/text_decoder.dart' + show TextDecoder, TextDecodeOptions, TextDecoderOptions; export 'src/text_encoder.dart' show TextEncoder, TextEncoderEncodeIntoResult; export 'src/top.dart'; diff --git a/packages/edge_runtime/lib/src/blob.dart b/packages/edge_runtime/lib/src/blob.dart index 99075ba..daa96ee 100644 --- a/packages/edge_runtime/lib/src/blob.dart +++ b/packages/edge_runtime/lib/src/blob.dart @@ -15,7 +15,7 @@ class Blob { options?.delegate ?? interop.BlobPropertyBag(), ); - int get size => _delegate.size as int; + int get size => _delegate.size.toInt(); String get type => _delegate.type; Blob slice([int? start, int? end, String? contentType]) { diff --git a/packages/edge_runtime/lib/src/cache/cache.dart b/packages/edge_runtime/lib/src/cache/cache.dart index bf9959d..3da93e6 100644 --- a/packages/edge_runtime/lib/src/cache/cache.dart +++ b/packages/edge_runtime/lib/src/cache/cache.dart @@ -3,6 +3,7 @@ import 'dart:js_util'; import 'package:typings/core.dart' as interop; import '../interop/utils_interop.dart' as interop; +import '../request.dart'; import '../response.dart'; import 'cache_query_options.dart'; @@ -11,20 +12,22 @@ class Cache { Cache._(this._delegate); - Future add(interop.Request request) async { - await _delegate.add(request); + Future add(Request request) async { + await _delegate.add(request.delegate); } - Future addAll(Iterable requests) async { - await _delegate.addAll(requests.toList()); + Future addAll(Iterable requests) async { + await _delegate.addAll(requests.map((r) => r.delegate).toList()); } - Future delete(interop.Request request, [MultiCacheQueryOptions? options]) async { - await _delegate.delete(request, options?.delegate); + Future delete(Request request, + [MultiCacheQueryOptions? options]) async { + await _delegate.delete(request.delegate, options?.delegate); } - Future match(interop.Request request, [CacheQueryOptions? options]) async { - final obj = await promiseToFuture(_delegate.match(request, options?.delegate)); + Future match(Request request, [CacheQueryOptions? options]) async { + final obj = await promiseToFuture( + _delegate.match(request.delegate, options?.delegate)); return obj == null ? null : responseFromJsObject(obj); } @@ -38,10 +41,10 @@ class Cache { } Future put( - interop.Request request, + Request request, Response response, ) async { - return _delegate.put(request, response.delegate); + return _delegate.put(request.delegate, response.delegate); } } diff --git a/packages/edge_runtime/lib/src/cache/cache_storage.dart b/packages/edge_runtime/lib/src/cache/cache_storage.dart index fdb86f1..ab09866 100644 --- a/packages/edge_runtime/lib/src/cache/cache_storage.dart +++ b/packages/edge_runtime/lib/src/cache/cache_storage.dart @@ -2,6 +2,7 @@ import 'dart:js_util'; import 'package:typings/core.dart' as interop hide caches; import '../interop/cache_interop.dart' as interop; +import '../request.dart'; import '../response.dart'; import 'cache.dart'; import 'cache_query_options.dart'; @@ -25,9 +26,10 @@ class CacheStorage { return _delegate.keys(); } - Future match(interop.Request request, [MultiCacheQueryOptions? options]) async { - final obj = - await promiseToFuture(_delegate.match(request, options?.delegate)); + Future match(Request request, + [MultiCacheQueryOptions? options]) async { + final obj = await promiseToFuture( + _delegate.match(request.delegate, options?.delegate)); return obj == null ? null : responseFromJsObject(obj); } diff --git a/packages/edge_runtime/lib/src/crypto.dart b/packages/edge_runtime/lib/src/crypto.dart index ef24cd9..dd1ef30 100644 --- a/packages/edge_runtime/lib/src/crypto.dart +++ b/packages/edge_runtime/lib/src/crypto.dart @@ -44,7 +44,8 @@ abstract class Algorithm { class RsaOaepParams extends Algorithm { final interop.RsaOaepParams _rsaDelegate; - RsaOaepParams._(this._rsaDelegate) : super._(interop.Algorithm(name: 'RSA-OAEP')); + RsaOaepParams._(this._rsaDelegate) + : super._(interop.Algorithm(name: 'RSA-OAEP')); factory RsaOaepParams({ ByteBuffer? label, diff --git a/packages/edge_runtime/lib/src/fetch_event.dart b/packages/edge_runtime/lib/src/fetch_event.dart index 3e2213c..95ca3dc 100644 --- a/packages/edge_runtime/lib/src/fetch_event.dart +++ b/packages/edge_runtime/lib/src/fetch_event.dart @@ -1,7 +1,9 @@ import 'dart:js_util' as js_util; import 'dart:async'; -import 'package:edge_runtime/edge_runtime.dart' as interop; +import 'request.dart'; +import 'response.dart'; +import 'package:typings/core.dart' as interop; import 'interop/promise_interop.dart'; @@ -10,9 +12,9 @@ class FetchEvent { FetchEvent._(this._delegate); String get type => _delegate.type; - interop.Request get request => _delegate.request; + Request get request => _delegate.request; - void respondWith(FutureOr response) { + void respondWith(FutureOr response) { return _delegate.respondWithPromise(Future.value(response)); } diff --git a/packages/edge_runtime/lib/src/file.dart b/packages/edge_runtime/lib/src/file.dart index 6350dc2..1ccf886 100644 --- a/packages/edge_runtime/lib/src/file.dart +++ b/packages/edge_runtime/lib/src/file.dart @@ -12,7 +12,7 @@ class File implements Blob { File._(this._delegate); String get name => _delegate.name; - int get lastModified => _delegate.lastModified as int; + int get lastModified => _delegate.lastModified.toInt(); String? get webkitRelativePath { try { return _delegate.webkitRelativePath; @@ -28,7 +28,7 @@ class File implements Blob { Future arrayBuffer() => _delegate.arrayBuffer(); @override - int get size => _delegate.size as int; + int get size => _delegate.size.toInt(); @override Blob slice([int? start, int? end, String? contentType]) { diff --git a/packages/edge_runtime/lib/src/interop/utils_interop.dart b/packages/edge_runtime/lib/src/interop/utils_interop.dart index daa6dc7..92d42c8 100644 --- a/packages/edge_runtime/lib/src/interop/utils_interop.dart +++ b/packages/edge_runtime/lib/src/interop/utils_interop.dart @@ -3,6 +3,7 @@ import 'package:js/js.dart'; import 'package:typings/core.dart' as interop; +import '../request.dart'; import '../resource.dart'; interop.Request requestFromResource(Resource resource) { @@ -12,7 +13,7 @@ interop.Request requestFromResource(Resource resource) { case UriValue: return interop.Request((resource as UriValue).uri.toString()); case RequestValue: - return (resource as RequestValue).request; + return (resource as RequestValue).request.delegate; default: throw Exception('Unknown resource type ${resource.runtimeType}'); } diff --git a/packages/edge_runtime/lib/src/request.dart b/packages/edge_runtime/lib/src/request.dart new file mode 100644 index 0000000..fa67d99 --- /dev/null +++ b/packages/edge_runtime/lib/src/request.dart @@ -0,0 +1,113 @@ +import 'dart:js_util'; +import 'dart:typed_data'; + +import 'abort.dart'; +import 'blob.dart'; +import 'body.dart'; +import 'package:typings/core.dart' as interop; +import 'interop/readable_stream.dart'; +import 'interop/utils_interop.dart' as interop; +import 'interop/headers.dart' as headers_interop; + +import 'form_data.dart'; +import 'headers.dart'; +import 'resource.dart'; + +class Request implements Body { + final interop.Request _delegate; + + Request._(this._delegate); + + Request( + Resource resource, { + String? method, + Headers? headers, + Object? body, + String? referrer, + interop.ReferrerPolicy? referrerPolicy, + interop.RequestMode? mode, + interop.RequestCredentials? credentials, + interop.RequestCache? cache, + interop.RequestRedirect? redirect, + String? integrity, + bool? keepalive, + AbortSignal? signal, + }) : _delegate = interop.Request( + interop.requestFromResource(resource), + interop.RequestInit( + method: method, + headers: headers?.delegate, + // TODO(lesnitsky): support streams + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal?.delegate, + ), + ); + + String get method => _delegate.method; + Uri get url => Uri.parse(_delegate.url); + Headers get headers { + return headersFromJsObject( + getProperty(_delegate, 'headers'), + ); + } + + interop.RequestDestination get destination => _delegate.destination; + String get referrer => _delegate.referrer; + interop.ReferrerPolicy get referrerPolicy => _delegate.referrerPolicy; + interop.RequestMode get mode => _delegate.mode; + interop.RequestCredentials get credentials => _delegate.credentials; + interop.RequestCache get cache => _delegate.cache; + interop.RequestRedirect get redirect => _delegate.redirect; + String get integrity => _delegate.integrity; + bool get keepalive => _delegate.keepalive; + AbortSignal get signal => abortSignalToJsObject(_delegate.signal); + Request clone() => Request._(_delegate.clone()); + + @override + Future arrayBuffer() => _delegate.arrayBuffer(); + + @override + Future blob() async => blobFromJsObject(await _delegate.blob()); + + ReadableStreamDefaultReader? _reader; + + Stream>? get body { + final body = getProperty(_delegate, 'body'); + if (body == null) return null; + + if (_reader == null) { + _reader = body.getReader(); + } + + return streamFromJSReader(_reader!); + } + + @override + bool get bodyUsed => _delegate.bodyUsed; + + @override + Future formData() async => + formDataFromJsObject(await _delegate.formData()); + + @override + Future json() async => + // ignore: unnecessary_cast, Dart issue + interop.dartify(await (_delegate as interop.Body).json()); + + @override + Future text() => _delegate.text(); +} + +extension RequestExtension on Request { + interop.Request get delegate => _delegate; +} + +Request requestFromJsObject(interop.Request request) => Request._(request); diff --git a/packages/edge_runtime/lib/src/resource.dart b/packages/edge_runtime/lib/src/resource.dart index 61eb942..925916f 100644 --- a/packages/edge_runtime/lib/src/resource.dart +++ b/packages/edge_runtime/lib/src/resource.dart @@ -1,4 +1,4 @@ -import 'package:typings/core.dart'; +import 'request.dart'; abstract class Resource { const factory Resource(String url) = StringValue; @@ -11,7 +11,7 @@ abstract class Resource { } else if (resource is UriValue) { return resource.uri; } else { - return Uri.parse((resource as RequestValue).request.url); + return (resource as RequestValue).request.url; } } } diff --git a/packages/edge_runtime/lib/src/response.dart b/packages/edge_runtime/lib/src/response.dart index 40bcb7b..f640309 100644 --- a/packages/edge_runtime/lib/src/response.dart +++ b/packages/edge_runtime/lib/src/response.dart @@ -63,7 +63,7 @@ class Response implements Body { interop.ResponseType get type => _delegate.type; Uri get url => Uri.parse(_delegate.url); bool get redirected => _delegate.redirected; - int get status => _delegate.status as int; + int get status => _delegate.status.toInt(); bool get ok => _delegate.ok; String get statusText => _delegate.statusText; Headers get headers { @@ -89,7 +89,8 @@ class Response implements Body { bool get bodyUsed => _delegate.bodyUsed; @override - Future formData() async => formDataFromJsObject(await _delegate.formData()); + Future formData() async => + formDataFromJsObject(await _delegate.formData()); @override Future json() async { diff --git a/packages/edge_runtime/lib/src/top.dart b/packages/edge_runtime/lib/src/top.dart index 60813bb..bf50096 100644 --- a/packages/edge_runtime/lib/src/top.dart +++ b/packages/edge_runtime/lib/src/top.dart @@ -48,12 +48,14 @@ String atob(String encodedData) => interop.atob(encodedData); String btoa(String stringToEncode) => interop.btoa(stringToEncode); -int setInterval(void Function() callback, Duration duration) => - interop.setInterval(js.allowInterop(callback), duration.inMilliseconds) as int; +int setInterval(void Function() callback, Duration duration) => interop + .setInterval(js.allowInterop(callback), duration.inMilliseconds) + .toInt(); void clearInterval(int handle) => interop.clearInterval(handle); -int setTimeout(void Function() callback, Duration duration) => - interop.setTimeout(js.allowInterop(callback), duration.inMilliseconds) as int; +int setTimeout(void Function() callback, Duration duration) => interop + .setTimeout(js.allowInterop(callback), duration.inMilliseconds) + .toInt(); void clearTimeout(int handle) => interop.clearTimeout(handle); diff --git a/packages/netlify_edge/lib/netlify_edge.dart b/packages/netlify_edge/lib/netlify_edge.dart index 34ebed5..7a202e7 100644 --- a/packages/netlify_edge/lib/netlify_edge.dart +++ b/packages/netlify_edge/lib/netlify_edge.dart @@ -2,6 +2,7 @@ import 'package:js/js.dart'; import 'package:netlify_edge/public/context.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; import 'package:edge_runtime/edge_runtime.dart'; +import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; import 'package:typings/core.dart' as interop; import 'interop/context_interop.dart' as interop; @@ -11,10 +12,13 @@ export './public/context.dart' hide netlifyContextFromJsObject; @JS('__dartNetlifyFetchHandler') external set __dartNetlifyFetchHandler( - Promise Function(interop.Request req, interop.NetlifyContext) f); + Promise Function( + interop.Request req, interop.NetlifyContext) + f); class NetlifyEdge { - final FutureOr Function(Request request, NetlifyContext context)? fetch; + final FutureOr Function(Request request, NetlifyContext context)? + fetch; NetlifyEdge({ this.fetch, @@ -27,7 +31,7 @@ class NetlifyEdge { allowInterop((interop.Request req, interop.NetlifyContext context) { return futureToPromise(Future(() async { final response = await fetch!( - req, + requestFromJsObject(req), netlifyContextFromJsObject(context), ); return response.delegate; diff --git a/packages/supabase_functions/lib/supabase_functions.dart b/packages/supabase_functions/lib/supabase_functions.dart index 7ebfcb4..2845285 100644 --- a/packages/supabase_functions/lib/supabase_functions.dart +++ b/packages/supabase_functions/lib/supabase_functions.dart @@ -1,6 +1,7 @@ import 'package:js/js.dart'; import 'package:edge_runtime/edge_runtime.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; +import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; import 'package:typings/core.dart' as interop; @@ -8,10 +9,11 @@ export 'package:edge_runtime/edge_runtime.dart'; export 'package:deno_deploy/deno_deploy.dart'; @JS('__dartSupabaseFetchHandler') -external set __dartSupabaseFetchHandler(Promise Function(interop.Request req) f); +external set __dartSupabaseFetchHandler( + Promise Function(interop.Request req) f); class SupabaseFunctions { - final FutureOr Function(interop.Request request)? fetch; + final FutureOr Function(Request request)? fetch; SupabaseFunctions({ this.fetch, @@ -22,7 +24,7 @@ class SupabaseFunctions { if (fetch != null) { __dartSupabaseFetchHandler = allowInterop((interop.Request request) { return futureToPromise(Future(() async { - final response = await fetch!(request); + final response = await fetch!(requestFromJsObject(request)); return response.delegate; })); }); diff --git a/packages/vercel_edge/lib/public/request.dart b/packages/vercel_edge/lib/public/request.dart index b2a37c6..f4f0430 100644 --- a/packages/vercel_edge/lib/public/request.dart +++ b/packages/vercel_edge/lib/public/request.dart @@ -1,9 +1,11 @@ import 'package:typings/core.dart' as interop; +import 'package:edge_runtime/src/request.dart'; import '../interop/request_interop.dart'; -extension VercelEdgeRequestExtension on interop.Request { - IncomingRequestVercelProperties get vc => IncomingRequestVercelProperties._(this); +extension VercelEdgeRequestExtension on Request { + IncomingRequestVercelProperties get vc => + IncomingRequestVercelProperties._(delegate); } class IncomingRequestVercelProperties { diff --git a/packages/vercel_edge/lib/vercel_edge.dart b/packages/vercel_edge/lib/vercel_edge.dart index bdb00d0..9491a73 100644 --- a/packages/vercel_edge/lib/vercel_edge.dart +++ b/packages/vercel_edge/lib/vercel_edge.dart @@ -1,5 +1,6 @@ import 'package:edge_runtime/edge_runtime.dart'; import 'package:edge_runtime/src/interop/promise_interop.dart'; +import 'package:edge_runtime/src/request.dart'; import 'package:edge_runtime/src/response.dart'; import 'package:js/js.dart'; import 'package:typings/core.dart' as interop; @@ -7,7 +8,8 @@ import 'package:typings/core.dart' as interop; export './public/request.dart'; @JS('__dartVercelFetchHandler') -external set __dartVercelFetchHandler(Promise Function(interop.Request req) f); +external set __dartVercelFetchHandler( + Promise Function(interop.Request req) f); class VercelEdge { final FutureOr Function(Request request)? fetch; @@ -21,7 +23,7 @@ class VercelEdge { if (fetch != null) { __dartVercelFetchHandler = allowInterop((interop.Request request) { return futureToPromise(Future(() async { - final response = await fetch!(request); + final response = await fetch!(requestFromJsObject(request)); return response.delegate; })); }); From 05ff0b8298219381cc929b0f796ddf2d7fd6e023 Mon Sep 17 00:00:00 2001 From: Steve Scruff Date: Tue, 10 Oct 2023 20:36:39 -0700 Subject: [PATCH 3/3] remove fetchevent, re-add request --- packages/edge_runtime/lib/edge_runtime.dart | 12 +-- .../edge_runtime/lib/src/cache/cache.dart | 9 +- .../edge_runtime/lib/src/fetch_event.dart | 41 -------- packages/edge_runtime/lib/src/request.dart | 3 +- packages/edge_runtime/lib/src/top.dart | 14 +-- packages/edge_runtime/test/request_test.dart | 98 ++++++++----------- packages/edge_runtime/test/utils.dart | 29 +++--- 7 files changed, 67 insertions(+), 139 deletions(-) delete mode 100644 packages/edge_runtime/lib/src/fetch_event.dart diff --git a/packages/edge_runtime/lib/edge_runtime.dart b/packages/edge_runtime/lib/edge_runtime.dart index f1d2abc..dd57356 100644 --- a/packages/edge_runtime/lib/edge_runtime.dart +++ b/packages/edge_runtime/lib/edge_runtime.dart @@ -11,17 +11,14 @@ export 'package:typings/core.dart' RequestDestination, RequestMode, RequestRedirect, - RequestInit, - Request$Typings, - RequestInit$Typings; + atob, + btoa; export 'src/abort.dart' show AbortController, AbortSignal; export 'src/blob.dart' show Blob, BlobPropertyBag; export 'src/cache/cache.dart' show Cache; -export 'src/cache/cache_query_options.dart' - show CacheQueryOptions, MultiCacheQueryOptions; +export 'src/cache/cache_query_options.dart' show CacheQueryOptions, MultiCacheQueryOptions; export 'src/cache/cache_storage.dart' show CacheStorage, caches; -export 'src/fetch_event.dart' show FetchEvent; export 'src/file.dart' show File; export 'src/form_data.dart' show FormData, FormDataEntryValue; export 'src/headers.dart' show Headers; @@ -29,8 +26,7 @@ export 'src/io_http_client.dart'; export 'src/request.dart' show Request; export 'src/resource.dart' show Resource; export 'src/response.dart' show Response; -export 'src/text_decoder.dart' - show TextDecoder, TextDecodeOptions, TextDecoderOptions; +export 'src/text_decoder.dart' show TextDecoder, TextDecodeOptions, TextDecoderOptions; export 'src/text_encoder.dart' show TextEncoder, TextEncoderEncodeIntoResult; export 'src/top.dart'; diff --git a/packages/edge_runtime/lib/src/cache/cache.dart b/packages/edge_runtime/lib/src/cache/cache.dart index 3da93e6..47ea21d 100644 --- a/packages/edge_runtime/lib/src/cache/cache.dart +++ b/packages/edge_runtime/lib/src/cache/cache.dart @@ -20,19 +20,16 @@ class Cache { await _delegate.addAll(requests.map((r) => r.delegate).toList()); } - Future delete(Request request, - [MultiCacheQueryOptions? options]) async { + Future delete(Request request, [MultiCacheQueryOptions? options]) async { await _delegate.delete(request.delegate, options?.delegate); } Future match(Request request, [CacheQueryOptions? options]) async { - final obj = await promiseToFuture( - _delegate.match(request.delegate, options?.delegate)); + final obj = await promiseToFuture(_delegate.match(request.delegate, options?.delegate)); return obj == null ? null : responseFromJsObject(obj); } - Future> matchAll( - [interop.Request? request, CacheQueryOptions? options]) async { + Future> matchAll([Request? request, CacheQueryOptions? options]) async { final matches = await _delegate.matchAll( request ?? interop.jsUndefined, options?.delegate, diff --git a/packages/edge_runtime/lib/src/fetch_event.dart b/packages/edge_runtime/lib/src/fetch_event.dart deleted file mode 100644 index 95ca3dc..0000000 --- a/packages/edge_runtime/lib/src/fetch_event.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'dart:js_util' as js_util; -import 'dart:async'; - -import 'request.dart'; -import 'response.dart'; -import 'package:typings/core.dart' as interop; - -import 'interop/promise_interop.dart'; - -class FetchEvent { - final interop.FetchEvent _delegate; - FetchEvent._(this._delegate); - - String get type => _delegate.type; - Request get request => _delegate.request; - - void respondWith(FutureOr response) { - return _delegate.respondWithPromise(Future.value(response)); - } - - void waitUntil(FutureOr future) { - return _delegate.waitUntilPromise(Future(() async { - await future; - })); - } -} - -extension on interop.FetchEvent { - /// This is a workaround for the fact that the `respondWith` method is - /// probably checking for `instanceof Promise` instead of `then` method, - /// so we force the incoming Future to be a Promise so the type is valid. - void respondWithPromise(Future r) => - js_util.callMethod(this, 'respondWith', [futureToPromise(r)]); - - void waitUntilPromise(Future r) => - js_util.callMethod(this, 'waitUntil', [futureToPromise(r)]); -} - -FetchEvent fetchEventFromJsObject(interop.FetchEvent fetchEvent) { - return FetchEvent._(fetchEvent); -} diff --git a/packages/edge_runtime/lib/src/request.dart b/packages/edge_runtime/lib/src/request.dart index fa67d99..822d77f 100644 --- a/packages/edge_runtime/lib/src/request.dart +++ b/packages/edge_runtime/lib/src/request.dart @@ -94,8 +94,7 @@ class Request implements Body { bool get bodyUsed => _delegate.bodyUsed; @override - Future formData() async => - formDataFromJsObject(await _delegate.formData()); + Future formData() async => formDataFromJsObject(await _delegate.formData()); @override Future json() async => diff --git a/packages/edge_runtime/lib/src/top.dart b/packages/edge_runtime/lib/src/top.dart index bf50096..dfca9a7 100644 --- a/packages/edge_runtime/lib/src/top.dart +++ b/packages/edge_runtime/lib/src/top.dart @@ -44,18 +44,12 @@ Future fetch(Resource resource, ); } -String atob(String encodedData) => interop.atob(encodedData); - -String btoa(String stringToEncode) => interop.btoa(stringToEncode); - -int setInterval(void Function() callback, Duration duration) => interop - .setInterval(js.allowInterop(callback), duration.inMilliseconds) - .toInt(); +int setInterval(void Function() callback, Duration duration) => + interop.setInterval(js.allowInterop(callback), duration.inMilliseconds).toInt(); void clearInterval(int handle) => interop.clearInterval(handle); -int setTimeout(void Function() callback, Duration duration) => interop - .setTimeout(js.allowInterop(callback), duration.inMilliseconds) - .toInt(); +int setTimeout(void Function() callback, Duration duration) => + interop.setTimeout(js.allowInterop(callback), duration.inMilliseconds).toInt(); void clearTimeout(int handle) => interop.clearTimeout(handle); diff --git a/packages/edge_runtime/test/request_test.dart b/packages/edge_runtime/test/request_test.dart index e2170f7..617fb80 100644 --- a/packages/edge_runtime/test/request_test.dart +++ b/packages/edge_runtime/test/request_test.dart @@ -1,9 +1,6 @@ import 'package:edge_runtime/edge_runtime.dart'; import 'package:test/test.dart'; -import 'package:typings/core.dart' - hide Headers, AbortSignal; // TODO export the needed types from edge_runtime itself - void main() { group('Request', () { test('.method', () { @@ -15,9 +12,9 @@ void main() { reason: 'The default method is should be GET', ); - expect(Request(resource, RequestInit(method: 'GET')).method, 'GET'); - expect(Request(resource, RequestInit(method: 'POST')).method, 'POST'); - expect(Request(resource, RequestInit(method: 'OPTIONS')).method, 'OPTIONS'); + expect(Request(resource, method: 'GET').method, 'GET'); + expect(Request(resource, method: 'POST').method, 'POST'); + expect(Request(resource, method: 'OPTIONS').method, 'OPTIONS'); }); test('.url', () { @@ -26,7 +23,7 @@ void main() { final resource = Resource.uri(uri); expect(Request(resource).url, uri); - expect(Uri.parse(Request(Resource('https://foo.com?foo=bar')).url).queryParameters, { + expect(Request(Resource('https://foo.com?foo=bar')).url.queryParameters, { 'foo': 'bar', }); }); @@ -36,10 +33,9 @@ void main() { Resource( 'https://foo.com', ), - RequestInit( - headers: Headers({ + headers: Headers({ 'foo': 'bar', - })), + }), ); expect(request.headers.get('foo'), 'bar'); @@ -52,70 +48,63 @@ void main() { test('.destination', () { final request = Request( - Resource('https://foo.com'), - RequestInit( - referrer: 'https://example.com', - )); + Resource('https://foo.com'), + referrer: 'https://example.com', + ); expect(request.referrer.isNotEmpty, true); }); test('.referrerPolicy', () { final request = Request( - Resource('https://foo.com'), - RequestInit( - referrerPolicy: ReferrerPolicy.origin, - )); + Resource('https://foo.com'), + referrerPolicy: ReferrerPolicy.origin, + ); expect(request.referrerPolicy, ReferrerPolicy.origin); }); test('.mode', () { final request = Request( - Resource('https://foo.com'), - RequestInit( - mode: RequestMode.cors, - )); + Resource('https://foo.com'), + mode: RequestMode.cors, + ); expect(request.mode, RequestMode.cors); }); test('.mode', () { final request = Request( - Resource('https://foo.com'), - RequestInit( - credentials: RequestCredentials.sameOrigin, - )); + Resource('https://foo.com'), + credentials: RequestCredentials.sameOrigin, + ); expect(request.credentials, RequestCredentials.sameOrigin); }); test('.cache', () { final request = Request( - Resource('https://foo.com'), - RequestInit( - cache: RequestCache.noStore, - )); + Resource('https://foo.com'), + cache: RequestCache.noStore, + ); expect(request.cache, RequestCache.noStore); }); test('.redirect', () { final request = Request( - Resource('https://foo.com'), - RequestInit( - redirect: RequestRedirect.error, - )); + Resource('https://foo.com'), + redirect: RequestRedirect.error, + ); expect(request.redirect, RequestRedirect.error); }); test('.destination', () { final request = Request( - Resource('https://foo.com'), - RequestInit( - integrity: 'foo', - )); + Resource('https://foo.com'), + integrity: 'foo', + ); expect(request.integrity, 'foo'); }); @@ -124,10 +113,9 @@ void main() { final request = Request(Resource('https://foo.com')); final request2 = Request( - Resource('https://foo.com'), - RequestInit( - keepalive: true, - )); + Resource('https://foo.com'), + keepalive: true, + ); expect(request.keepalive, false); expect(request2.keepalive, true); @@ -143,13 +131,12 @@ void main() { test('.bodyUsed', () async { final request = Request( - Resource( - 'https://foo.com', - ), - RequestInit( - method: 'POST', - body: 'foo', - )); + Resource( + 'https://foo.com', + ), + method: 'POST', + body: 'foo', + ); expect(request.bodyUsed, false); expect(await request.text(), 'foo'); expect(request.bodyUsed, true); @@ -167,13 +154,12 @@ void main() { test('.text()', () async { final request = Request( - Resource( - 'https://foo.com', - ), - RequestInit( - method: 'POST', - body: 'foo', - )); + Resource( + 'https://foo.com', + ), + method: 'POST', + body: 'foo', + ); expect(await request.text(), 'foo'); }); diff --git a/packages/edge_runtime/test/utils.dart b/packages/edge_runtime/test/utils.dart index e200594..1499ef5 100644 --- a/packages/edge_runtime/test/utils.dart +++ b/packages/edge_runtime/test/utils.dart @@ -1,5 +1,4 @@ import 'package:edge_runtime/edge_runtime.dart'; -import 'package:edge_runtime/src/abort.dart'; // TODO this import should not be necessary Request serverRequest(String path, {String? method, @@ -14,21 +13,19 @@ Request serverRequest(String path, String? integrity, bool? keepalive, AbortSignal? signal}) { - return Request( - Resource('http://0.0.0.0:3001$path'), - RequestInit( - method: method, - headers: headers, - body: body, - referrer: referrer, - referrerPolicy: referrerPolicy, - mode: mode, - credentials: credentials, - cache: cache, - redirect: redirect, - integrity: integrity, - keepalive: keepalive, - signal: signal?.delegate)); + return Request(Resource('http://0.0.0.0:3001$path'), + method: method, + headers: headers, + body: body, + referrer: referrer, + referrerPolicy: referrerPolicy, + mode: mode, + credentials: credentials, + cache: cache, + redirect: redirect, + integrity: integrity, + keepalive: keepalive, + signal: signal); } Future fetchFromServer(String path,