Preskoči na glavno vsebino
Razvijalci Posodobitve v živo

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

  1. Shrani callback URL

    Vsaka objava prek webhooka in vsaka zahteva ukaza prinese callback_url za to sporočilo.

    bash
    BODY='{"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-..."}
  2. PUT za posodobitev

    Pošlji novo stanje. Kartica se spremeni na mestu, za vse.

    bash
    curl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \
      -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'
  3. DELETE za odstranitev

    Telo ni potrebno.

    bash
    curl -X DELETE "$CALLBACK_URL"

Posodobi sporočilo

Pošlji JSON z metodo PUT na callback_url. Pošlji samo tisto, kar želiš spremeniti.

PoljeTipKaj naredi
message_containerobjectNova kartica. Glej kartice sporočil.
actionsarrayNovi gumbi. "actions": [] jih odstrani vse; če polje izpustiš, ostanejo.
contentstringNovo besedilo.
title, description, color, loader, ...stringOkrajšava: polja kartice na najvišji ravni se samodejno zavijejo v kartico.
Nov 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

StatusKodaPomen
200{"success": true}Sprejeto. Posodobitev sledi takoj zatem.
400MISSING_FIELDSV telesu ni ničesar za posodobitev.
400INVALID_BODYTelo ni veljaven JSON.
400koda gumbaZ gumbom je nekaj narobe, glej gumbe.
401INVALID_TOKENURL ni veljaven.
404TOKEN_NOT_FOUNDURL je potekel ali pa je bil uporabljen za brisanje sporočila.
502PUBLISH_FAILEDPosodobitve 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).

javascript
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:

sse
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: {}
DogodekKdajPodatki
actionNekdo je pritisnil gumb.action_id in shranjeni gumb v action z njegovim payload
reactionReakcija je bila dodana ali odstranjena.emoji in action: add, remove ali removeall
replyNekdo je odgovoril na sporočilo.content odgovora
expiredTok se zapira. Poslano kot poimenovan dogodek.Brez
Dogodki se ne hranijo za pozneje. Odpri tok, takoj ko imaš URL: kar se zgodi, preden se povežeš, ni poslano. Vsak dogodek nosi tudi 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

javascript
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 prideOdprt
Objava prek webhooka z gumbi10 minut ali eno uro z "sse_event_extended_timeout": true
Vsaka zahteva ukaza10 minut

Napake

StatusKodaPomen
401INVALID_TOKENToken v URL-ju je napačen.
404NOT_FOUNDTok je potekel ali pa ni nikoli obstajal.

Gradi naprej