-
Notifications
You must be signed in to change notification settings - Fork 49
[POC] SQL.js #647
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
[POC] SQL.js #647
Conversation
|
@@ -14,6 +14,7 @@ | |||
"@powersync/attachments": "workspace:*", | |||
"@powersync/common": "workspace:*", | |||
"@powersync/react": "workspace:*", | |||
"@powersync/dev-adapter": "workspace:*", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've put this driver in it's own package for now.
SQL.js is relatively large. About 2Mb. Alternatively we could publish this under a different export e.g. @powersync/common/driver
commonjs({}), | ||
alias({ | ||
entries: [ | ||
{ find: 'fs', replacement: path.resolve(__dirname, 'vendored/empty.js') }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The default Emscripten output contains code like require("fs")
. This seems to be unreachable, but Metro complains when it detects it. This replaces the requires to return empty modules.
} | ||
} | ||
|
||
(globalThis as any).onSqliteUpdate = ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The standard update hook function did not trigger for me. I've implemented this as a workaround.
+ /** TODO | ||
+ @return {number} the last insert id | ||
+ */ | ||
+ Database.prototype["lastInsertId"] = function lastInsertId() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was not exposed by SQL.js, but we need it in order to validate the response from checkpoint validations.
Overview
Certain environments have trouble loading PowerSync due to it requiring a SQLite implementation which supports loading our Rust core extension. One of these environments is Expo Go which is a prebuilt app container for Expo apps.
This POC uses a pure JS implementation of SQLite via SQL.js. SQLite and our Rust core extension are compiled to JavaScript via Emscripen. This pure JS payload can be used in environments such as Expo Go.
SQL.js already has a pure JS build, this POC locally links PowerSync into that build process. This POC applies Git patches to the SQL.js repo and inits a build.
A small
DBAdapter
is included for SQL.js. This POC currently uses this adapter in the React Native Supabase Todolist Demo. This demo can now be started in Expo GO.Outstanding work
Demo
ExpoGo2.mp4