@peac/contracts 0.10.8 → 0.10.10

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.
package/LICENSE CHANGED
@@ -175,7 +175,7 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
175
175
 
176
176
  END OF TERMS AND CONDITIONS
177
177
 
178
- Copyright 2025 PEAC Protocol Contributors
178
+ Copyright 2025-2026 PEAC Protocol Contributors
179
179
 
180
180
  Licensed under the Apache License, Version 2.0 (the "License");
181
181
  you may not use this file except in compliance with the License.
package/dist/index.cjs ADDED
@@ -0,0 +1,194 @@
1
+ 'use strict';
2
+
3
+ // src/codes.ts
4
+ var CANONICAL_ERROR_CODES = {
5
+ // Receipt errors (402 - Payment Required)
6
+ RECEIPT_MISSING: "E_RECEIPT_MISSING",
7
+ RECEIPT_INVALID: "E_RECEIPT_INVALID",
8
+ RECEIPT_EXPIRED: "E_RECEIPT_EXPIRED",
9
+ // TAP errors (401 - Authentication)
10
+ TAP_SIGNATURE_MISSING: "E_TAP_SIGNATURE_MISSING",
11
+ TAP_SIGNATURE_INVALID: "E_TAP_SIGNATURE_INVALID",
12
+ TAP_TIME_INVALID: "E_TAP_TIME_INVALID",
13
+ TAP_WINDOW_TOO_LARGE: "E_TAP_WINDOW_TOO_LARGE",
14
+ TAP_TAG_UNKNOWN: "E_TAP_TAG_UNKNOWN",
15
+ TAP_ALGORITHM_INVALID: "E_TAP_ALGORITHM_INVALID",
16
+ TAP_KEY_NOT_FOUND: "E_TAP_KEY_NOT_FOUND",
17
+ // Replay error (409 - Conflict)
18
+ TAP_NONCE_REPLAY: "E_TAP_NONCE_REPLAY",
19
+ // Replay protection required (401 - requires config change)
20
+ TAP_REPLAY_PROTECTION_REQUIRED: "E_TAP_REPLAY_PROTECTION_REQUIRED",
21
+ // Issuer errors (403 - Forbidden)
22
+ ISSUER_NOT_ALLOWED: "E_ISSUER_NOT_ALLOWED",
23
+ // Configuration errors (500 - Server misconfiguration)
24
+ CONFIG_ISSUER_ALLOWLIST_REQUIRED: "E_CONFIG_ISSUER_ALLOWLIST_REQUIRED",
25
+ // Internal errors (500)
26
+ INTERNAL_ERROR: "E_INTERNAL_ERROR"
27
+ };
28
+
29
+ // src/internal/error-codes.ts
30
+ var VALUES = Object.values(CANONICAL_ERROR_CODES);
31
+ var PEAC_ERROR_CODE_SET = new Set(VALUES);
32
+
33
+ // src/index.ts
34
+ var PROBLEM_TYPE_BASE = "https://www.peacprotocol.org/problems";
35
+ var CANONICAL_STATUS_MAPPINGS = {
36
+ // 402 - Payment Required (reserved for payment flows)
37
+ [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 402,
38
+ [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 402,
39
+ [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 402,
40
+ // 401 - Authentication errors
41
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 401,
42
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 401,
43
+ [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 401,
44
+ [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 401,
45
+ [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 401,
46
+ // 400 - Client errors (malformed)
47
+ [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 400,
48
+ [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 400,
49
+ [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 400,
50
+ // 403 - Forbidden (issuer not in allowlist)
51
+ [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 403,
52
+ // 409 - Conflict (replay detected)
53
+ [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 409,
54
+ // 500 - Server errors
55
+ [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 500,
56
+ [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 500
57
+ };
58
+ var CANONICAL_TITLES = {
59
+ [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: "Payment Required",
60
+ [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: "Invalid Receipt",
61
+ [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: "Receipt Expired",
62
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: "Signature Missing",
63
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: "Invalid Signature",
64
+ [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: "Invalid Signature Time",
65
+ [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: "Signature Window Too Large",
66
+ [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: "Unknown TAP Tag",
67
+ [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: "Invalid Algorithm",
68
+ [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: "Key Not Found",
69
+ [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: "Nonce Replay Detected",
70
+ [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: "Replay Protection Required",
71
+ [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: "Issuer Not Allowed",
72
+ [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: "Configuration Error",
73
+ [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: "Internal Server Error"
74
+ };
75
+ var MODE_BEHAVIOR = {
76
+ receipt_or_tap: {
77
+ status: 402,
78
+ code: CANONICAL_ERROR_CODES.RECEIPT_MISSING,
79
+ action: "challenge"
80
+ },
81
+ tap_only: {
82
+ status: 401,
83
+ code: CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING,
84
+ action: "error"
85
+ }
86
+ };
87
+ var WWW_AUTHENTICATE_STATUSES = [401, 402];
88
+ function problemTypeFor(code) {
89
+ return `${PROBLEM_TYPE_BASE}/${code}`;
90
+ }
91
+ var ERROR_CATALOG = {
92
+ [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: {
93
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_MISSING],
94
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_MISSING],
95
+ defaultDetail: "A valid PEAC receipt is required to access this resource."
96
+ },
97
+ [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: {
98
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_INVALID],
99
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_INVALID],
100
+ defaultDetail: "The provided receipt is invalid."
101
+ },
102
+ [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: {
103
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],
104
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],
105
+ defaultDetail: "The provided receipt has expired."
106
+ },
107
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: {
108
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],
109
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],
110
+ defaultDetail: "TAP signature headers are required."
111
+ },
112
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: {
113
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],
114
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],
115
+ defaultDetail: "TAP signature verification failed."
116
+ },
117
+ [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: {
118
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],
119
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],
120
+ defaultDetail: "TAP signature time is invalid."
121
+ },
122
+ [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: {
123
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],
124
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],
125
+ defaultDetail: "TAP signature time window exceeds maximum allowed."
126
+ },
127
+ [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: {
128
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],
129
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],
130
+ defaultDetail: "Unknown TAP tag in signature."
131
+ },
132
+ [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: {
133
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],
134
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],
135
+ defaultDetail: "TAP signature algorithm is invalid."
136
+ },
137
+ [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: {
138
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],
139
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],
140
+ defaultDetail: "TAP signing key not found."
141
+ },
142
+ [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: {
143
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],
144
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],
145
+ defaultDetail: "Nonce replay detected."
146
+ },
147
+ [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: {
148
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],
149
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],
150
+ defaultDetail: "Replay protection required but not configured. Set UNSAFE_ALLOW_NO_REPLAY=true to bypass (UNSAFE for production)."
151
+ },
152
+ [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: {
153
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],
154
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],
155
+ defaultDetail: "Issuer not in allowlist."
156
+ },
157
+ [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: {
158
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],
159
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],
160
+ defaultDetail: "Worker misconfigured: ISSUER_ALLOWLIST is required. Set UNSAFE_ALLOW_ANY_ISSUER=true to bypass (UNSAFE for production)."
161
+ },
162
+ [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: {
163
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.INTERNAL_ERROR],
164
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.INTERNAL_ERROR],
165
+ defaultDetail: "An internal server error occurred."
166
+ }
167
+ };
168
+ function getStatusForCode(code) {
169
+ return CANONICAL_STATUS_MAPPINGS[code];
170
+ }
171
+ function requiresWwwAuthenticate(status) {
172
+ return WWW_AUTHENTICATE_STATUSES.includes(status);
173
+ }
174
+ function buildWwwAuthenticate(code, realm = "peac") {
175
+ return `PEAC realm="${realm}", error="${code}", error_uri="${problemTypeFor(code)}"`;
176
+ }
177
+ function isPeacErrorCode(x) {
178
+ return typeof x === "string" && PEAC_ERROR_CODE_SET.has(x);
179
+ }
180
+
181
+ exports.CANONICAL_ERROR_CODES = CANONICAL_ERROR_CODES;
182
+ exports.CANONICAL_STATUS_MAPPINGS = CANONICAL_STATUS_MAPPINGS;
183
+ exports.CANONICAL_TITLES = CANONICAL_TITLES;
184
+ exports.ERROR_CATALOG = ERROR_CATALOG;
185
+ exports.MODE_BEHAVIOR = MODE_BEHAVIOR;
186
+ exports.PROBLEM_TYPE_BASE = PROBLEM_TYPE_BASE;
187
+ exports.WWW_AUTHENTICATE_STATUSES = WWW_AUTHENTICATE_STATUSES;
188
+ exports.buildWwwAuthenticate = buildWwwAuthenticate;
189
+ exports.getStatusForCode = getStatusForCode;
190
+ exports.isPeacErrorCode = isPeacErrorCode;
191
+ exports.problemTypeFor = problemTypeFor;
192
+ exports.requiresWwwAuthenticate = requiresWwwAuthenticate;
193
+ //# sourceMappingURL=index.cjs.map
194
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/codes.ts","../src/internal/error-codes.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Canonical PEAC error codes.\n *\n * This is the single source of truth for error code values.\n * All other modules import from here to avoid circular dependencies.\n */\n\n/**\n * Canonical PEAC error codes.\n *\n * Format: E_<CATEGORY>_<ERROR>\n *\n * All error codes use the E_ prefix for consistency with RFC/IETF error code conventions.\n */\nexport const CANONICAL_ERROR_CODES = {\n // Receipt errors (402 - Payment Required)\n RECEIPT_MISSING: 'E_RECEIPT_MISSING',\n RECEIPT_INVALID: 'E_RECEIPT_INVALID',\n RECEIPT_EXPIRED: 'E_RECEIPT_EXPIRED',\n\n // TAP errors (401 - Authentication)\n TAP_SIGNATURE_MISSING: 'E_TAP_SIGNATURE_MISSING',\n TAP_SIGNATURE_INVALID: 'E_TAP_SIGNATURE_INVALID',\n TAP_TIME_INVALID: 'E_TAP_TIME_INVALID',\n TAP_WINDOW_TOO_LARGE: 'E_TAP_WINDOW_TOO_LARGE',\n TAP_TAG_UNKNOWN: 'E_TAP_TAG_UNKNOWN',\n TAP_ALGORITHM_INVALID: 'E_TAP_ALGORITHM_INVALID',\n TAP_KEY_NOT_FOUND: 'E_TAP_KEY_NOT_FOUND',\n\n // Replay error (409 - Conflict)\n TAP_NONCE_REPLAY: 'E_TAP_NONCE_REPLAY',\n\n // Replay protection required (401 - requires config change)\n TAP_REPLAY_PROTECTION_REQUIRED: 'E_TAP_REPLAY_PROTECTION_REQUIRED',\n\n // Issuer errors (403 - Forbidden)\n ISSUER_NOT_ALLOWED: 'E_ISSUER_NOT_ALLOWED',\n\n // Configuration errors (500 - Server misconfiguration)\n CONFIG_ISSUER_ALLOWLIST_REQUIRED: 'E_CONFIG_ISSUER_ALLOWLIST_REQUIRED',\n\n // Internal errors (500)\n INTERNAL_ERROR: 'E_INTERNAL_ERROR',\n} as const;\n\n/**\n * PEAC error code type (union of all canonical error codes).\n *\n * Use this type for compile-time safety when handling error codes.\n */\nexport type PeacErrorCode = (typeof CANONICAL_ERROR_CODES)[keyof typeof CANONICAL_ERROR_CODES];\n","/**\n * Internal error code utilities.\n *\n * @internal - Not part of public API. Consumers should import from `@peac/contracts`.\n */\n\nimport { CANONICAL_ERROR_CODES, type PeacErrorCode } from '../codes.js';\n\n/**\n * Set of all canonical PEAC error codes for O(1) validation.\n *\n * Typed as ReadonlySet to prevent accidental mutation.\n *\n * @internal\n */\nconst VALUES = Object.values(CANONICAL_ERROR_CODES) as PeacErrorCode[];\nexport const PEAC_ERROR_CODE_SET: ReadonlySet<PeacErrorCode> = new Set(VALUES);\n","/**\n * PEAC Canonical Contracts\n *\n * Single source of truth for error codes, HTTP status mappings, and verification mode behavior.\n * All surface implementations MUST import from this package to prevent drift.\n *\n * @packageDocumentation\n */\n\n// Re-export canonical error codes from internal module (avoids circular dependencies)\nexport { CANONICAL_ERROR_CODES, type PeacErrorCode } from './codes.js';\nimport { CANONICAL_ERROR_CODES, type PeacErrorCode } from './codes.js';\n\n/**\n * Base URI for RFC 9457 Problem Details type field.\n */\nexport const PROBLEM_TYPE_BASE = 'https://www.peacprotocol.org/problems';\n\n/**\n * Canonical HTTP status code mappings.\n *\n * Status code semantics:\n * - 400: Client error (malformed request, invalid parameters)\n * - 401: Authentication required (missing/invalid credentials)\n * - 402: Payment Required (reserved for PEAC receipt payment flows)\n * - 403: Forbidden (authenticated but not authorized)\n * - 409: Conflict (replay detection - request conflicts with previous state)\n * - 500: Server error (configuration, internal failure)\n */\nexport const CANONICAL_STATUS_MAPPINGS: Record<PeacErrorCode, number> = {\n // 402 - Payment Required (reserved for payment flows)\n [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 402,\n [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 402,\n [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 402,\n\n // 401 - Authentication errors\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 401,\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 401,\n [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 401,\n [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 401,\n [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 401,\n\n // 400 - Client errors (malformed)\n [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 400,\n [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 400,\n [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 400,\n\n // 403 - Forbidden (issuer not in allowlist)\n [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 403,\n\n // 409 - Conflict (replay detected)\n [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 409,\n\n // 500 - Server errors\n [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 500,\n [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 500,\n};\n\n/**\n * Canonical error titles for RFC 9457 Problem Details.\n */\nexport const CANONICAL_TITLES: Record<PeacErrorCode, string> = {\n [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 'Payment Required',\n [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 'Invalid Receipt',\n [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 'Receipt Expired',\n\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 'Signature Missing',\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 'Invalid Signature',\n [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 'Invalid Signature Time',\n [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 'Signature Window Too Large',\n [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 'Unknown TAP Tag',\n [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 'Invalid Algorithm',\n [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 'Key Not Found',\n [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 'Nonce Replay Detected',\n [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 'Replay Protection Required',\n\n [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 'Issuer Not Allowed',\n\n [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 'Configuration Error',\n [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 'Internal Server Error',\n};\n\n/**\n * Verification mode.\n *\n * Determines behavior when TAP headers are missing:\n * - tap_only: Missing TAP → 401 + E_TAP_SIGNATURE_MISSING (authentication required)\n * - receipt_or_tap: Missing TAP → 402 + E_RECEIPT_MISSING (payment remedy)\n */\nexport type VerificationMode = 'tap_only' | 'receipt_or_tap';\n\n/**\n * Handler action type.\n *\n * Determines how the handler should respond:\n * - error: Authentication/authorization error\n * - challenge: Payment challenge (402 only)\n * - pass: Bypass verification (bypass paths)\n * - forward: Verification succeeded, forward request\n */\nexport type HandlerAction = 'error' | 'challenge' | 'pass' | 'forward';\n\n/**\n * Mode behavior for missing TAP headers.\n */\nexport interface ModeBehavior {\n /** HTTP status code */\n status: number;\n /** PEAC error code */\n code: PeacErrorCode;\n /** Handler action */\n action: HandlerAction;\n}\n\n/**\n * Verification mode behavior contract.\n *\n * Defines expected HTTP status, error code, and action when no TAP headers are present.\n * This is the canonical source of truth for mode-based behavior.\n */\nexport const MODE_BEHAVIOR: Record<VerificationMode, ModeBehavior> = {\n receipt_or_tap: {\n status: 402,\n code: CANONICAL_ERROR_CODES.RECEIPT_MISSING,\n action: 'challenge',\n },\n tap_only: {\n status: 401,\n code: CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING,\n action: 'error',\n },\n} as const;\n\n/**\n * HTTP status codes that require WWW-Authenticate header.\n *\n * Per v0.9.27 decision: WWW-Authenticate is sent on both 401 (auth required) and 402 (payment remedy).\n */\nexport const WWW_AUTHENTICATE_STATUSES = [401, 402] as const;\n\n/**\n * Get RFC 9457 Problem Details type URI for an error code.\n *\n * @param code - PEAC error code\n * @returns Problem Details type URI (e.g., \"https://www.peacprotocol.org/problems/E_TAP_SIGNATURE_MISSING\")\n */\nexport function problemTypeFor(code: PeacErrorCode): string {\n return `${PROBLEM_TYPE_BASE}/${code}`;\n}\n\n/**\n * Error catalog entry.\n */\nexport interface ErrorCatalogEntry {\n /** HTTP status code */\n status: number;\n /** RFC 9457 title */\n title: string;\n /** Default detail message (can be overridden at runtime) */\n defaultDetail?: string;\n}\n\n/**\n * Error catalog with HTTP status, title, and default detail for each error code.\n *\n * Use this for constructing RFC 9457 Problem Details responses.\n */\nexport const ERROR_CATALOG: Record<PeacErrorCode, ErrorCatalogEntry> = {\n [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_MISSING],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_MISSING],\n defaultDetail: 'A valid PEAC receipt is required to access this resource.',\n },\n [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_INVALID],\n defaultDetail: 'The provided receipt is invalid.',\n },\n [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],\n defaultDetail: 'The provided receipt has expired.',\n },\n\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],\n defaultDetail: 'TAP signature headers are required.',\n },\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],\n defaultDetail: 'TAP signature verification failed.',\n },\n [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],\n defaultDetail: 'TAP signature time is invalid.',\n },\n [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],\n defaultDetail: 'TAP signature time window exceeds maximum allowed.',\n },\n [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],\n defaultDetail: 'Unknown TAP tag in signature.',\n },\n [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],\n defaultDetail: 'TAP signature algorithm is invalid.',\n },\n [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],\n defaultDetail: 'TAP signing key not found.',\n },\n [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],\n defaultDetail: 'Nonce replay detected.',\n },\n [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],\n defaultDetail:\n 'Replay protection required but not configured. Set UNSAFE_ALLOW_NO_REPLAY=true to bypass (UNSAFE for production).',\n },\n\n [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],\n defaultDetail: 'Issuer not in allowlist.',\n },\n\n [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],\n defaultDetail:\n 'Worker misconfigured: ISSUER_ALLOWLIST is required. Set UNSAFE_ALLOW_ANY_ISSUER=true to bypass (UNSAFE for production).',\n },\n [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.INTERNAL_ERROR],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.INTERNAL_ERROR],\n defaultDetail: 'An internal server error occurred.',\n },\n};\n\n/**\n * Get HTTP status code for a PEAC error code.\n *\n * @param code - PEAC error code\n * @returns HTTP status code\n */\nexport function getStatusForCode(code: PeacErrorCode): number {\n return CANONICAL_STATUS_MAPPINGS[code];\n}\n\n/**\n * Check if HTTP status requires WWW-Authenticate header.\n *\n * @param status - HTTP status code\n * @returns true if WWW-Authenticate header is required\n */\nexport function requiresWwwAuthenticate(status: number): boolean {\n return WWW_AUTHENTICATE_STATUSES.includes(status as 401 | 402);\n}\n\n/**\n * Build canonical WWW-Authenticate header value.\n *\n * Format: PEAC realm=\"<realm>\", error=\"<code>\", error_uri=\"<uri>\"\n *\n * @param code - PEAC error code\n * @param realm - Authentication realm (default: \"peac\")\n * @returns Canonical WWW-Authenticate header value\n */\nexport function buildWwwAuthenticate(code: PeacErrorCode, realm = 'peac'): string {\n return `PEAC realm=\"${realm}\", error=\"${code}\", error_uri=\"${problemTypeFor(code)}\"`;\n}\n\n/**\n * Valid PEAC HTTP status codes.\n *\n * All status codes that can be returned by PEAC verification handlers.\n */\nexport type PeacHttpStatus = 400 | 401 | 402 | 403 | 409 | 500;\n\n// Internal Set import - NOT re-exported\nimport { PEAC_ERROR_CODE_SET } from './internal/error-codes.js';\n\n/**\n * Type guard to check if a value is a valid PEAC error code.\n *\n * Uses O(1) Set lookup for performance.\n *\n * @param x - Value to check\n * @returns true if x is a valid PeacErrorCode\n *\n * @example\n * ```typescript\n * if (isPeacErrorCode(code)) {\n * // TypeScript now knows code is PeacErrorCode\n * const status = getStatusForCode(code);\n * }\n * ```\n */\nexport function isPeacErrorCode(x: unknown): x is PeacErrorCode {\n return typeof x === 'string' && PEAC_ERROR_CODE_SET.has(x as PeacErrorCode);\n}\n"]}
package/dist/index.js CHANGED
@@ -1,236 +1,181 @@
1
- /**
2
- * PEAC Canonical Contracts
3
- *
4
- * Single source of truth for error codes, HTTP status mappings, and verification mode behavior.
5
- * All surface implementations MUST import from this package to prevent drift.
6
- *
7
- * @packageDocumentation
8
- */
9
- // Re-export canonical error codes from internal module (avoids circular dependencies)
10
- export { CANONICAL_ERROR_CODES } from './codes.js';
11
- import { CANONICAL_ERROR_CODES } from './codes.js';
12
- /**
13
- * Base URI for RFC 9457 Problem Details type field.
14
- */
15
- export const PROBLEM_TYPE_BASE = 'https://www.peacprotocol.org/problems';
16
- /**
17
- * Canonical HTTP status code mappings.
18
- *
19
- * Status code semantics:
20
- * - 400: Client error (malformed request, invalid parameters)
21
- * - 401: Authentication required (missing/invalid credentials)
22
- * - 402: Payment Required (reserved for PEAC receipt payment flows)
23
- * - 403: Forbidden (authenticated but not authorized)
24
- * - 409: Conflict (replay detection - request conflicts with previous state)
25
- * - 500: Server error (configuration, internal failure)
26
- */
27
- export const CANONICAL_STATUS_MAPPINGS = {
28
- // 402 - Payment Required (reserved for payment flows)
29
- [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 402,
30
- [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 402,
31
- [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 402,
32
- // 401 - Authentication errors
33
- [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 401,
34
- [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 401,
35
- [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 401,
36
- [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 401,
37
- [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 401,
38
- // 400 - Client errors (malformed)
39
- [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 400,
40
- [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 400,
41
- [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 400,
42
- // 403 - Forbidden (issuer not in allowlist)
43
- [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 403,
44
- // 409 - Conflict (replay detected)
45
- [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 409,
46
- // 500 - Server errors
47
- [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 500,
48
- [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 500,
1
+ // src/codes.ts
2
+ var CANONICAL_ERROR_CODES = {
3
+ // Receipt errors (402 - Payment Required)
4
+ RECEIPT_MISSING: "E_RECEIPT_MISSING",
5
+ RECEIPT_INVALID: "E_RECEIPT_INVALID",
6
+ RECEIPT_EXPIRED: "E_RECEIPT_EXPIRED",
7
+ // TAP errors (401 - Authentication)
8
+ TAP_SIGNATURE_MISSING: "E_TAP_SIGNATURE_MISSING",
9
+ TAP_SIGNATURE_INVALID: "E_TAP_SIGNATURE_INVALID",
10
+ TAP_TIME_INVALID: "E_TAP_TIME_INVALID",
11
+ TAP_WINDOW_TOO_LARGE: "E_TAP_WINDOW_TOO_LARGE",
12
+ TAP_TAG_UNKNOWN: "E_TAP_TAG_UNKNOWN",
13
+ TAP_ALGORITHM_INVALID: "E_TAP_ALGORITHM_INVALID",
14
+ TAP_KEY_NOT_FOUND: "E_TAP_KEY_NOT_FOUND",
15
+ // Replay error (409 - Conflict)
16
+ TAP_NONCE_REPLAY: "E_TAP_NONCE_REPLAY",
17
+ // Replay protection required (401 - requires config change)
18
+ TAP_REPLAY_PROTECTION_REQUIRED: "E_TAP_REPLAY_PROTECTION_REQUIRED",
19
+ // Issuer errors (403 - Forbidden)
20
+ ISSUER_NOT_ALLOWED: "E_ISSUER_NOT_ALLOWED",
21
+ // Configuration errors (500 - Server misconfiguration)
22
+ CONFIG_ISSUER_ALLOWLIST_REQUIRED: "E_CONFIG_ISSUER_ALLOWLIST_REQUIRED",
23
+ // Internal errors (500)
24
+ INTERNAL_ERROR: "E_INTERNAL_ERROR"
49
25
  };
50
- /**
51
- * Canonical error titles for RFC 9457 Problem Details.
52
- */
53
- export const CANONICAL_TITLES = {
54
- [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 'Payment Required',
55
- [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 'Invalid Receipt',
56
- [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 'Receipt Expired',
57
- [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 'Signature Missing',
58
- [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 'Invalid Signature',
59
- [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 'Invalid Signature Time',
60
- [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 'Signature Window Too Large',
61
- [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 'Unknown TAP Tag',
62
- [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 'Invalid Algorithm',
63
- [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 'Key Not Found',
64
- [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 'Nonce Replay Detected',
65
- [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 'Replay Protection Required',
66
- [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 'Issuer Not Allowed',
67
- [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 'Configuration Error',
68
- [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 'Internal Server Error',
26
+
27
+ // src/internal/error-codes.ts
28
+ var VALUES = Object.values(CANONICAL_ERROR_CODES);
29
+ var PEAC_ERROR_CODE_SET = new Set(VALUES);
30
+
31
+ // src/index.ts
32
+ var PROBLEM_TYPE_BASE = "https://www.peacprotocol.org/problems";
33
+ var CANONICAL_STATUS_MAPPINGS = {
34
+ // 402 - Payment Required (reserved for payment flows)
35
+ [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 402,
36
+ [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 402,
37
+ [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 402,
38
+ // 401 - Authentication errors
39
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 401,
40
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 401,
41
+ [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 401,
42
+ [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 401,
43
+ [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 401,
44
+ // 400 - Client errors (malformed)
45
+ [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 400,
46
+ [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 400,
47
+ [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 400,
48
+ // 403 - Forbidden (issuer not in allowlist)
49
+ [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 403,
50
+ // 409 - Conflict (replay detected)
51
+ [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 409,
52
+ // 500 - Server errors
53
+ [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 500,
54
+ [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 500
69
55
  };
70
- /**
71
- * Verification mode behavior contract.
72
- *
73
- * Defines expected HTTP status, error code, and action when no TAP headers are present.
74
- * This is the canonical source of truth for mode-based behavior.
75
- */
76
- export const MODE_BEHAVIOR = {
77
- receipt_or_tap: {
78
- status: 402,
79
- code: CANONICAL_ERROR_CODES.RECEIPT_MISSING,
80
- action: 'challenge',
81
- },
82
- tap_only: {
83
- status: 401,
84
- code: CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING,
85
- action: 'error',
86
- },
56
+ var CANONICAL_TITLES = {
57
+ [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: "Payment Required",
58
+ [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: "Invalid Receipt",
59
+ [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: "Receipt Expired",
60
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: "Signature Missing",
61
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: "Invalid Signature",
62
+ [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: "Invalid Signature Time",
63
+ [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: "Signature Window Too Large",
64
+ [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: "Unknown TAP Tag",
65
+ [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: "Invalid Algorithm",
66
+ [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: "Key Not Found",
67
+ [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: "Nonce Replay Detected",
68
+ [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: "Replay Protection Required",
69
+ [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: "Issuer Not Allowed",
70
+ [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: "Configuration Error",
71
+ [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: "Internal Server Error"
87
72
  };
88
- /**
89
- * HTTP status codes that require WWW-Authenticate header.
90
- *
91
- * Per v0.9.27 decision: WWW-Authenticate is sent on both 401 (auth required) and 402 (payment remedy).
92
- */
93
- export const WWW_AUTHENTICATE_STATUSES = [401, 402];
94
- /**
95
- * Get RFC 9457 Problem Details type URI for an error code.
96
- *
97
- * @param code - PEAC error code
98
- * @returns Problem Details type URI (e.g., "https://www.peacprotocol.org/problems/E_TAP_SIGNATURE_MISSING")
99
- */
100
- export function problemTypeFor(code) {
101
- return `${PROBLEM_TYPE_BASE}/${code}`;
73
+ var MODE_BEHAVIOR = {
74
+ receipt_or_tap: {
75
+ status: 402,
76
+ code: CANONICAL_ERROR_CODES.RECEIPT_MISSING,
77
+ action: "challenge"
78
+ },
79
+ tap_only: {
80
+ status: 401,
81
+ code: CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING,
82
+ action: "error"
83
+ }
84
+ };
85
+ var WWW_AUTHENTICATE_STATUSES = [401, 402];
86
+ function problemTypeFor(code) {
87
+ return `${PROBLEM_TYPE_BASE}/${code}`;
102
88
  }
103
- /**
104
- * Error catalog with HTTP status, title, and default detail for each error code.
105
- *
106
- * Use this for constructing RFC 9457 Problem Details responses.
107
- */
108
- export const ERROR_CATALOG = {
109
- [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: {
110
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_MISSING],
111
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_MISSING],
112
- defaultDetail: 'A valid PEAC receipt is required to access this resource.',
113
- },
114
- [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: {
115
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_INVALID],
116
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_INVALID],
117
- defaultDetail: 'The provided receipt is invalid.',
118
- },
119
- [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: {
120
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],
121
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],
122
- defaultDetail: 'The provided receipt has expired.',
123
- },
124
- [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: {
125
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],
126
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],
127
- defaultDetail: 'TAP signature headers are required.',
128
- },
129
- [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: {
130
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],
131
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],
132
- defaultDetail: 'TAP signature verification failed.',
133
- },
134
- [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: {
135
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],
136
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],
137
- defaultDetail: 'TAP signature time is invalid.',
138
- },
139
- [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: {
140
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],
141
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],
142
- defaultDetail: 'TAP signature time window exceeds maximum allowed.',
143
- },
144
- [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: {
145
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],
146
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],
147
- defaultDetail: 'Unknown TAP tag in signature.',
148
- },
149
- [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: {
150
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],
151
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],
152
- defaultDetail: 'TAP signature algorithm is invalid.',
153
- },
154
- [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: {
155
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],
156
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],
157
- defaultDetail: 'TAP signing key not found.',
158
- },
159
- [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: {
160
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],
161
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],
162
- defaultDetail: 'Nonce replay detected.',
163
- },
164
- [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: {
165
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],
166
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],
167
- defaultDetail: 'Replay protection required but not configured. Set UNSAFE_ALLOW_NO_REPLAY=true to bypass (UNSAFE for production).',
168
- },
169
- [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: {
170
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],
171
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],
172
- defaultDetail: 'Issuer not in allowlist.',
173
- },
174
- [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: {
175
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],
176
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],
177
- defaultDetail: 'Worker misconfigured: ISSUER_ALLOWLIST is required. Set UNSAFE_ALLOW_ANY_ISSUER=true to bypass (UNSAFE for production).',
178
- },
179
- [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: {
180
- status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.INTERNAL_ERROR],
181
- title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.INTERNAL_ERROR],
182
- defaultDetail: 'An internal server error occurred.',
183
- },
89
+ var ERROR_CATALOG = {
90
+ [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: {
91
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_MISSING],
92
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_MISSING],
93
+ defaultDetail: "A valid PEAC receipt is required to access this resource."
94
+ },
95
+ [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: {
96
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_INVALID],
97
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_INVALID],
98
+ defaultDetail: "The provided receipt is invalid."
99
+ },
100
+ [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: {
101
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],
102
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],
103
+ defaultDetail: "The provided receipt has expired."
104
+ },
105
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: {
106
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],
107
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],
108
+ defaultDetail: "TAP signature headers are required."
109
+ },
110
+ [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: {
111
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],
112
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],
113
+ defaultDetail: "TAP signature verification failed."
114
+ },
115
+ [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: {
116
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],
117
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],
118
+ defaultDetail: "TAP signature time is invalid."
119
+ },
120
+ [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: {
121
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],
122
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],
123
+ defaultDetail: "TAP signature time window exceeds maximum allowed."
124
+ },
125
+ [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: {
126
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],
127
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],
128
+ defaultDetail: "Unknown TAP tag in signature."
129
+ },
130
+ [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: {
131
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],
132
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],
133
+ defaultDetail: "TAP signature algorithm is invalid."
134
+ },
135
+ [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: {
136
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],
137
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],
138
+ defaultDetail: "TAP signing key not found."
139
+ },
140
+ [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: {
141
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],
142
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],
143
+ defaultDetail: "Nonce replay detected."
144
+ },
145
+ [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: {
146
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],
147
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],
148
+ defaultDetail: "Replay protection required but not configured. Set UNSAFE_ALLOW_NO_REPLAY=true to bypass (UNSAFE for production)."
149
+ },
150
+ [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: {
151
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],
152
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],
153
+ defaultDetail: "Issuer not in allowlist."
154
+ },
155
+ [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: {
156
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],
157
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],
158
+ defaultDetail: "Worker misconfigured: ISSUER_ALLOWLIST is required. Set UNSAFE_ALLOW_ANY_ISSUER=true to bypass (UNSAFE for production)."
159
+ },
160
+ [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: {
161
+ status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.INTERNAL_ERROR],
162
+ title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.INTERNAL_ERROR],
163
+ defaultDetail: "An internal server error occurred."
164
+ }
184
165
  };
185
- /**
186
- * Get HTTP status code for a PEAC error code.
187
- *
188
- * @param code - PEAC error code
189
- * @returns HTTP status code
190
- */
191
- export function getStatusForCode(code) {
192
- return CANONICAL_STATUS_MAPPINGS[code];
166
+ function getStatusForCode(code) {
167
+ return CANONICAL_STATUS_MAPPINGS[code];
193
168
  }
194
- /**
195
- * Check if HTTP status requires WWW-Authenticate header.
196
- *
197
- * @param status - HTTP status code
198
- * @returns true if WWW-Authenticate header is required
199
- */
200
- export function requiresWwwAuthenticate(status) {
201
- return WWW_AUTHENTICATE_STATUSES.includes(status);
169
+ function requiresWwwAuthenticate(status) {
170
+ return WWW_AUTHENTICATE_STATUSES.includes(status);
202
171
  }
203
- /**
204
- * Build canonical WWW-Authenticate header value.
205
- *
206
- * Format: PEAC realm="<realm>", error="<code>", error_uri="<uri>"
207
- *
208
- * @param code - PEAC error code
209
- * @param realm - Authentication realm (default: "peac")
210
- * @returns Canonical WWW-Authenticate header value
211
- */
212
- export function buildWwwAuthenticate(code, realm = 'peac') {
213
- return `PEAC realm="${realm}", error="${code}", error_uri="${problemTypeFor(code)}"`;
172
+ function buildWwwAuthenticate(code, realm = "peac") {
173
+ return `PEAC realm="${realm}", error="${code}", error_uri="${problemTypeFor(code)}"`;
214
174
  }
215
- // Internal Set import - NOT re-exported
216
- import { PEAC_ERROR_CODE_SET } from './internal/error-codes.js';
217
- /**
218
- * Type guard to check if a value is a valid PEAC error code.
219
- *
220
- * Uses O(1) Set lookup for performance.
221
- *
222
- * @param x - Value to check
223
- * @returns true if x is a valid PeacErrorCode
224
- *
225
- * @example
226
- * ```typescript
227
- * if (isPeacErrorCode(code)) {
228
- * // TypeScript now knows code is PeacErrorCode
229
- * const status = getStatusForCode(code);
230
- * }
231
- * ```
232
- */
233
- export function isPeacErrorCode(x) {
234
- return typeof x === 'string' && PEAC_ERROR_CODE_SET.has(x);
175
+ function isPeacErrorCode(x) {
176
+ return typeof x === "string" && PEAC_ERROR_CODE_SET.has(x);
235
177
  }
178
+
179
+ export { CANONICAL_ERROR_CODES, CANONICAL_STATUS_MAPPINGS, CANONICAL_TITLES, ERROR_CATALOG, MODE_BEHAVIOR, PROBLEM_TYPE_BASE, WWW_AUTHENTICATE_STATUSES, buildWwwAuthenticate, getStatusForCode, isPeacErrorCode, problemTypeFor, requiresWwwAuthenticate };
180
+ //# sourceMappingURL=index.js.map
236
181
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/codes.ts","../src/internal/error-codes.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Canonical PEAC error codes.\n *\n * This is the single source of truth for error code values.\n * All other modules import from here to avoid circular dependencies.\n */\n\n/**\n * Canonical PEAC error codes.\n *\n * Format: E_<CATEGORY>_<ERROR>\n *\n * All error codes use the E_ prefix for consistency with RFC/IETF error code conventions.\n */\nexport const CANONICAL_ERROR_CODES = {\n // Receipt errors (402 - Payment Required)\n RECEIPT_MISSING: 'E_RECEIPT_MISSING',\n RECEIPT_INVALID: 'E_RECEIPT_INVALID',\n RECEIPT_EXPIRED: 'E_RECEIPT_EXPIRED',\n\n // TAP errors (401 - Authentication)\n TAP_SIGNATURE_MISSING: 'E_TAP_SIGNATURE_MISSING',\n TAP_SIGNATURE_INVALID: 'E_TAP_SIGNATURE_INVALID',\n TAP_TIME_INVALID: 'E_TAP_TIME_INVALID',\n TAP_WINDOW_TOO_LARGE: 'E_TAP_WINDOW_TOO_LARGE',\n TAP_TAG_UNKNOWN: 'E_TAP_TAG_UNKNOWN',\n TAP_ALGORITHM_INVALID: 'E_TAP_ALGORITHM_INVALID',\n TAP_KEY_NOT_FOUND: 'E_TAP_KEY_NOT_FOUND',\n\n // Replay error (409 - Conflict)\n TAP_NONCE_REPLAY: 'E_TAP_NONCE_REPLAY',\n\n // Replay protection required (401 - requires config change)\n TAP_REPLAY_PROTECTION_REQUIRED: 'E_TAP_REPLAY_PROTECTION_REQUIRED',\n\n // Issuer errors (403 - Forbidden)\n ISSUER_NOT_ALLOWED: 'E_ISSUER_NOT_ALLOWED',\n\n // Configuration errors (500 - Server misconfiguration)\n CONFIG_ISSUER_ALLOWLIST_REQUIRED: 'E_CONFIG_ISSUER_ALLOWLIST_REQUIRED',\n\n // Internal errors (500)\n INTERNAL_ERROR: 'E_INTERNAL_ERROR',\n} as const;\n\n/**\n * PEAC error code type (union of all canonical error codes).\n *\n * Use this type for compile-time safety when handling error codes.\n */\nexport type PeacErrorCode = (typeof CANONICAL_ERROR_CODES)[keyof typeof CANONICAL_ERROR_CODES];\n","/**\n * Internal error code utilities.\n *\n * @internal - Not part of public API. Consumers should import from `@peac/contracts`.\n */\n\nimport { CANONICAL_ERROR_CODES, type PeacErrorCode } from '../codes.js';\n\n/**\n * Set of all canonical PEAC error codes for O(1) validation.\n *\n * Typed as ReadonlySet to prevent accidental mutation.\n *\n * @internal\n */\nconst VALUES = Object.values(CANONICAL_ERROR_CODES) as PeacErrorCode[];\nexport const PEAC_ERROR_CODE_SET: ReadonlySet<PeacErrorCode> = new Set(VALUES);\n","/**\n * PEAC Canonical Contracts\n *\n * Single source of truth for error codes, HTTP status mappings, and verification mode behavior.\n * All surface implementations MUST import from this package to prevent drift.\n *\n * @packageDocumentation\n */\n\n// Re-export canonical error codes from internal module (avoids circular dependencies)\nexport { CANONICAL_ERROR_CODES, type PeacErrorCode } from './codes.js';\nimport { CANONICAL_ERROR_CODES, type PeacErrorCode } from './codes.js';\n\n/**\n * Base URI for RFC 9457 Problem Details type field.\n */\nexport const PROBLEM_TYPE_BASE = 'https://www.peacprotocol.org/problems';\n\n/**\n * Canonical HTTP status code mappings.\n *\n * Status code semantics:\n * - 400: Client error (malformed request, invalid parameters)\n * - 401: Authentication required (missing/invalid credentials)\n * - 402: Payment Required (reserved for PEAC receipt payment flows)\n * - 403: Forbidden (authenticated but not authorized)\n * - 409: Conflict (replay detection - request conflicts with previous state)\n * - 500: Server error (configuration, internal failure)\n */\nexport const CANONICAL_STATUS_MAPPINGS: Record<PeacErrorCode, number> = {\n // 402 - Payment Required (reserved for payment flows)\n [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 402,\n [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 402,\n [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 402,\n\n // 401 - Authentication errors\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 401,\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 401,\n [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 401,\n [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 401,\n [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 401,\n\n // 400 - Client errors (malformed)\n [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 400,\n [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 400,\n [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 400,\n\n // 403 - Forbidden (issuer not in allowlist)\n [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 403,\n\n // 409 - Conflict (replay detected)\n [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 409,\n\n // 500 - Server errors\n [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 500,\n [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 500,\n};\n\n/**\n * Canonical error titles for RFC 9457 Problem Details.\n */\nexport const CANONICAL_TITLES: Record<PeacErrorCode, string> = {\n [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: 'Payment Required',\n [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: 'Invalid Receipt',\n [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: 'Receipt Expired',\n\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: 'Signature Missing',\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: 'Invalid Signature',\n [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: 'Invalid Signature Time',\n [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: 'Signature Window Too Large',\n [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: 'Unknown TAP Tag',\n [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: 'Invalid Algorithm',\n [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: 'Key Not Found',\n [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: 'Nonce Replay Detected',\n [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: 'Replay Protection Required',\n\n [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: 'Issuer Not Allowed',\n\n [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: 'Configuration Error',\n [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: 'Internal Server Error',\n};\n\n/**\n * Verification mode.\n *\n * Determines behavior when TAP headers are missing:\n * - tap_only: Missing TAP → 401 + E_TAP_SIGNATURE_MISSING (authentication required)\n * - receipt_or_tap: Missing TAP → 402 + E_RECEIPT_MISSING (payment remedy)\n */\nexport type VerificationMode = 'tap_only' | 'receipt_or_tap';\n\n/**\n * Handler action type.\n *\n * Determines how the handler should respond:\n * - error: Authentication/authorization error\n * - challenge: Payment challenge (402 only)\n * - pass: Bypass verification (bypass paths)\n * - forward: Verification succeeded, forward request\n */\nexport type HandlerAction = 'error' | 'challenge' | 'pass' | 'forward';\n\n/**\n * Mode behavior for missing TAP headers.\n */\nexport interface ModeBehavior {\n /** HTTP status code */\n status: number;\n /** PEAC error code */\n code: PeacErrorCode;\n /** Handler action */\n action: HandlerAction;\n}\n\n/**\n * Verification mode behavior contract.\n *\n * Defines expected HTTP status, error code, and action when no TAP headers are present.\n * This is the canonical source of truth for mode-based behavior.\n */\nexport const MODE_BEHAVIOR: Record<VerificationMode, ModeBehavior> = {\n receipt_or_tap: {\n status: 402,\n code: CANONICAL_ERROR_CODES.RECEIPT_MISSING,\n action: 'challenge',\n },\n tap_only: {\n status: 401,\n code: CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING,\n action: 'error',\n },\n} as const;\n\n/**\n * HTTP status codes that require WWW-Authenticate header.\n *\n * Per v0.9.27 decision: WWW-Authenticate is sent on both 401 (auth required) and 402 (payment remedy).\n */\nexport const WWW_AUTHENTICATE_STATUSES = [401, 402] as const;\n\n/**\n * Get RFC 9457 Problem Details type URI for an error code.\n *\n * @param code - PEAC error code\n * @returns Problem Details type URI (e.g., \"https://www.peacprotocol.org/problems/E_TAP_SIGNATURE_MISSING\")\n */\nexport function problemTypeFor(code: PeacErrorCode): string {\n return `${PROBLEM_TYPE_BASE}/${code}`;\n}\n\n/**\n * Error catalog entry.\n */\nexport interface ErrorCatalogEntry {\n /** HTTP status code */\n status: number;\n /** RFC 9457 title */\n title: string;\n /** Default detail message (can be overridden at runtime) */\n defaultDetail?: string;\n}\n\n/**\n * Error catalog with HTTP status, title, and default detail for each error code.\n *\n * Use this for constructing RFC 9457 Problem Details responses.\n */\nexport const ERROR_CATALOG: Record<PeacErrorCode, ErrorCatalogEntry> = {\n [CANONICAL_ERROR_CODES.RECEIPT_MISSING]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_MISSING],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_MISSING],\n defaultDetail: 'A valid PEAC receipt is required to access this resource.',\n },\n [CANONICAL_ERROR_CODES.RECEIPT_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_INVALID],\n defaultDetail: 'The provided receipt is invalid.',\n },\n [CANONICAL_ERROR_CODES.RECEIPT_EXPIRED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.RECEIPT_EXPIRED],\n defaultDetail: 'The provided receipt has expired.',\n },\n\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_MISSING],\n defaultDetail: 'TAP signature headers are required.',\n },\n [CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_SIGNATURE_INVALID],\n defaultDetail: 'TAP signature verification failed.',\n },\n [CANONICAL_ERROR_CODES.TAP_TIME_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TIME_INVALID],\n defaultDetail: 'TAP signature time is invalid.',\n },\n [CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_WINDOW_TOO_LARGE],\n defaultDetail: 'TAP signature time window exceeds maximum allowed.',\n },\n [CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_TAG_UNKNOWN],\n defaultDetail: 'Unknown TAP tag in signature.',\n },\n [CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_ALGORITHM_INVALID],\n defaultDetail: 'TAP signature algorithm is invalid.',\n },\n [CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_KEY_NOT_FOUND],\n defaultDetail: 'TAP signing key not found.',\n },\n [CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_NONCE_REPLAY],\n defaultDetail: 'Nonce replay detected.',\n },\n [CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.TAP_REPLAY_PROTECTION_REQUIRED],\n defaultDetail:\n 'Replay protection required but not configured. Set UNSAFE_ALLOW_NO_REPLAY=true to bypass (UNSAFE for production).',\n },\n\n [CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.ISSUER_NOT_ALLOWED],\n defaultDetail: 'Issuer not in allowlist.',\n },\n\n [CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.CONFIG_ISSUER_ALLOWLIST_REQUIRED],\n defaultDetail:\n 'Worker misconfigured: ISSUER_ALLOWLIST is required. Set UNSAFE_ALLOW_ANY_ISSUER=true to bypass (UNSAFE for production).',\n },\n [CANONICAL_ERROR_CODES.INTERNAL_ERROR]: {\n status: CANONICAL_STATUS_MAPPINGS[CANONICAL_ERROR_CODES.INTERNAL_ERROR],\n title: CANONICAL_TITLES[CANONICAL_ERROR_CODES.INTERNAL_ERROR],\n defaultDetail: 'An internal server error occurred.',\n },\n};\n\n/**\n * Get HTTP status code for a PEAC error code.\n *\n * @param code - PEAC error code\n * @returns HTTP status code\n */\nexport function getStatusForCode(code: PeacErrorCode): number {\n return CANONICAL_STATUS_MAPPINGS[code];\n}\n\n/**\n * Check if HTTP status requires WWW-Authenticate header.\n *\n * @param status - HTTP status code\n * @returns true if WWW-Authenticate header is required\n */\nexport function requiresWwwAuthenticate(status: number): boolean {\n return WWW_AUTHENTICATE_STATUSES.includes(status as 401 | 402);\n}\n\n/**\n * Build canonical WWW-Authenticate header value.\n *\n * Format: PEAC realm=\"<realm>\", error=\"<code>\", error_uri=\"<uri>\"\n *\n * @param code - PEAC error code\n * @param realm - Authentication realm (default: \"peac\")\n * @returns Canonical WWW-Authenticate header value\n */\nexport function buildWwwAuthenticate(code: PeacErrorCode, realm = 'peac'): string {\n return `PEAC realm=\"${realm}\", error=\"${code}\", error_uri=\"${problemTypeFor(code)}\"`;\n}\n\n/**\n * Valid PEAC HTTP status codes.\n *\n * All status codes that can be returned by PEAC verification handlers.\n */\nexport type PeacHttpStatus = 400 | 401 | 402 | 403 | 409 | 500;\n\n// Internal Set import - NOT re-exported\nimport { PEAC_ERROR_CODE_SET } from './internal/error-codes.js';\n\n/**\n * Type guard to check if a value is a valid PEAC error code.\n *\n * Uses O(1) Set lookup for performance.\n *\n * @param x - Value to check\n * @returns true if x is a valid PeacErrorCode\n *\n * @example\n * ```typescript\n * if (isPeacErrorCode(code)) {\n * // TypeScript now knows code is PeacErrorCode\n * const status = getStatusForCode(code);\n * }\n * ```\n */\nexport function isPeacErrorCode(x: unknown): x is PeacErrorCode {\n return typeof x === 'string' && PEAC_ERROR_CODE_SET.has(x as PeacErrorCode);\n}\n"]}
package/package.json CHANGED
@@ -1,15 +1,18 @@
1
1
  {
2
2
  "name": "@peac/contracts",
3
- "version": "0.10.8",
3
+ "version": "0.10.10",
4
4
  "description": "PEAC canonical error codes and verification mode contracts",
5
5
  "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
6
+ "main": "dist/index.cjs",
7
+ "types": "dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./dist/index.d.ts",
10
11
  "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
12
- }
12
+ "require": "./dist/index.cjs",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./package.json": "./package.json"
13
16
  },
14
17
  "files": [
15
18
  "dist"
@@ -30,12 +33,16 @@
30
33
  },
31
34
  "devDependencies": {
32
35
  "typescript": "^5.3.3",
33
- "vitest": "^2.0.0"
36
+ "vitest": "^4.0.0",
37
+ "tsup": "^8.0.0"
34
38
  },
35
39
  "scripts": {
36
- "build": "tsc",
40
+ "prebuild": "rm -rf dist",
41
+ "build": "pnpm run build:js && pnpm run build:types",
37
42
  "typecheck": "tsc --noEmit",
38
43
  "test": "vitest run",
39
- "test:watch": "vitest"
44
+ "test:watch": "vitest",
45
+ "build:js": "tsup",
46
+ "build:types": "rm -f dist/.tsbuildinfo && tsc && rm -f dist/.tsbuildinfo"
40
47
  }
41
48
  }
package/dist/codes.js DELETED
@@ -1,38 +0,0 @@
1
- /**
2
- * Canonical PEAC error codes.
3
- *
4
- * This is the single source of truth for error code values.
5
- * All other modules import from here to avoid circular dependencies.
6
- */
7
- /**
8
- * Canonical PEAC error codes.
9
- *
10
- * Format: E_<CATEGORY>_<ERROR>
11
- *
12
- * All error codes use the E_ prefix for consistency with RFC/IETF error code conventions.
13
- */
14
- export const CANONICAL_ERROR_CODES = {
15
- // Receipt errors (402 - Payment Required)
16
- RECEIPT_MISSING: 'E_RECEIPT_MISSING',
17
- RECEIPT_INVALID: 'E_RECEIPT_INVALID',
18
- RECEIPT_EXPIRED: 'E_RECEIPT_EXPIRED',
19
- // TAP errors (401 - Authentication)
20
- TAP_SIGNATURE_MISSING: 'E_TAP_SIGNATURE_MISSING',
21
- TAP_SIGNATURE_INVALID: 'E_TAP_SIGNATURE_INVALID',
22
- TAP_TIME_INVALID: 'E_TAP_TIME_INVALID',
23
- TAP_WINDOW_TOO_LARGE: 'E_TAP_WINDOW_TOO_LARGE',
24
- TAP_TAG_UNKNOWN: 'E_TAP_TAG_UNKNOWN',
25
- TAP_ALGORITHM_INVALID: 'E_TAP_ALGORITHM_INVALID',
26
- TAP_KEY_NOT_FOUND: 'E_TAP_KEY_NOT_FOUND',
27
- // Replay error (409 - Conflict)
28
- TAP_NONCE_REPLAY: 'E_TAP_NONCE_REPLAY',
29
- // Replay protection required (401 - requires config change)
30
- TAP_REPLAY_PROTECTION_REQUIRED: 'E_TAP_REPLAY_PROTECTION_REQUIRED',
31
- // Issuer errors (403 - Forbidden)
32
- ISSUER_NOT_ALLOWED: 'E_ISSUER_NOT_ALLOWED',
33
- // Configuration errors (500 - Server misconfiguration)
34
- CONFIG_ISSUER_ALLOWLIST_REQUIRED: 'E_CONFIG_ISSUER_ALLOWLIST_REQUIRED',
35
- // Internal errors (500)
36
- INTERNAL_ERROR: 'E_INTERNAL_ERROR',
37
- };
38
- //# sourceMappingURL=codes.js.map
package/dist/codes.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"codes.js","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,0CAA0C;IAC1C,eAAe,EAAE,mBAAmB;IACpC,eAAe,EAAE,mBAAmB;IACpC,eAAe,EAAE,mBAAmB;IAEpC,oCAAoC;IACpC,qBAAqB,EAAE,yBAAyB;IAChD,qBAAqB,EAAE,yBAAyB;IAChD,gBAAgB,EAAE,oBAAoB;IACtC,oBAAoB,EAAE,wBAAwB;IAC9C,eAAe,EAAE,mBAAmB;IACpC,qBAAqB,EAAE,yBAAyB;IAChD,iBAAiB,EAAE,qBAAqB;IAExC,gCAAgC;IAChC,gBAAgB,EAAE,oBAAoB;IAEtC,4DAA4D;IAC5D,8BAA8B,EAAE,kCAAkC;IAElE,kCAAkC;IAClC,kBAAkB,EAAE,sBAAsB;IAE1C,uDAAuD;IACvD,gCAAgC,EAAE,oCAAoC;IAEtE,wBAAwB;IACxB,cAAc,EAAE,kBAAkB;CAC1B,CAAC"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Internal error code utilities.
3
- *
4
- * @internal - Not part of public API. Consumers should import from `@peac/contracts`.
5
- */
6
- import { CANONICAL_ERROR_CODES } from '../codes.js';
7
- /**
8
- * Set of all canonical PEAC error codes for O(1) validation.
9
- *
10
- * Typed as ReadonlySet to prevent accidental mutation.
11
- *
12
- * @internal
13
- */
14
- const VALUES = Object.values(CANONICAL_ERROR_CODES);
15
- export const PEAC_ERROR_CODE_SET = new Set(VALUES);
16
- //# sourceMappingURL=error-codes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-codes.js","sourceRoot":"","sources":["../../src/internal/error-codes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAsB,MAAM,aAAa,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAoB,CAAC;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAA+B,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC"}