Ugrás a tartalomra
kassza

Munkamenet (session cookie)

A Számla Agent minden kérésnél hitelesít, ami időbe kerül. Ha viszont a kliens visszaküldi az előző válaszban kapott munkameneti sütit (JSESSIONID), a Számlázz.hu a meglévő munkamenetet használja, és gyorsabban válaszol. A süti tárolása a hívó fél dolga. A kasszában ez automatikus.

Mit csinál a kassza?#

  1. Az első kérésnél nincs tárolt süti, a Számlázz.hu új munkamenetet nyit, és a válasz Set-Cookie fejlécében visszaadja a sütit.
  2. A kassza elmenti a sütit a cookieStore-ba.
  3. A következő kéréseknél a kassza a Cookie fejlécben visszaküldi, és ha a Számlázz.hu frissíti, felülírja a tároltat.
  4. Hitelesítési hibánál (auth kategória) a kassza törli a tárolt sütit, így a következő kérés tiszta lappal indul.

A Számlázz.hu 90 perc tétlenség után törli a munkamenetet. A kassza a sütit 85 percig tartja meg, így nem küld vissza lejárt munkamenetet.

Hosszan futó szerveren#

Node.js szerveren, Bunon vagy Denón nincs teendőd. Az alapértelmezett tároló a memóriában van, és addig él, amíg a folyamat. Ehhez a klienst egyszer hozd létre, és mindenhol ugyanazt használd:

lib/kassza.ts
import { createKassza } from 'kassza'

export const kassza = createKassza()

Serverless és edge#

Vercel Functions, AWS Lambda vagy Cloudflare Workers alatt a példányok jönnek-mennek, a memória nem közös. Ilyenkor adj meg közös tárolót a kassza/cookie-stores modulból:

import { Redis } from '@upstash/redis'
import { createKassza } from 'kassza'
import { upstashRedisCookieStore } from 'kassza/cookie-stores'

export const kassza = createKassza({
  cookieStore: upstashRedisCookieStore(Redis.fromEnv()),
})

A Cloudflare KV legalább 60 másodperces lejáratot fogad el, ezt az adapter magától betartja.

Saját tároló#

Bármilyen kulcs-érték tárolót bekötheted, ha megírod a get, set és delete függvényt. A set harmadik paramétere a lejárat másodpercben.

import { customCookieStore } from 'kassza/cookie-stores'

const cookieStore = customCookieStore(
  {
    get: (key) => db.session.findValue(key),
    set: (key, value, ttlSeconds) => db.session.upsert(key, value, ttlSeconds),
    delete: (key) => db.session.remove(key),
  },
  { prefix: 'webshop:', timeoutMs: 300 },
)

Közös session több kliens között

Egyedi cookie store: a második kliens is újrahasznosítja a session cookie-t.

Futtatás a sandboxban
munkamenet.ts
import {  } from 'kassza'
import {  } from 'kassza/cookie-stores'
import {  } from 'kassza-sandbox'

const  = new <string, string>()

const  = ({
  : () => .(),
  : (, ) => {
    .(, )
  },
  : () => {
    .()
  },
})

const  = ({  })
const  = ({  })

await ..({ : 'REND-1' })
await ..({ : 'REND-2' })

.(
  .calls.map(() => ({
    : .action,
    : .sessionReused,
  })),
)
.('A tárolt kulcs:', [....()])

Ha a tároló nem elérhető#

A munkamenet csak gyorsítás, ezért a tároló hibája nem akaszthatja meg a számlázást. Ha a Redis vagy a KV nem válaszol, a kassza munkamenet nélkül küldi el a kérést. Az adapterek alapból figyelmeztetést írnak a konzolra, ezt az onError opcióval a saját naplódba irányíthatod:

OpcióAlapértékLeírás
prefixElőtag minden tárolókulcs elé.
timeoutMsnincsEnnyi idő után a tároló műveletét sikertelennek veszi.
onErrorconsole.warnHívódik, ha a tároló hibát dob vagy túllépi az időkorlátot.
resilienttruefalse esetén a tároló hibája a hívóhoz is eljut.

Munkamenet törlése#

Ha a Számlázz.hu felületén módosítod a fiók adatait, például a cégnevet vagy az e-mail címet, a változás csak új munkamenetben érvényesül. Ilyenkor hívd meg a resetSession() metódust:

await kassza.resetSession()

Ha egyáltalán nem szeretnél munkamenetet, add meg a cookieStore: false opciót. Ekkor minden kérés teljes hitelesítéssel fut, ami nagy forgalomnál érezhetően lassabb.

Oldal szerkesztéseUtoljára frissítve: