@kraki/head 0.17.0 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,63 @@
1
+ import { safeEqual } from './auth.js';
2
+ export function handleVoiceSettlement(storage, settlementKey, request) {
3
+ const token = request.authorization?.startsWith('Bearer ')
4
+ ? request.authorization.slice(7)
5
+ : '';
6
+ if (!token || !settlementKey || !safeEqual(token, settlementKey)) {
7
+ return { status: 401, body: { error: 'unauthorized' } };
8
+ }
9
+ let input;
10
+ try {
11
+ input = JSON.parse(request.body);
12
+ }
13
+ catch {
14
+ return { status: 400, body: { error: 'invalid_json' } };
15
+ }
16
+ if ((input.action !== 'activate' && input.action !== 'settle')
17
+ || typeof input.jti !== 'string' || input.jti.length < 8 || input.jti.length > 128
18
+ || typeof input.activationId !== 'string'
19
+ || input.activationId.length < 8 || input.activationId.length > 128) {
20
+ return { status: 400, body: { error: 'invalid_request' } };
21
+ }
22
+ if (input.action === 'activate') {
23
+ const result = storage.activateVoiceLease({
24
+ jti: input.jti,
25
+ activationId: input.activationId,
26
+ });
27
+ if (result.status === 'not_found')
28
+ return { status: 404, body: { error: 'not_found' } };
29
+ if (result.status === 'expired')
30
+ return { status: 409, body: { error: 'lease_expired' } };
31
+ if (result.status === 'wrong_day')
32
+ return { status: 409, body: { error: 'lease_wrong_day' } };
33
+ if (result.status === 'revoked')
34
+ return { status: 409, body: { error: 'lease_revoked' } };
35
+ if (result.status === 'conflict')
36
+ return { status: 409, body: { error: 'activation_conflict' } };
37
+ return { status: 200, body: { ok: true, activationStatus: result.status } };
38
+ }
39
+ if (typeof input.audioSeconds !== 'number' || !Number.isFinite(input.audioSeconds)
40
+ || input.audioSeconds < 0) {
41
+ return { status: 400, body: { error: 'invalid_request' } };
42
+ }
43
+ const result = storage.settleVoiceLease({
44
+ jti: input.jti,
45
+ activationId: input.activationId,
46
+ audioSeconds: input.audioSeconds,
47
+ reason: typeof input.reason === 'string' ? input.reason : undefined,
48
+ });
49
+ if (result.status === 'not_found') {
50
+ return { status: 404, body: { error: 'not_found' } };
51
+ }
52
+ if (result.status === 'not_activated') {
53
+ return { status: 409, body: { error: 'not_activated' } };
54
+ }
55
+ if (result.status === 'conflict') {
56
+ return { status: 409, body: { error: 'settlement_conflict' } };
57
+ }
58
+ return {
59
+ status: 200,
60
+ body: { ok: true, usedSeconds: result.usedSeconds, settlementStatus: result.status },
61
+ };
62
+ }
63
+ //# sourceMappingURL=voice-settlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-settlement.js","sourceRoot":"","sources":["../src/voice-settlement.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kraki/head",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "description": "Kraki relay server — the brain that routes messages between tentacles and apps",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,14 +24,14 @@
24
24
  "kraki-relay": "dist/cli.js"
25
25
  },
26
26
  "dependencies": {
27
- "@coinfra/pulse": "^0.4.1",
27
+ "@coinfra/pulse": "^0.5.0",
28
28
  "better-sqlite3": "^11.0.0",
29
29
  "dotenv": "^17.3.1",
30
30
  "uuid": "^13.0.0",
31
31
  "web-push": "^3.6.7",
32
32
  "ws": "^8.19.0",
33
33
  "@kraki/crypto": "0.2.1",
34
- "@kraki/protocol": "0.20.0"
34
+ "@kraki/protocol": "0.21.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/better-sqlite3": "^7.6.0",