mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-03 01:41:44 +00:00
- **deps: remove tigerbeetle-go dependency** - **refactor: remove unused landing page components and models** - **feat: add pin and publish vault handlers** - **refactor: move payment and credential services to webui browser package** - **refactor: remove unused credentials management components** - **feat: add landing page components and middleware for credentials and payments** - **refactor: remove unused imports in vault config** - **refactor: remove unused bank, DID, and DWN gRPC clients** - **refactor: rename client files and improve code structure** - **feat: add session middleware helpers and landing page components** - **feat: add user profile registration flow** - **feat: Implement WebAuthn registration flow** - **feat: add error view for users without WebAuthn devices** - **chore: update htmx to include extensions** - **refactor: rename pin handler to claim handler and update routes** - **chore: update import paths after moving UI components and styles** - **fix: address potential server errors by handling and logging them properly** - **refactor: move vault config to gateway package and update related dependencies** - **style: simplify form styling and remove unnecessary components** - **feat: improve UI design for registration flow** - **feat: implement passkey-based authentication** - **refactor: migrate registration forms to use reusable form components** - **refactor: remove tailwindcss setup and use CDN instead** - **style: update submit button style to use outline variant** - **refactor: refactor server and IPFS client, remove MPC encryption** - **refactor: Abstract keyshare functionality and improve message encoding** - **refactor: improve keyset JSON marshaling and error handling** - **feat: add support for digital signatures using MPC keys** - **fix: Refactor MarshalJSON to use standard json.Marshal for Message serialization** - **fix: Encode messages before storing in keyshare structs** - **style: update form input styles for improved user experience** - **refactor: improve code structure in registration handlers** - **refactor: consolidate signer middleware and IPFS interaction** - **refactor: rename MPC signing and refresh protocol functions** - **refactor: update hway configuration loading mechanism** - **feat: integrate database support for sessions and users** - **refactor: remove devnet infrastructure and simplify build process** - **docs(guides): add Sonr DID module guide** - **feat: integrate progress bar into registration form** - **refactor: migrate WebAuthn dependencies to protocol package** - **feat: enhance user registration with passkey integration and improved form styling** - **refactor: move gateway view handlers to internal pages package** - **refactor: Move address package to MPC module** - **feat: integrate turnstile for registration** - **style: remove unnecessary size attribute from buttons** - **refactor: rename cookie package to session/cookie** - **refactor: remove unnecessary types.Session dependency** - **refactor: rename pkg/core to pkg/chain** - **refactor: simplify deployment process by removing testnet-specific Taskfile and devbox configuration** - **feat: add error redirect functionality and improve routes** - **feat: implement custom error handling for gateway** - **chore: update version number to 0.0.7 in template** - **feat: add IPFS client implementation** - **feat: Implement full IPFS client interface with comprehensive methods** - **refactor: improve IPFS client path handling** - **refactor: Move UCAN middleware to controller package** - **feat: add UCAN middleware to motr** - **refactor: update libp2p dependency** - **docs: add UCAN specification document** - **refactor: move UCAN controller logic to common package** - **refactor: rename exports.go to common.go** - **feat: add UCAN token support** - **refactor: migrate UCAN token parsing to dedicated package** - **refactor: improve CometBFT and app config initialization** - **refactor: improve deployment scripts and documentation** - **feat: integrate IPFS and producer middleware** - **refactor: rename agent directory to aider** - **fix: correct libp2p import path** - **refactor: remove redundant dependency** - **cleanup: remove unnecessary test files** - **refactor: move attention types to crypto/ucan package** - **feat: expand capabilities and resource types for UCANs** - **refactor: rename sonr.go to codec.go and update related imports** - **feat: add IPFS-based token store** - **feat: Implement IPFS-based token store with caching and UCAN integration** - **feat: Add dynamic attenuation constructor for UCAN presets** - **fix: Handle missing or invalid attenuation data with EmptyAttenuation** - **fix: Update UCAN attenuation tests with correct capability types** - **feat: integrate UCAN-based authorization into the producer middleware** - **refactor: remove unused dependency on go-ucan** - **refactor: Move address handling logic to DID module** - **feat: Add support for compressed and uncompressed Secp256k1 public keys in didkey** - **test: Add test for generating DID key from MPC keyshares** - **feat: Add methods for extracting compressed and uncompressed public keys in share types** - **feat: Add BaseKeyshare struct with public key conversion methods** - **refactor: Use compressed and uncompressed public keys in keyshare, fix public key usage in tests and verification** - **feat: add support for key generation policy type** - **fix: correct typo in VaultPermissions constant** - **refactor: move JWT related code to ucan package** - **refactor: move UCAN JWT and source code to spec package**
259 lines
6.2 KiB
JavaScript
259 lines
6.2 KiB
JavaScript
// Cache names for different types of resources
|
|
const CACHE_NAMES = {
|
|
wasm: 'wasm-cache-v1',
|
|
static: 'static-cache-v1',
|
|
dynamic: 'dynamic-cache-v1'
|
|
};
|
|
|
|
// Import required scripts
|
|
importScripts(
|
|
"https://cdn.jsdelivr.net/gh/golang/go@go1.22.5/misc/wasm/wasm_exec.js",
|
|
"https://cdn.jsdelivr.net/gh/nlepage/go-wasm-http-server@v1.1.0/sw.js",
|
|
);
|
|
|
|
// Initialize WASM HTTP listener
|
|
const wasmInstance = registerWasmHTTPListener("https://cdn.sonr.id/wasm/app.wasm");
|
|
|
|
// MessageChannel port for WASM communication
|
|
let wasmPort;
|
|
|
|
// Request queue for offline operations
|
|
let requestQueue = new Map();
|
|
|
|
// Setup message channel handler
|
|
self.addEventListener('message', async (event) => {
|
|
if (event.data.type === 'PORT_INITIALIZATION') {
|
|
wasmPort = event.data.port;
|
|
setupWasmCommunication();
|
|
}
|
|
});
|
|
|
|
function setupWasmCommunication() {
|
|
wasmPort.onmessage = async (event) => {
|
|
const { type, data } = event.data;
|
|
|
|
switch (type) {
|
|
case 'WASM_REQUEST':
|
|
handleWasmRequest(data);
|
|
break;
|
|
case 'SYNC_REQUEST':
|
|
processSyncQueue();
|
|
break;
|
|
}
|
|
};
|
|
|
|
// Notify that WASM is ready
|
|
wasmPort.postMessage({ type: 'WASM_READY' });
|
|
}
|
|
|
|
// Enhanced install event
|
|
self.addEventListener("install", (event) => {
|
|
event.waitUntil(
|
|
Promise.all([
|
|
skipWaiting(),
|
|
// Cache WASM binary and essential resources
|
|
caches.open(CACHE_NAMES.wasm).then(cache =>
|
|
cache.addAll([
|
|
'https://cdn.sonr.id/wasm/app.wasm',
|
|
'https://cdn.jsdelivr.net/gh/golang/go@go1.22.5/misc/wasm/wasm_exec.js'
|
|
])
|
|
)
|
|
])
|
|
);
|
|
});
|
|
|
|
// Enhanced activate event
|
|
self.addEventListener("activate", (event) => {
|
|
event.waitUntil(
|
|
Promise.all([
|
|
clients.claim(),
|
|
// Clean up old caches
|
|
caches.keys().then(keys =>
|
|
Promise.all(
|
|
keys.map(key => {
|
|
if (!Object.values(CACHE_NAMES).includes(key)) {
|
|
return caches.delete(key);
|
|
}
|
|
})
|
|
)
|
|
)
|
|
])
|
|
);
|
|
});
|
|
|
|
// Intercept fetch events
|
|
self.addEventListener('fetch', (event) => {
|
|
const request = event.request;
|
|
|
|
// Handle API requests differently from static resources
|
|
if (request.url.includes('/api/')) {
|
|
event.respondWith(handleApiRequest(request));
|
|
} else {
|
|
event.respondWith(handleStaticRequest(request));
|
|
}
|
|
});
|
|
|
|
async function handleApiRequest(request) {
|
|
try {
|
|
// Try to make the request
|
|
const response = await fetch(request.clone());
|
|
|
|
// If successful, pass through WASM handler
|
|
if (response.ok) {
|
|
return await processWasmResponse(request, response);
|
|
}
|
|
|
|
// If offline or failed, queue the request
|
|
await queueRequest(request);
|
|
|
|
// Return cached response if available
|
|
const cachedResponse = await caches.match(request);
|
|
if (cachedResponse) {
|
|
return cachedResponse;
|
|
}
|
|
|
|
// Return offline response
|
|
return new Response(
|
|
JSON.stringify({ error: 'Currently offline' }),
|
|
{
|
|
status: 503,
|
|
headers: { 'Content-Type': 'application/json' }
|
|
}
|
|
);
|
|
} catch (error) {
|
|
await queueRequest(request);
|
|
return new Response(
|
|
JSON.stringify({ error: 'Request failed' }),
|
|
{
|
|
status: 500,
|
|
headers: { 'Content-Type': 'application/json' }
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
async function handleStaticRequest(request) {
|
|
// Check cache first
|
|
const cachedResponse = await caches.match(request);
|
|
if (cachedResponse) {
|
|
return cachedResponse;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(request);
|
|
|
|
// Cache successful responses
|
|
if (response.ok) {
|
|
const cache = await caches.open(CACHE_NAMES.static);
|
|
cache.put(request, response.clone());
|
|
}
|
|
|
|
return response;
|
|
} catch (error) {
|
|
// Return offline page for navigation requests
|
|
if (request.mode === 'navigate') {
|
|
return caches.match('/offline.html');
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async function processWasmResponse(request, response) {
|
|
// Clone the response before processing
|
|
const responseClone = response.clone();
|
|
|
|
try {
|
|
// Process through WASM
|
|
const processedResponse = await wasmInstance.processResponse(responseClone);
|
|
|
|
// Notify client through message channel
|
|
if (wasmPort) {
|
|
wasmPort.postMessage({
|
|
type: 'RESPONSE',
|
|
requestId: request.headers.get('X-Wasm-Request-ID'),
|
|
response: processedResponse
|
|
});
|
|
}
|
|
|
|
return processedResponse;
|
|
} catch (error) {
|
|
console.error('WASM processing error:', error);
|
|
return response;
|
|
}
|
|
}
|
|
|
|
async function queueRequest(request) {
|
|
const serializedRequest = await serializeRequest(request);
|
|
requestQueue.set(request.url, serializedRequest);
|
|
|
|
// Register for background sync
|
|
try {
|
|
await self.registration.sync.register('wasm-sync');
|
|
} catch (error) {
|
|
console.error('Sync registration failed:', error);
|
|
}
|
|
}
|
|
|
|
async function serializeRequest(request) {
|
|
const headers = {};
|
|
for (const [key, value] of request.headers.entries()) {
|
|
headers[key] = value;
|
|
}
|
|
|
|
return {
|
|
url: request.url,
|
|
method: request.method,
|
|
headers,
|
|
body: await request.text(),
|
|
timestamp: Date.now()
|
|
};
|
|
}
|
|
|
|
// Handle background sync
|
|
self.addEventListener('sync', (event) => {
|
|
if (event.tag === 'wasm-sync') {
|
|
event.waitUntil(processSyncQueue());
|
|
}
|
|
});
|
|
|
|
async function processSyncQueue() {
|
|
const requests = Array.from(requestQueue.values());
|
|
|
|
for (const serializedRequest of requests) {
|
|
try {
|
|
const response = await fetch(new Request(serializedRequest.url, {
|
|
method: serializedRequest.method,
|
|
headers: serializedRequest.headers,
|
|
body: serializedRequest.body
|
|
}));
|
|
|
|
if (response.ok) {
|
|
requestQueue.delete(serializedRequest.url);
|
|
|
|
// Notify client of successful sync
|
|
if (wasmPort) {
|
|
wasmPort.postMessage({
|
|
type: 'SYNC_COMPLETE',
|
|
url: serializedRequest.url
|
|
});
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Sync failed for request:', error);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Handle payment requests
|
|
self.addEventListener("canmakepayment", function (e) {
|
|
e.respondWith(Promise.resolve(true));
|
|
});
|
|
|
|
// Handle periodic sync if available
|
|
self.addEventListener('periodicsync', (event) => {
|
|
if (event.tag === 'wasm-sync') {
|
|
event.waitUntil(processSyncQueue());
|
|
}
|
|
});
|
|
|