Skip to content

Commit 855bdc1

Browse files
committed
Avoid breaking drift
1 parent b50a35e commit 855bdc1

File tree

4 files changed

+128
-60
lines changed

4 files changed

+128
-60
lines changed

sqlite3/lib/src/wasm/js_interop.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:web/web.dart' show Blob;
99
export 'js_interop/atomics.dart';
1010
export 'js_interop/core.dart';
1111
export 'js_interop/fetch.dart';
12-
export 'js_interop/file_system_access.dart';
12+
export 'js_interop/new_file_system_access.dart';
1313
export 'js_interop/indexed_db.dart';
1414
export 'js_interop/typed_data.dart';
1515
export 'js_interop/wasm.dart';
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,68 @@
1-
import 'dart:js_interop';
2-
import 'dart:js_interop_unsafe';
3-
import 'dart:typed_data';
1+
/// Very regrettably, `package:drift` imports this exact file and because it
2+
/// used to define FileSystem Access API bindings before we've migrated these to
3+
/// `package:web`.
4+
///
5+
/// To avoid breaking drift, we're exporting the subset of APIs used by drift
6+
/// to keep that working. This file is not used anywhere in this package and
7+
/// will be removed in the next major release.
8+
@Deprecated('Do not import this at all')
9+
library;
410

5-
import 'package:web/web.dart';
11+
import 'dart:js_interop';
612

13+
import 'package:web/web.dart' as web;
714
import 'core.dart';
15+
import 'new_file_system_access.dart' as fixed;
816

