Add kv based cache
This commit is contained in:
parent
00a5192d02
commit
19c4660eb8
66
Cargo.lock
generated
66
Cargo.lock
generated
|
@ -32,6 +32,15 @@ version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "android_system_properties"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.73"
|
version = "0.1.73"
|
||||||
|
@ -129,9 +138,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
|
checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"android-tzdata",
|
"android-tzdata",
|
||||||
|
"iana-time-zone",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
|
"time",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -383,7 +395,7 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"libc",
|
"libc",
|
||||||
"wasi",
|
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -422,6 +434,7 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
name = "hn-rss"
|
name = "hn-rss"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
@ -500,6 +513,29 @@ dependencies = [
|
||||||
"tokio-native-tls",
|
"tokio-native-tls",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iana-time-zone"
|
||||||
|
version = "0.1.57"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
|
||||||
|
dependencies = [
|
||||||
|
"android_system_properties",
|
||||||
|
"core-foundation-sys",
|
||||||
|
"iana-time-zone-haiku",
|
||||||
|
"js-sys",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"windows",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iana-time-zone-haiku"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ident_case"
|
name = "ident_case"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
|
@ -605,7 +641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
|
checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"wasi",
|
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1129,6 +1165,17 @@ dependencies = [
|
||||||
"syn 2.0.29",
|
"syn 2.0.29",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time"
|
||||||
|
version = "0.1.45"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"wasi 0.10.0+wasi-snapshot-preview1",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tinyvec"
|
name = "tinyvec"
|
||||||
version = "1.6.0"
|
version = "1.6.0"
|
||||||
|
@ -1262,6 +1309,12 @@ dependencies = [
|
||||||
"try-lock",
|
"try-lock",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasi"
|
||||||
|
version = "0.10.0+wasi-snapshot-preview1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.11.0+wasi-snapshot-preview1"
|
version = "0.11.0+wasi-snapshot-preview1"
|
||||||
|
@ -1379,6 +1432,15 @@ version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows"
|
||||||
|
version = "0.48.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.48.0"
|
version = "0.48.0"
|
||||||
|
|
|
@ -8,6 +8,9 @@ reqwest = "0.11"
|
||||||
rss = "2.0"
|
rss = "2.0"
|
||||||
regex = "1.5"
|
regex = "1.5"
|
||||||
worker = "0.0.18"
|
worker = "0.0.18"
|
||||||
|
chrono = "0.4.26"
|
||||||
|
|
||||||
|
[target.wasm32-unknown-unknown.dependencies]
|
||||||
getrandom = { version = "0.2", features = ["js"] }
|
getrandom = { version = "0.2", features = ["js"] }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|
45
src/lib.rs
45
src/lib.rs
|
@ -1,9 +1,8 @@
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use reqwest::{Error as ReqwestError, StatusCode};
|
use reqwest::Error as ReqwestError;
|
||||||
use rss::{Channel, Error as RssError};
|
use rss::{Channel, Error as RssError};
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
use worker::{console_log, event, kv::KvStore, Env, Headers, Request, Response, Router};
|
||||||
use worker::{event, Env, Headers, Request, Response, Router};
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum CustomError {
|
enum CustomError {
|
||||||
|
@ -28,14 +27,32 @@ pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> worker::Resu
|
||||||
let router = Router::new();
|
let router = Router::new();
|
||||||
router
|
router
|
||||||
.get_async("/", |_, ctx| async move {
|
.get_async("/", |_, ctx| async move {
|
||||||
let rss = match fetch_modified_rss().await {
|
let kv = match ctx.kv("HN") {
|
||||||
Ok(r) => r,
|
Ok(k) => k,
|
||||||
Err(e) => "".to_owned(),
|
Err(e) => panic!("{:?}", e),
|
||||||
|
};
|
||||||
|
|
||||||
|
let rss = match kv.get("feed").text().await {
|
||||||
|
Ok(r) => match r {
|
||||||
|
Some(s) => s,
|
||||||
|
None => {
|
||||||
|
let r = fetch_modified_rss().await.unwrap_or("".to_owned());
|
||||||
|
match set_cache(&kv, &r).await {
|
||||||
|
Some(_) => console_log!("set new rss cache"),
|
||||||
|
None => console_log!("unable to set rss cache"),
|
||||||
|
};
|
||||||
|
r
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Err(e) => {
|
||||||
|
console_log!("{:?}", e);
|
||||||
|
fetch_modified_rss().await.unwrap_or("".to_owned())
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let res = Response::from_bytes(rss.into()).unwrap();
|
let res = Response::from_bytes(rss.into()).unwrap();
|
||||||
let mut headers = Headers::new();
|
let mut headers = Headers::new();
|
||||||
headers.set("content-type", "application/rss+xml");
|
let _ = headers.set("content-type", "application/rss+xml");
|
||||||
|
|
||||||
Ok(res.with_headers(headers))
|
Ok(res.with_headers(headers))
|
||||||
})
|
})
|
||||||
|
@ -43,6 +60,20 @@ pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> worker::Resu
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn set_cache(kv: &KvStore, res: &String) -> Option<bool> {
|
||||||
|
let feed = kv
|
||||||
|
.put("feed", res)
|
||||||
|
.unwrap()
|
||||||
|
.expiration_ttl(1800)
|
||||||
|
.execute()
|
||||||
|
.await;
|
||||||
|
if feed.is_err() {
|
||||||
|
console_log!("{:?}", feed.err());
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
Some(true)
|
||||||
|
}
|
||||||
|
|
||||||
async fn fetch_modified_rss() -> Result<String, CustomError> {
|
async fn fetch_modified_rss() -> Result<String, CustomError> {
|
||||||
let url = "https://news.ycombinator.com/rss";
|
let url = "https://news.ycombinator.com/rss";
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,10 @@ type = "javascript"
|
||||||
workers_dev = true
|
workers_dev = true
|
||||||
compatibility_date = "2022-01-20"
|
compatibility_date = "2022-01-20"
|
||||||
|
|
||||||
|
kv_namespaces = [
|
||||||
|
{ binding = "HN", id = "a30242f65ba34788ab1560f1a9c4eac7", preview_id = "9fd4871334174ceab34d2fd8c0e989cc" }
|
||||||
|
]
|
||||||
|
|
||||||
[vars]
|
[vars]
|
||||||
WORKERS_RS_VERSION = "0.0.18"
|
WORKERS_RS_VERSION = "0.0.18"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue