Skip to content

Instantly share code, notes, and snippets.

@neves
Created September 18, 2024 14:19
Show Gist options
  • Save neves/1088e24bbda5dcc9aaa8430533ebb282 to your computer and use it in GitHub Desktop.
Save neves/1088e24bbda5dcc9aaa8430533ebb282 to your computer and use it in GitHub Desktop.
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