wasmify-rails 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +25 -2
- data/lib/active_record/connection_adapters/sqlite3_wasm_adapter.rb +24 -0
- data/lib/generators/wasmify/install/install_generator.rb +6 -1
- data/lib/generators/wasmify/install/templates/config/environments/wasm.rb +4 -1
- data/lib/generators/wasmify/install/templates/config/wasmify.yml +1 -0
- data/lib/generators/wasmify/pwa/templates/pwa/database.js +2 -10
- data/lib/generators/wasmify/pwa/templates/pwa/rails.sw.js +5 -1
- data/lib/rack/data_uri_uploads.rb +1 -0
- data/lib/wasmify/rails/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 683d693ae789d6a5681cbab9e6f66f8a8fbd52a23d4dc440ff78d14e13c3085d
|
4
|
+
data.tar.gz: e8c18abb0382cbec70d562debbf4f16d82eeece71c9dcdb0a82f916216c3f7a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7aafd09c3e716080f96efa987aeb1825ab5307be9cc1dae32e657f30a4f40314fd65e4ec610b8f271c40b3cd7ad0c951eff9be5cc9e3cd80456edaedec19a6c
|
7
|
+
data.tar.gz: 44619a0600d773ecd96e9f012b0245d6567e5d140b04397577560665ae5b49a9f7983755431f644274ebdb6dc76a3e33c91bf37eee5da56d8e4bfdc8f70a9e9b
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,20 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.1.3
|
6
|
+
|
7
|
+
- Check if `cookieStore` is available and only manipulate cookies if it is.
|
8
|
+
|
9
|
+
- Add `skipWaiting()` to the server worker to force the new version to take over.
|
10
|
+
|
11
|
+
## 0.1.2
|
12
|
+
|
13
|
+
- Add cache support to Rack handler.
|
14
|
+
|
15
|
+
Now we use `caches` for files with `Cache-Control`, so we don't perform a Wasm request.
|
16
|
+
|
17
|
+
- Minor fixes and improvements.
|
18
|
+
|
5
19
|
## 0.1.1
|
6
20
|
|
7
21
|
- Support multipart file uploads by converting files to data URIs.
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ Adding to your Gemfile:
|
|
13
13
|
gem "wasmify-rails", group: [:development, :wasm]
|
14
14
|
```
|
15
15
|
|
16
|
-
## Usage
|
16
|
+
## Usage: generators and tasks
|
17
17
|
|
18
18
|
This gem comes with a few commands (Rake tasks) to help you get started with packing your Rails app into a Wasm module.
|
19
19
|
|
@@ -151,6 +151,29 @@ Here is an example app:
|
|
151
151
|
|
152
152
|
<video src="https://github.com/user-attachments/assets/34e54379-5f3e-42eb-a4fa-96c9aaa91869"></video>
|
153
153
|
|
154
|
+
## Rails/Ruby extensions
|
155
|
+
|
156
|
+
This gem provides a variety of _adapters_ and plugins to make your Rails application Wasm-compatible:
|
157
|
+
|
158
|
+
- `Kernel#on_wasm?`: a convenient predicate method to check if the code is running in the Wasm environment.
|
159
|
+
|
160
|
+
- Active Record
|
161
|
+
|
162
|
+
- `sqlite3_wasm` adapter: work with `sqlite3` Wasm just like with a regular SQLite database.
|
163
|
+
- `nulldb` adapter for testing purposes.
|
164
|
+
|
165
|
+
- Active Storage
|
166
|
+
|
167
|
+
- `null` variant processor (just leaves files as is)
|
168
|
+
|
169
|
+
- Action Mailer
|
170
|
+
|
171
|
+
- `null` delivery method (to disable emails in Wasm)
|
172
|
+
|
173
|
+
- Rack
|
174
|
+
|
175
|
+
- `Rack::DataUriUploads` middleware to transparently transform Data URI uploads into files.
|
176
|
+
|
154
177
|
## Roadmap
|
155
178
|
|
156
179
|
- PGLite support (see [this example](https://github.com/kateinoigakukun/mastodon/blob/fff2e4a626a20a616c546ddf4f91766abaf1133a/pwa/dist/pglite.rb#L1))
|
@@ -164,7 +187,7 @@ Bug reports and pull requests are welcome on GitHub at [https://github.com/](htt
|
|
164
187
|
|
165
188
|
## Credits
|
166
189
|
|
167
|
-
The `nulldb` adapter for Active Record (used for tests) is
|
190
|
+
The `nulldb` adapter for Active Record (used for tests) is ported from [this project](https://github.com/nulldb/nulldb).
|
168
191
|
|
169
192
|
## License
|
170
193
|
|
@@ -118,6 +118,7 @@ module ActiveRecord
|
|
118
118
|
str_val = val.to_s
|
119
119
|
next str_val if val.typeof == "string"
|
120
120
|
next str_val == "true" if val.typeof == "boolean"
|
121
|
+
next nil if str_val == "null"
|
121
122
|
|
122
123
|
# handle integers and floats
|
123
124
|
next str_val.include?(".") ? val.to_f : val.to_i if val.typeof == "number"
|
@@ -136,14 +137,37 @@ module ActiveRecord
|
|
136
137
|
end
|
137
138
|
end
|
138
139
|
|
140
|
+
# This type converts byte arrays represented as strings from JS to binaries in Ruby
|
141
|
+
class JSBinary < ActiveModel::Type::Binary
|
142
|
+
def deserialize(value)
|
143
|
+
bvalue = value
|
144
|
+
if value.is_a?(String)
|
145
|
+
bvalue = value.split(",").map(&:to_i).pack("c*")
|
146
|
+
end
|
147
|
+
|
148
|
+
super(bvalue)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
ActiveRecord::Type.register(:binary, JSBinary, adapter: :sqlite3_wasm)
|
153
|
+
|
139
154
|
class << self
|
140
155
|
def database_exists?(config)
|
141
156
|
true
|
142
157
|
end
|
143
158
|
|
144
159
|
def new_client(config) = ExternalInterface.new(config)
|
160
|
+
|
161
|
+
private
|
162
|
+
def initialize_type_map(m)
|
163
|
+
super
|
164
|
+
register_class_with_limit m, %r(binary)i, JSBinary
|
165
|
+
end
|
145
166
|
end
|
146
167
|
|
168
|
+
# Re-initialize type map to include JSBinary
|
169
|
+
TYPE_MAP = Type::TypeMap.new.tap { |m| initialize_type_map(m) }
|
170
|
+
|
147
171
|
attr_reader :external_interface
|
148
172
|
|
149
173
|
def initialize(...)
|
@@ -47,10 +47,15 @@ class Wasmify::InstallGenerator < Rails::Generators::Base
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def
|
50
|
+
def configure_boot_file
|
51
51
|
inject_into_file "config/boot.rb", after: /require ['"]bundler\/setup['"]/ do
|
52
52
|
" unless RUBY_PLATFORM =~ /wasm/"
|
53
53
|
end
|
54
|
+
|
55
|
+
# Disable bootsnap if any
|
56
|
+
inject_into_file "config/boot.rb", after: /require ['"]bootsnap\/setup['"]/ do
|
57
|
+
" unless RUBY_PLATFORM =~ /wasm/"
|
58
|
+
end
|
54
59
|
end
|
55
60
|
|
56
61
|
def add_tzinfo_data_to_gemfile
|
@@ -26,5 +26,8 @@ Rails.application.configure do
|
|
26
26
|
config.active_storage.variant_processor = :null
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
# Do not use the same secret key base in a local app (for security reasons)
|
30
|
+
config.secret_key_base = "wasm-secret"
|
31
|
+
# Use a different session cookie name to avoid conflicts
|
32
|
+
config.session_store :cookie_store, key: "_local_session"
|
30
33
|
end
|
@@ -4,15 +4,7 @@ export const setupSQLiteDatabase = async () => {
|
|
4
4
|
const sqlite3 = await sqlite3InitModule();
|
5
5
|
|
6
6
|
console.log("Running SQLite3 version", sqlite3.version.libVersion);
|
7
|
-
|
8
|
-
|
9
|
-
? new sqlite3.oo1.OpfsDb("/railsdb.sqlite3")
|
10
|
-
: new sqlite3.oo1.DB("/railsdb.sqlite3", "ct");
|
11
|
-
console.log(
|
12
|
-
"opfs" in sqlite3
|
13
|
-
? `OPFS is available, created persisted database at ${db.filename}`
|
14
|
-
: `OPFS is not available, created transient database ${db.filename}`,
|
15
|
-
);
|
16
|
-
|
7
|
+
// NOTE: This database is transient and will be lost if you uninstall the service worker (aka hard reset)
|
8
|
+
const db = new sqlite3.oo1.DB("/railsdb.sqlite3", "ct");
|
17
9
|
return db;
|
18
10
|
};
|
@@ -15,6 +15,8 @@ const initDB = async (progress) => {
|
|
15
15
|
progress?.updateStep("Initializing SQLite database...");
|
16
16
|
db = await setupSQLiteDatabase();
|
17
17
|
progress?.updateStep("SQLite database created.");
|
18
|
+
|
19
|
+
return db;
|
18
20
|
};
|
19
21
|
|
20
22
|
let vm = null;
|
@@ -47,6 +49,8 @@ const initVM = async (progress, opts = {}) => {
|
|
47
49
|
vm.eval("ActiveRecord::Tasks::DatabaseTasks.prepare_all");
|
48
50
|
|
49
51
|
redirectConsole = false;
|
52
|
+
|
53
|
+
return vm;
|
50
54
|
};
|
51
55
|
|
52
56
|
const resetVM = () => {
|
@@ -67,7 +71,7 @@ self.addEventListener("activate", (event) => {
|
|
67
71
|
|
68
72
|
self.addEventListener("install", (event) => {
|
69
73
|
console.log("[rails-web] Install Service Worker");
|
70
|
-
event.waitUntil(installApp());
|
74
|
+
event.waitUntil(installApp().then(() => self.skipWaiting()));
|
71
75
|
});
|
72
76
|
|
73
77
|
const rackHandler = new RackHandler(initVM, { assumeSSL: true });
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wasmify-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Dementyev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
11
|
+
date: 2024-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|