diff --git a/Cargo.lock b/Cargo.lock
index 7586cbc572..c684e2770c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1313,6 +1313,7 @@ dependencies = [
"env_logger",
"executable-path",
"hex",
+ "http",
"integer-cbrt",
"integer-sqrt",
"jsonrpc",
@@ -1330,6 +1331,7 @@ dependencies = [
"reqwest",
"tempfile",
"tokio",
+ "tower-http",
"unindent",
]
diff --git a/Cargo.toml b/Cargo.toml
index acd82ca4fe..00704adb03 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -19,6 +19,7 @@ derive_more = "0.99.17"
dirs = "4.0.0"
env_logger = "0.9.0"
executable-path = "1.0.0"
+http = "0.2.6"
integer-cbrt = "0.1.2"
integer-sqrt = "0.1.5"
jsonrpc = "0.12.1"
@@ -28,6 +29,7 @@ ord-lmdb-zero = "0.4.5"
rayon = "1.5.1"
redb = { version = "0.0.5", optional = true }
tokio = { version = "1.17.0", features = ["rt-multi-thread"] }
+tower-http = { version = "0.2.5", features = ["cors"] }
[dev-dependencies]
criterion = "0.3.5"
diff --git a/docs/.prettierrc b/docs/.prettierrc
new file mode 100644
index 0000000000..0a725205c8
--- /dev/null
+++ b/docs/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "trailingComma": "es5",
+ "tabWidth": 2,
+ "semi": true,
+ "singleQuote": true
+}
diff --git a/docs/index.html b/docs/index.html
index 935979fcf2..9c96cd8875 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1 +1,17 @@
-
THERE WILL ONLY EVER BE 2,099,999,997,690,000 ORDINALS
+
+
+
+ Ordinals
+
+
+ THERE WILL ONLY EVER BE 2,099,999,997,690,000 ORDINALS
+ List
+
+
+
+
diff --git a/docs/index.js b/docs/index.js
new file mode 100644
index 0000000000..f4a5164f07
--- /dev/null
+++ b/docs/index.js
@@ -0,0 +1,30 @@
+async function list(outpoint) {
+ document.getElementById('result').innerHTML = '';
+
+ try {
+ const response = await fetch(
+ `http://api.ordinals.com:8000/list/${outpoint}`
+ );
+
+ if (!response.ok) {
+ const text = await response.text();
+ document.getElementById(
+ 'result'
+ ).innerHTML = `${response.statusText}: ${text}`;
+ return;
+ }
+
+ const ranges = await response.json();
+
+ document.getElementById('result').innerHTML = ranges
+ .map((range) => `[${range[0]}, ${range[1]})
`)
+ .join('');
+ } catch (error) {
+ document.getElementById('result').innerHTML = `Exception: ${error}`;
+ }
+}
+
+document.getElementById('form').addEventListener('submit', (e) => {
+ e.preventDefault();
+ list(document.getElementById('outpoint').value);
+});
diff --git a/src/main.rs b/src/main.rs
index 970597c113..da0c9cb45a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -38,6 +38,7 @@ use {
time::{Duration, Instant},
},
tokio::runtime::Runtime,
+ tower_http::cors::{Any, CorsLayer},
};
#[cfg(feature = "redb")]
diff --git a/src/subcommand/server.rs b/src/subcommand/server.rs
index 89f2d6d47f..64c6057a68 100644
--- a/src/subcommand/server.rs
+++ b/src/subcommand/server.rs
@@ -16,9 +16,17 @@ impl Server {
let app = Router::new()
.route("/list/:outpoint", get(Self::list))
.route("/status", get(Self::status))
- .layer(extract::Extension(Arc::new(Mutex::new(index))));
-
- let addr = (self.address, self.port).to_socket_addrs()?.next().unwrap();
+ .layer(extract::Extension(Arc::new(Mutex::new(index))))
+ .layer(
+ CorsLayer::new()
+ .allow_methods([http::Method::GET])
+ .allow_origin(Any),
+ );
+
+ let addr = (self.address, self.port)
+ .to_socket_addrs()?
+ .next()
+ .ok_or_else(|| anyhow!("Failed to get socket addrs"))?;
let handle = Handle::new();