Flamecloak for Python
Standard library only (urllib), Python 3.9+, typed. Installed as
flamecloak-sdk, imported as flamecloak_sdk.
pip install flamecloak-sdk
The developer guide, every status, and what to check before shipping: the Flamecloak developer guide.
import os
from flamecloak_sdk import Flamecloak
flamecloak = Flamecloak(os.environ["FLAMECLOAK_KEY"])
decision = flamecloak.authorize(
"refund",
resource=f"payment:{payment_id}",
agent="support-bot",
parameters={"amount": 1200},
)
if decision.allowed:
refund = stripe.Refund.create(payment_intent=payment_id, amount=1200, idempotency_key=decision.decision_id)
decision.done("succeeded", reference=refund.id) # optional
Code that cannot wait (a request handler, a queue worker) asks without waiting and keeps the id:
asked = flamecloak.authorize("refund", parameters={"amount": 1200}, wait=False)
if asked.status == "pending":
save_job(decision_id=asked.decision_id)
# later
decision = flamecloak.collect(decision_id) # or flamecloak.wait(decision_id, max_wait_seconds=60)
Resuming the job when a person decides
Ask without waiting, with your job's own id as the idempotency key:
asked = flamecloak.authorize("refund", parameters={"amount": 1200}, idempotency_key=job.id, wait=False)
and resume it from the notice (see Notices).
verify_webhook needs the RAW body (request.get_data() in Flask,
await request.body() in Starlette):
from flask import request
from flamecloak_sdk import FlamecloakWebhookError, verify_webhook
@app.post("/flamecloak/notices")
def notice():
try:
event = verify_webhook(
request.get_data(),
request.headers.get("flamecloak-signature"),
os.environ["FLAMECLOAK_WEBHOOK_SECRET"],
)
except FlamecloakWebhookError: # .code says why
return "", 400
if event.decision_id is not None and event.idempotency_key is not None:
job = jobs.find(event.idempotency_key)
if job is not None:
# THE NOTICE IS NOT THE PERMISSION; collect is, once.
decision = flamecloak.collect(event.decision_id)
if decision.allowed:
refund(job, idempotency_key=event.decision_id)
elif decision.status != "used": # denied, expired, stale
jobs.close(job, decision.status)
# "used": this notice came again after the job ran. Nothing to do.
return "", 200
A retried notice is harmless: its second collect answers used.
Flamecloak(key, base_url=None, timeout=10.0). base_url only for a key with
no address or a self-hosted gateway; timeout is one request's, in seconds (a
long-poll gets it on top of its wait). One client per process is enough, and it
is safe to share between threads.
authorize() also takes idempotency_key and max_wait_seconds. Errors are
FlamecloakError, with .status set to the gateway's HTTP status, or None
for a key that is not one.
What every status means, what raises, and what to check before shipping: the developer guide.
Apache License 2.0.
Metadata
Release files for flamecloak-sdk 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| flamecloak_sdk-0.1.0.tar.gz | 16.8 kB | Without provenance | Details for flamecloak_sdk-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| flamecloak_sdk-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for flamecloak_sdk-0.1.0-py3-none-any.whl |
Total release size: 32.3 kB
Release files / flamecloak_sdk-0.1.0.tar.gz
| Download URL | flamecloak_sdk-0.1.0.tar.gz |
|---|---|
| Size | 16.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
47d2924b57348e4dbf14a5b09ec5cca3e11aa8df2982342ba571e7c86bce9474
|
|
BLAKE2b-256 checksum How to use checksums |
8a86b84da59f69fba17ac46d2f40faab82e9837a0532d330d425c30a3ba3f720
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.2
|
Release files / flamecloak_sdk-0.1.0-py3-none-any.whl
| Download URL | flamecloak_sdk-0.1.0-py3-none-any.whl |
|---|---|
| Size | 15.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b84b374b85e6931f3cdfdf1ec1a19c11e13478f370ce817d2a8c1fd7a782dc9e
|
|
BLAKE2b-256 checksum How to use checksums |
73990e4644d24801990afa0847d60fc590c43a52e5754d8abd032f0591e54860
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.2
|
Security for flamecloak-sdk 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.