Created
September 18, 2024 14:19
-
-
Save neves/1088e24bbda5dcc9aaa8430533ebb282 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type SyncPayload = { | |
changes: { | |
participants: { | |
updated: {id: string, check_in_date: string | null}[] | |
} | |
}, | |
timestamp: number | |
} | |
type CompressedPayload = { | |
c: string, | |
timestamp: number | |
} | |
function compressPayload(payload: SyncPayload): CompressedPayload { | |
function compressId(id: string) { | |
return (+id).toString(36) // comprime número de 7 dígitos para 5 | |
} | |
function compressDate(date: string | null) { | |
if (date === null) return "" | |
// converte a data para número e reduz a quantidade de dígitos | |
return " " + new Date(date).getTime().toString(36) | |
} | |
const c = payload.changes.participants.updated | |
.map(u => compressId(u.id) + compressDate(u.check_in_date)) | |
.join("|") // separar cada participante com pipe | |
return { | |
c, | |
timestamp: payload.timestamp | |
} | |
} | |
function decompressPayload(payload: CompressedPayload): SyncPayload { | |
function decompressId(id: string) { | |
return Number.parseInt(id, 36).toString() | |
} | |
function decompressDate(date: string) { | |
return new Date(Number.parseInt(date, 36)).toUTCString() | |
} | |
const updated = payload.c.split("|").map(p => { | |
const [id, date] = p.split(" ") | |
return { | |
id: decompressId(id), | |
check_in_date: date ? decompressDate(date) : null | |
} | |
}) | |
return { | |
changes: { | |
participants: { | |
updated | |
} | |
}, | |
timestamp: payload.timestamp | |
} | |
} | |
// substituir por um payload maior de 10K inscritos | |
const payload = { | |
"changes": { | |
"events": { | |
"created": [], | |
"updated": [], | |
"deleted": [] | |
}, | |
"participants": { | |
"created": [], | |
"updated": [ | |
{ | |
"id": "5175639", | |
"check_in_date": "Wed, 18 Sep 2024 13:27:41 GMT" | |
}, | |
{ | |
"id": "5175640", | |
"check_in_date": null | |
}, | |
{ | |
"id": "5175641", | |
"check_in_date": new Date().toUTCString() | |
} | |
], | |
"deleted": [] | |
} | |
}, | |
"timestamp": 1726666068808 | |
} | |
const compressed = compressPayload(payload) | |
const sizeBefore = JSON.stringify(payload).length | |
const sizeAfter = JSON.stringify(compressed).length | |
const percentageReduction = Math.round((1 - sizeAfter / sizeBefore) * 100) | |
const times = Math.round(sizeBefore / sizeAfter) | |
console.log(compressed) | |
console.log("Bytes antes de comprimir:", sizeBefore) | |
console.log("Bytes depois de comprimir:", sizeAfter) | |
console.log(`Redução de ${percentageReduction}% ou ${times} vezes menor`) | |
// validar se após compress e decompress, os valores continuam os mesmos | |
const decompressed = decompressPayload(compressed) | |
if (JSON.stringify(decompressed.changes.participants.updated) === | |
JSON.stringify(payload.changes.participants.updated.map( | |
updated => ({id: updated.id, check_in_date: updated.check_in_date})))) { | |
console.log("payload VÁLIDO") | |
} else { | |
console.log("payload inválido") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment