Posodabljaj sporočila v živo
Ni nujno, da sporočilo ostane tako, kot je bilo objavljeno. Pokaži napredek, medtem ko opravilo teče, zamenjaj indikator nalaganja z rezultatom, odstrani gumbe, ko se je kdo odločil, ali sporočilo izbriši. Vsi v kanalu spremembo vidijo takoj.
Kaj lahko narediš
- Posodobi karticoSpremeni besedilo, barvo in gumbe, kar na istem mestu.
- Pokaži napredekIndikator nalaganja, ki gre skozi korake, nato pa rezultat.
- Izbriši gaOdstrani sporočilo, ko ne drži več.
- Prisluhni muOdgovori, reakcije in pritiski gumbov na tvojem sporočilu, v živo.
V aplikaciji
Objavljeno z indikatorjem nalaganja
Posodobljeno: korak 2 od 3
Posodobljeno: končano, z gumbom
Eno sporočilo, dvakrat posodobljeno prek njegovega callback URL-ja. Nihče ne vidi treh sporočil, le eno, ki se spreminja.
Hiter začetek
Shrani callback URL
Vsaka objava prek webhooka in vsaka zahteva ukaza prinese
callback_urlza to sporočilo.bashBODY='{"message_container": {"color": "blue", "loader": true, "loader_text": "Deploying…"}}' SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$MSSGS_WEBHOOK_SECRET" | sed 's/^.* //') curl -X POST "$MSSGS_WEBHOOK_URL" -H "Content-Type: application/json" \ -H "X-Mssgs-Signature: sha256=$SIG" -d "$BODY" # {"success": true, "message_id": "...", "callback_url": "https://mss.gs/api/v1/trigger-callback/8f14e45f-..."}PUT za posodobitev
Pošlji novo stanje. Kartica se spremeni na mestu, za vse.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'DELETE za odstranitev
Telo ni potrebno.
bashcurl -X DELETE "$CALLBACK_URL"
Posodobi sporočilo
Pošlji JSON z metodo PUT na callback_url. Pošlji samo tisto, kar želiš spremeniti.
| Polje | Tip | Kaj naredi |
|---|---|---|
message_container | object | Nova kartica. Glej kartice sporočil. |
actions | array | Novi gumbi. "actions": [] jih odstrani vse; če polje izpustiš, ostanejo. |
content | string | Novo besedilo. |
title, description, color, loader, ... | string | Okrajšava: polja kartice na najvišji ravni se samodejno zavijejo v kartico. |
message_container v celoti zamenja staro kartico: polje, ki ga izpustiš, izgine. Ohranijo se le njen tip, ime in avatar. Zato vsakič pošlji celotno kartico.Odgovori
| Status | Koda | Pomen |
|---|---|---|
200 | {"success": true} | Sprejeto. Posodobitev sledi takoj zatem. |
400 | MISSING_FIELDS | V telesu ni ničesar za posodobitev. |
400 | INVALID_BODY | Telo ni veljaven JSON. |
400 | koda gumba | Z gumbom je nekaj narobe, glej gumbe. |
401 | INVALID_TOKEN | URL ni veljaven. |
404 | TOKEN_NOT_FOUND | URL je potekel ali pa je bil uporabljen za brisanje sporočila. |
502 | PUBLISH_FAILED | Posodobitve ni bilo mogoče dostaviti. Poskusi znova. |
Kako dolgo deluje
30 minut od trenutka, ko je bilo sporočilo objavljeno ali je bil ukaz uporabljen. Posodobitev tega časa ne podaljša. Z izbrisom sporočila se URL porabi. Datotek s posodobitvijo ni mogoče dodati.
Pokaži napredek
Objavi kartico z indikatorjem nalaganja, med potekom opravila posodabljaj njeno podbesedilo in končaj z rezultatom. Indikator je vrtavka z vrstico besedila in manjšo vrstico pod njo (loader_text, loader_sub_text).
const { callback_url } = await post({
message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 1 of 3: building' }
});
const update = (body) => {
return fetch(callback_url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
};
await build();
await update({ message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 2 of 3: running migrations' } });
await migrate();
await update({
message_container: { color: 'green', title: 'Deploy complete', description: 'v2.1 is live on production.' },
actions: [{ type: 'url:https://ci.example.com/deploys/218', text: 'View logs', color: 'green' }]
});Izbriši sporočilo
Pošlji DELETE na callback_url in sporočilo izgine za vse. URL-ja potem ni več mogoče uporabiti.
Prisluhni sporočilu
stream_url je tok v živo (Server-Sent Events) vsega, kar se dogaja s tvojim sporočilom. Odpri ga in dogodki prihajajo sproti, vsak kot vrstica JSON data:, katere type pove, za kaj gre:
curl -N "$STREAM_URL"
data: {"type": "reaction", "message_id": "...", "emoji": ":tada:", "action": "add", "member_guid": "...", "member": {...}, "ts": 1790000000000}
data: {"type": "action", "message_id": "...", "action_id": "approve", "action": {"id": "approve", "payload": {"deploy": 218}, ...}, "member_guid": "...", "member": {...}, "ts": 1790000004200}
data: {"type": "reply", "message_id": "...", "content": "Ship it!", "member_guid": "...", "member": {...}, "ts": 1790000009800}
event: expired
data: {}| Dogodek | Kdaj | Podatki |
|---|---|---|
action | Nekdo je pritisnil gumb. | action_id in shranjeni gumb v action z njegovim payload |
reaction | Reakcija je bila dodana ali odstranjena. | emoji in action: add, remove ali removeall |
reply | Nekdo je odgovoril na sporočilo. | content odgovora |
expired | Tok se zapira. Poslano kot poimenovan dogodek. | Brez |
message_id, kdo je to naredil (member_guid, member) in kdaj (ts). Vrstica s komentarjem vsakih 20 sekund ohranja povezavo odprto.Poslušanje v JavaScriptu
const events = new EventSource(streamUrl);
// Every event arrives as a plain message; its kind is in "type".
events.onmessage = (e) => {
const ev = JSON.parse(e.data);
if ((ev.type === 'action') && (ev.action_id === 'approve')) {
startDeploy(ev.action.payload.deploy);
}
};
// The one named event: the stream is closing.
events.addEventListener('expired', () => {
events.close();
});Kje ga dobiš
| Od kod pride | Odprt |
|---|---|
| Objava prek webhooka z gumbi | 10 minut ali eno uro z "sse_event_extended_timeout": true |
| Vsaka zahteva ukaza | 10 minut |
Napake
| Status | Koda | Pomen |
|---|---|---|
401 | INVALID_TOKEN | Token v URL-ju je napačen. |
404 | NOT_FOUND | Tok je potekel ali pa ni nikoli obstajal. |