9-
@JS('navigator')
10-
external Navigator get _navigator;
11-
12-
StorageManager? get storageManager {
13-
final navigator = _navigator;
17+
typedef FileSystemDirectoryHandle = LegacyDirectoryHandle;
18+
typedef FileSystemFileHandle = LegacyFileHandle;
19+
typedef FileSystemSyncAccessHandle = LegacySyncFileHandle;
1420

15-
if (navigator.has('storage')) {
16-
return navigator.storage;
17-
}
18-
19-
return null;
21+
LegacyStorageManager? get storageManager {
22+
final raw = fixed.storageManager;
23+
return raw != null ? LegacyStorageManager(raw) : null;
2024
}
2125

22-
extension StorageManagerApi on StorageManager {
23-
Future<FileSystemDirectoryHandle> get directory => getDirectory().toDart;
26+
extension type LegacyStorageManager(web.StorageManager inner) {
27+
Future<FileSystemDirectoryHandle> get directory async =>
28+
FileSystemDirectoryHandle(await inner.directory);
2429
}
2530

26-
extension FileSystemSyncAccessHandleApi on FileSystemSyncAccessHandle {
27-
int readDart(Uint8List buffer, [FileSystemReadWriteOptions? options]) {
28-
if (options == null) {
29-
return read(buffer.toJS);
30-
} else {
31-
return read(buffer.toJS, options);
32-
}
33-
}
31+
extension type LegacyHandle(web.FileSystemHandle inner) {
32+
bool get isDirectory => inner.isDirectory;
3433

35-
int writeDart(Uint8List buffer, [FileSystemReadWriteOptions? options]) {
36-
if (options == null) {
37-
return write(buffer.toJS);
38-
} else {
39-
return write(buffer.toJS, options);
40-
}
41-
}
34+
String get name => inner.name;
4235
}
4336

44-
extension FileSystemHandleApi on FileSystemHandle {
45-
bool get isFile => kind == 'file';
46-
47-
bool get isDirectory => kind == 'directory';
48-
}
37+
extension type LegacyDirectoryHandle(web.FileSystemDirectoryHandle inner) {
38+
Future<LegacyFileHandle> openFile(String name, {bool create = false}) async {
39+
return LegacyFileHandle(await inner.openFile(name, create: create));
40+
}
4941

50-
extension FileSystemDirectoryHandleApi on FileSystemDirectoryHandle {
51-
Future<FileSystemFileHandle> openFile(String name, {bool create = false}) {
52-
return getFileHandle(name, FileSystemGetFileOptions(create: create)).toDart;
42+
Future<void> removeEntry(String name, {bool recursive = false}) async {
43+
await fixed.FileSystemDirectoryHandleApi(inner)
44+
.remove(name, recursive: recursive);
5345
}
5446

55-
Future<FileSystemDirectoryHandle> getDirectory(String name,
56-
{bool create = false}) {
57-
return getDirectoryHandle(
58-
name, FileSystemGetDirectoryOptions(create: create))
59-
.toDart;
47+
Future<LegacyDirectoryHandle> getDirectory(String name) async {
48+
return LegacyDirectoryHandle(await inner.getDirectory(name));
6049
}
6150

62-
Future<void> remove(String name, {bool recursive = false}) {
63-
return removeEntry(name, FileSystemRemoveOptions(recursive: recursive))
64-
.toDart;
51+
Stream<LegacyHandle> list() {
52+
return AsyncJavaScriptIteratable<JSArray>(inner)
53+
.map((data) => LegacyHandle(data.toDart[1] as web.FileSystemHandle));
6554
}
55+
}
6656

67-
Stream<FileSystemHandle> list() {
68-
return AsyncJavaScriptIteratable<JSArray>(this)
69-
.map((data) => data.toDart[1] as FileSystemHandle);
57+
extension type LegacyFileHandle(web.FileSystemFileHandle inner) {
58+
Future<LegacySyncFileHandle> createSyncAccessHandle() async {
59+
final raw = await inner.createSyncAccessHandle().toDart;
60+
return LegacySyncFileHandle(raw);
7061
}
62+
}
7163

72-
Stream<FileSystemHandle> getFilesRecursively() async* {
73-
await for (final entry in list()) {
74-
if (entry.isFile) {
75-
yield entry;
76-
} else if (entry.isDirectory) {
77-
yield* (entry as FileSystemDirectoryHandle).getFilesRecursively();
78-
}
79-
}
64+
extension type LegacySyncFileHandle(web.FileSystemSyncAccessHandle inner) {
65+
void close() {
66+
inner.close();
8067
}
8168
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import 'dart:js_interop';
2+
import 'dart:js_interop_unsafe';
3+
import 'dart:typed_data';
4+
5+
import 'package:web/web.dart';
6+
7+
import 'core.dart';
8+
9+
@JS('navigator')
10+
external Navigator get _navigator;
11+
12+
StorageManager? get storageManager {
13+
final navigator = _navigator;
14+
15+
if (navigator.has('storage')) {
16+
return navigator.storage;
17+
}
18+
19+
return null;
20+
}
21+
22+
extension StorageManagerApi on StorageManager {
23+
Future<FileSystemDirectoryHandle> get directory => getDirectory().toDart;
24+
}
25+
26+
extension FileSystemSyncAccessHandleApi on FileSystemSyncAccessHandle {
27+
int readDart(Uint8List buffer, [FileSystemReadWriteOptions? options]) {
28+
if (options == null) {
29+
return read(buffer.toJS);
30+
} else {
31+
return read(buffer.toJS, options);
32+
}
33+
}
34+
35+
int writeDart(Uint8List buffer, [FileSystemReadWriteOptions? options]) {
36+
if (options == null) {
37+
return write(buffer.toJS);
38+
} else {
39+
return write(buffer.toJS, options);
40+
}
41+
}
42+
}
43+
44+
extension FileSystemHandleApi on FileSystemHandle {
45+
bool get isFile => kind == 'file';
46+
47+
bool get isDirectory => kind == 'directory';
48+
}
49+
50+
extension FileSystemDirectoryHandleApi on FileSystemDirectoryHandle {
51+
Future<FileSystemFileHandle> openFile(String name, {bool create = false}) {
52+
return getFileHandle(name, FileSystemGetFileOptions(create: create)).toDart;
53+
}
54+
55+
Future<FileSystemDirectoryHandle> getDirectory(String name,
56+
{bool create = false}) {
57+
return getDirectoryHandle(
58+
name, FileSystemGetDirectoryOptions(create: create))
59+
.toDart;
60+
}
61+
62+
Future<void> remove(String name, {bool recursive = false}) {
63+
return removeEntry(name, FileSystemRemoveOptions(recursive: recursive))
64+
.toDart;
65+
}
66+
67+
Stream<FileSystemHandle> list() {
68+
return AsyncJavaScriptIteratable<JSArray>(this)
69+
.map((data) => data.toDart[1] as FileSystemHandle);
70+
}
71+
72+
Stream<FileSystemHandle> getFilesRecursively() async* {
73+
await for (final entry in list()) {
74+
if (entry.isFile) {
75+
yield entry;
76+
} else if (entry.isDirectory) {
77+
yield* (entry as FileSystemDirectoryHandle).getFilesRecursively();
78+
}
79+
}
80+
}
81+
}

sqlite3_web/lib/src/worker.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import 'package:web/web.dart'
1515
FileSystemSyncAccessHandle,
1616
Worker;
1717
// ignore: implementation_imports
18-
import 'package:sqlite3/src/wasm/js_interop/file_system_access.dart';
18+
import 'package:sqlite3/src/wasm/js_interop/new_file_system_access.dart';
1919

2020
import 'api.dart';
2121
import 'channel.dart';

0 commit comments

Comments
 (0)