Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -252,9 +252,20 @@ export default {

const resResult = await exports.uzumibi_start_request();
const resOffset = Number(resResult & 0xFFFFFFFFn);
if (resOffset === 0) {
const errOffset = Number((resResult >> 32n) & 0xFFFFFFFFn);
const buffer = new Uint8Array(exports.memory.buffer, errOffset);
const upperBits = Number((resResult >> 32n) & 0xFFFFFFFFn);

if (upperBits !== 0) {
const upperTag = (upperBits >> 16) & 0xFFFF;
if (upperTag === 0xFEFF) {
// Special route
if (upperBits === 0xFEFFFFFF) {
// Pass through to assets
return env.ASSETS.fetch(request);
}
throw new Error(`Unknown routing bits: 0x${upperBits.toString(16)}`);
}
// Error case
const buffer = new Uint8Array(exports.memory.buffer, upperBits);
let errStr = "";
for (let i = 0; buffer[i] !== 0; i++) {
errStr += String.fromCharCode(buffer[i]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ edition = "2024"
crate-type = ["cdylib", "rlib"]

[dependencies]
mrubyedge = { version = ">= 1.1", features = [
mrubyedge = { version = ">= 1.1.10", features = [
"no-wasi",
], default-features = false }
uzumibi-gem = ">= 0.5.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -350,20 +350,42 @@ fn uzumibi_queue_class_send(
Ok(RObject::boolean(true).to_refcount_assigned())
}

// ---- Assets pass-through ----

fn uzumibi_fetch_assets(
_vm: &mut VM,
_args: &[Rc<RObject>],
) -> Result<Rc<RObject>, mrubyedge::Error> {
Err(mrubyedge::Error::TaggedError(
"UzumibiPassAssets",
"pass assets to platform".to_string(),
))
}

// ---- VM initialization ----

fn init_vm() -> Result<VM, mrubyedge::Error> {
let mut rite = rite::load(MRB)
.map_err(|e| mrubyedge::Error::RuntimeError(format!("Failed to load mruby: {:?}", e)))?;
let mut vm = VM::open(&mut rite);
uzumibi_gem::init::init_uzumibi(&mut vm);

let runtime_error = vm.get_class_by_name("RuntimeError");
vm.define_class("UzumibiPassAssets", Some(runtime_error), None);

let object = vm.object_class.clone();
mrb_define_cmethod(
&mut vm,
object,
object.clone(),
"debug_console",
Box::new(uzumibi_kernel_debug_console_log),
);
mrb_define_cmethod(
&mut vm,
object,
"fetch_assets",
Box::new(uzumibi_fetch_assets),
);

#[cfg(feature = "enable-external")]
{
Expand Down Expand Up @@ -457,10 +479,13 @@ unsafe extern "C" fn uzumibi_initialize_request(size: i32) -> u64 {
}
}

const PASS_ASSETS: u64 = 0xFEFFFFFF;

#[unsafe(export_name = "uzumibi_start_request")]
unsafe extern "C" fn uzumibi_start_request() -> u64 {
match do_uzumibi_start_request() {
Ok(ptr) => (ptr as u32) as u64,
Err(mrubyedge::Error::TaggedError("UzumibiPassAssets", _)) => PASS_ASSETS << 32,
Err(e) => {
let err_buf = set_error_to_buf(format!("Error in start_request: {}", e));
((err_buf as u32) as u64) << 32
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@
"observability": {
"enabled": true
},
/**
* Static Assets
* Served via env.ASSETS.fetch() when fetch_assets is called in a route
* https://developers.cloudflare.com/workers/static-assets/
*/
"assets": {
"directory": "./public",
"binding": "ASSETS"
},
/**
* Queues
* Used for Uzumibi::Queue.send
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ edition = "2024"
crate-type = ["cdylib", "rlib"]

[dependencies]
mrubyedge = { version = ">= 1.1", features = [
mrubyedge = { version = ">= 1.1.10", features = [
"no-wasi",
], default-features = false }
uzumibi-gem = ">= 0.5.0"
Expand Down
11 changes: 11 additions & 0 deletions uzumibi-cli/templates/cloudflare/public/assets/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Uzumibi Assets</title>
</head>
<body>
<h1>Hello from Uzumibi static assets!</h1>
<p>This page is served via Cloudflare Workers Assets.</p>
</body>
</html>
18 changes: 14 additions & 4 deletions uzumibi-cli/templates/cloudflare/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,21 @@ export default {

const resResult = exports.uzumibi_start_request();
const resOffset = Number(resResult & 0xFFFFFFFFn);
if (resOffset === 0) {
const errOffset = Number((resResult >> 32n) & 0xFFFFFFFFn);
const decoder = new TextDecoder();
const upperBits = Number((resResult >> 32n) & 0xFFFFFFFFn);

if (upperBits !== 0) {
const upperTag = (upperBits >> 16) & 0xFFFF;
if (upperTag === 0xFEFF) {
// Special route
if (upperBits === 0xFEFFFFFF) {
// Pass through to assets
return env.ASSETS.fetch(request);
}
throw new Error(`Unknown routing bits: 0x${upperBits.toString(16)}`);
}
// Error case
const buffer = new Uint8Array(exports.memory.buffer, upperBits);
let errStr = "";
const buffer = new Uint8Array(exports.memory.buffer, errOffset);
for (let i = 0; buffer[i] !== 0; i++) {
errStr += String.fromCharCode(buffer[i]);
}
Expand Down
2 changes: 1 addition & 1 deletion uzumibi-cli/templates/cloudflare/wasm-app/Cargo.toml_
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ edition = "2024"
crate-type = ["cdylib", "rlib"]

[dependencies]
mrubyedge = { version = ">= 1.1", features = [
mrubyedge = { version = ">= 1.1.10", features = [
"no-wasi",
], default-features = false }
uzumibi-gem = ">= 0.5.0"
Expand Down
29 changes: 28 additions & 1 deletion uzumibi-cli/templates/cloudflare/wasm-app/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,18 +53,42 @@ fn uzumibi_kernel_debug_console_log(
Ok(RObject::nil().to_refcount_assigned())
}

// ---- Assets pass-through ----

fn uzumibi_fetch_assets(
_vm: &mut VM,
_args: &[Rc<RObject>],
) -> Result<Rc<RObject>, mrubyedge::Error> {
Err(mrubyedge::Error::TaggedError(
"UzumibiPassAssets",
"pass assets to platform".to_string(),
))
}

// ---- VM initialization ----

fn init_vm() -> Result<VM, mrubyedge::Error> {
let mut rite = rite::load(MRB)
.map_err(|e| mrubyedge::Error::RuntimeError(format!("Failed to load mruby: {:?}", e)))?;
let mut vm = VM::open(&mut rite);
uzumibi_gem::init::init_uzumibi(&mut vm);

let runtime_error = vm.get_class_by_name("RuntimeError");
vm.define_class("UzumibiPassAssets", Some(runtime_error), None);

let object = vm.object_class.clone();
mrb_define_cmethod(
&mut vm,
object,
object.clone(),
"debug_console",
Box::new(uzumibi_kernel_debug_console_log),
);
mrb_define_cmethod(
&mut vm,
object,
"fetch_assets",
Box::new(uzumibi_fetch_assets),
);

vm.run()
.map_err(|e| mrubyedge::Error::RuntimeError(format!("Failed to init VM: {:?}", e)))?;
Expand Down Expand Up @@ -125,10 +149,13 @@ unsafe extern "C" fn uzumibi_initialize_request(size: i32) -> u64 {
}
}

const PASS_ASSETS: u64 = 0xFEFFFFFF;

#[unsafe(export_name = "uzumibi_start_request")]
unsafe extern "C" fn uzumibi_start_request() -> u64 {
match do_uzumibi_start_request() {
Ok(ptr) => (ptr as u32) as u64,
Err(mrubyedge::Error::TaggedError("UzumibiPassAssets", _)) => PASS_ASSETS << 32,
Err(e) => {
let err_buf = set_error_to_buf(format!("Error in start_request: {}", e));
((err_buf as u32) as u64) << 32
Expand Down
33 changes: 7 additions & 26 deletions uzumibi-cli/templates/cloudflare/wrangler.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,14 @@
"compatibility_date": "2025-12-30",
"observability": {
"enabled": true
}
/**
* Smart Placement
* https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
*/
// "placement": { "mode": "smart" }
/**
* Bindings
* Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including
* databases, object storage, AI inference, real-time communication and more.
* https://developers.cloudflare.com/workers/runtime-apis/bindings/
*/
/**
* Environment Variables
* https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables
* Note: Use secrets to store sensitive data.
* https://developers.cloudflare.com/workers/configuration/secrets/
*/
// "vars": { "MY_VARIABLE": "production_value" }
},
/**
* Static Assets
* https://developers.cloudflare.com/workers/static-assets/binding/
* Served via env.ASSETS.fetch() when fetch_assets is called in a route
* https://developers.cloudflare.com/workers/static-assets/
*/
// "assets": { "directory": "./public/", "binding": "ASSETS" }
/**
* Service Bindings (communicate between multiple Workers)
* https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings
*/
// "services": [ { "binding": "MY_SERVICE", "service": "my-service" } ]
"assets": {
"directory": "./public",
"binding": "ASSETS"
}
}
2 changes: 1 addition & 1 deletion uzumibi-cli/templates/cloudrun/Cargo.toml_
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ edition = "2024"
publish = false

[dependencies]
mrubyedge = { version = ">= 1.1", features = [
mrubyedge = { version = ">= 1.1.10", features = [
"no-wasi",
], default-features = false }
uzumibi-gem = ">= 0.5.0"
Expand Down
2 changes: 1 addition & 1 deletion uzumibi-cli/templates/fastly/Cargo.toml_
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ publish = false
crate-type = ["cdylib", "rlib"]

[dependencies]
mrubyedge = { version = ">= 1.1", features = [
mrubyedge = { version = ">= 1.1.10", features = [
"wasi",
], default-features = false }
uzumibi-gem = ">= 0.5.0"
Expand Down
2 changes: 1 addition & 1 deletion uzumibi-cli/templates/spin/Cargo.toml_
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ crate-type = ["cdylib"]
[dependencies]
anyhow = "1"
spin-sdk = "5.0.0"
mrubyedge = { version = ">= 1.1", features = [
mrubyedge = { version = ">= 1.1.10", features = [
"wasi",
], default-features = false }
uzumibi-gem = ">= 0.5.0"
Expand Down
6 changes: 6 additions & 0 deletions uzumibi-cli/tests/runn/new_cloudflare.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ steps:
command: test -f {{ vars.tmpdir }}/{{ vars.project_name }}/wrangler.jsonc
test: current.exit_code == 0

check_assets_index_html:
desc: Check public/assets/index.html exists and contains expected content
exec:
command: grep -l 'Uzumibi' {{ vars.tmpdir }}/{{ vars.project_name }}/public/assets/index.html
test: current.exit_code == 0

pnpm_install:
desc: Install Node.js dependencies
exec:
Expand Down
4 changes: 4 additions & 0 deletions uzumibi-on-cloudflare-spike/lib/app.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ class App < Uzumibi::Router
res
end

get "/assets/*" do |req, res|
fetch_assets
end

get "/healthz" do |req, res|
res.status_code = 200
res.headers = {
Expand Down
11 changes: 11 additions & 0 deletions uzumibi-on-cloudflare-spike/public/assets/hello.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Uzumibi Assets</title>
</head>
<body>
<h1>Hello from Uzumibi static assets!</h1>
<p>This page is served via Cloudflare Workers Assets.</p>
</body>
</html>
1 change: 1 addition & 0 deletions uzumibi-on-cloudflare-spike/public/assets/hello.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello from Uzumibi static assets!
1 change: 1 addition & 0 deletions uzumibi-on-cloudflare-spike/public/assets/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<h1>Hello, index.html!</h1>
17 changes: 14 additions & 3 deletions uzumibi-on-cloudflare-spike/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -252,9 +252,20 @@ export default {

const resResult = await exports.uzumibi_start_request();
const resOffset = Number(resResult & 0xFFFFFFFFn);
if (resOffset === 0) {
const errOffset = Number((resResult >> 32n) & 0xFFFFFFFFn);
const buffer = new Uint8Array(exports.memory.buffer, errOffset);
const upperBits = Number((resResult >> 32n) & 0xFFFFFFFFn);

if (upperBits !== 0) {
const upperTag = (upperBits >> 16) & 0xFFFF;
if (upperTag === 0xFEFF) {
// Special route
if (upperBits === 0xFEFFFFFF) {
// Pass through to assets
return env.ASSETS.fetch(request);
}
throw new Error(`Unknown routing bits: 0x${upperBits.toString(16)}`);
}
// Error case
const buffer = new Uint8Array(exports.memory.buffer, upperBits);
let errStr = "";
for (let i = 0; buffer[i] !== 0; i++) {
errStr += String.fromCharCode(buffer[i]);
Expand Down
2 changes: 1 addition & 1 deletion uzumibi-on-cloudflare-spike/wasm-app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ edition = "2024"
crate-type = ["cdylib", "rlib"]

[dependencies]
mrubyedge = { version = ">= 1.1", features = [
mrubyedge = { version = ">= 1.1.10", features = [
"no-wasi",
], default-features = false }
uzumibi-gem = ">= 0.5.0"
Expand Down
Loading