initial: bootstrap from BukidBountyApp base
This commit is contained in:
88
resources/js/composables/useUrlEncoder.js
Normal file
88
resources/js/composables/useUrlEncoder.js
Normal file
@@ -0,0 +1,88 @@
|
||||
// resources/js/composables/useUrlEncoder.js
|
||||
// Utility for encoding/decoding hashkeys and payloads in URLs
|
||||
|
||||
/**
|
||||
* Encode a hashkey value to URL format: h:HASHKEY
|
||||
*/
|
||||
export function encodeHash(hashkey) {
|
||||
if (!hashkey) return null;
|
||||
// Base64 encode the hashkey for URL safety
|
||||
try {
|
||||
const encoded = btoa(encodeURIComponent(hashkey));
|
||||
return `h:${encoded}`;
|
||||
} catch (e) {
|
||||
console.error('[encodeHash] Error encoding hash:', e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode a payload object to URL format: e:BASE64_JSON
|
||||
*/
|
||||
export function encodePayload(payload) {
|
||||
if (!payload) return null;
|
||||
try {
|
||||
const json = JSON.stringify(payload);
|
||||
const encoded = btoa(encodeURIComponent(json));
|
||||
return `e:${encoded}`;
|
||||
} catch (e) {
|
||||
console.error('[encodePayload] Error encoding payload:', e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode a hashkey from URL format
|
||||
*/
|
||||
export function decodeHash(encodedValue) {
|
||||
if (!encodedValue || !encodedValue.startsWith('h:')) return null;
|
||||
|
||||
const parts = encodedValue.split(':');
|
||||
if (parts.length < 2) return null;
|
||||
|
||||
try {
|
||||
// Remove the 'h:' prefix and decode
|
||||
const base64 = encodedValue.substring(2);
|
||||
// First decode from base64, then decode URI components
|
||||
const decoded = atob(base64);
|
||||
return decodeURIComponent(decoded);
|
||||
} catch (e) {
|
||||
console.error('[decodeHash] Error decoding hash:', e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode a payload from URL format
|
||||
*/
|
||||
export function decodePayload(encodedValue) {
|
||||
if (!encodedValue || !encodedValue.startsWith('e:')) return null;
|
||||
|
||||
const parts = encodedValue.split(':');
|
||||
if (parts.length < 2) return null;
|
||||
|
||||
try {
|
||||
// Remove the 'e:' prefix and decode
|
||||
const base64 = encodedValue.substring(2);
|
||||
// First decode from base64, then parse JSON
|
||||
const decodedJson = atob(base64);
|
||||
return JSON.parse(decodedJson);
|
||||
} catch (e) {
|
||||
console.error('[decodePayload] Error decoding payload:', e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a value is a hashkey encoding
|
||||
*/
|
||||
export function isHashKeyFormat(value) {
|
||||
return typeof value === 'string' && value.startsWith('h:');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a value is a payload encoding
|
||||
*/
|
||||
export function isPayloadFormat(value) {
|
||||
return typeof value === 'string' && value.startsWith('e:');
|
||||
}
|
||||
Reference in New Issue
Block a user