@numerum-tech/yeriasdk 1.0.0
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/README.md +864 -0
- package/dist/core/action-grid-view.d.ts +57 -0
- package/dist/core/action-grid-view.d.ts.map +1 -0
- package/dist/core/action-grid-view.js +112 -0
- package/dist/core/action-grid-view.js.map +1 -0
- package/dist/core/action-list-view.d.ts +39 -0
- package/dist/core/action-list-view.d.ts.map +1 -0
- package/dist/core/action-list-view.js +77 -0
- package/dist/core/action-list-view.js.map +1 -0
- package/dist/core/base/base-action-view.d.ts +82 -0
- package/dist/core/base/base-action-view.d.ts.map +1 -0
- package/dist/core/base/base-action-view.js +143 -0
- package/dist/core/base/base-action-view.js.map +1 -0
- package/dist/core/base-view.d.ts +105 -0
- package/dist/core/base-view.d.ts.map +1 -0
- package/dist/core/base-view.js +426 -0
- package/dist/core/base-view.js.map +1 -0
- package/dist/core/card-view.d.ts +24 -0
- package/dist/core/card-view.d.ts.map +1 -0
- package/dist/core/card-view.js +127 -0
- package/dist/core/card-view.js.map +1 -0
- package/dist/core/carousel-view.d.ts +22 -0
- package/dist/core/carousel-view.d.ts.map +1 -0
- package/dist/core/carousel-view.js +99 -0
- package/dist/core/carousel-view.js.map +1 -0
- package/dist/core/form-view.d.ts +165 -0
- package/dist/core/form-view.d.ts.map +1 -0
- package/dist/core/form-view.js +365 -0
- package/dist/core/form-view.js.map +1 -0
- package/dist/core/jsonapp.d.ts +263 -0
- package/dist/core/jsonapp.d.ts.map +1 -0
- package/dist/core/jsonapp.js +528 -0
- package/dist/core/jsonapp.js.map +1 -0
- package/dist/core/key-store.d.ts +51 -0
- package/dist/core/key-store.d.ts.map +1 -0
- package/dist/core/key-store.js +138 -0
- package/dist/core/key-store.js.map +1 -0
- package/dist/core/map-view.d.ts +45 -0
- package/dist/core/map-view.d.ts.map +1 -0
- package/dist/core/map-view.js +318 -0
- package/dist/core/map-view.js.map +1 -0
- package/dist/core/media-view.d.ts +20 -0
- package/dist/core/media-view.d.ts.map +1 -0
- package/dist/core/media-view.js +75 -0
- package/dist/core/media-view.js.map +1 -0
- package/dist/core/message-view.d.ts +53 -0
- package/dist/core/message-view.d.ts.map +1 -0
- package/dist/core/message-view.js +109 -0
- package/dist/core/message-view.js.map +1 -0
- package/dist/core/notification.d.ts +17 -0
- package/dist/core/notification.d.ts.map +1 -0
- package/dist/core/notification.js +33 -0
- package/dist/core/notification.js.map +1 -0
- package/dist/core/qr-display-view.d.ts +32 -0
- package/dist/core/qr-display-view.d.ts.map +1 -0
- package/dist/core/qr-display-view.js +66 -0
- package/dist/core/qr-display-view.js.map +1 -0
- package/dist/core/qr-scan-view.d.ts +148 -0
- package/dist/core/qr-scan-view.d.ts.map +1 -0
- package/dist/core/qr-scan-view.js +259 -0
- package/dist/core/qr-scan-view.js.map +1 -0
- package/dist/core/reader-view.d.ts +73 -0
- package/dist/core/reader-view.d.ts.map +1 -0
- package/dist/core/reader-view.js +285 -0
- package/dist/core/reader-view.js.map +1 -0
- package/dist/core/timeline-view.d.ts +16 -0
- package/dist/core/timeline-view.d.ts.map +1 -0
- package/dist/core/timeline-view.js +68 -0
- package/dist/core/timeline-view.js.map +1 -0
- package/dist/errors/index.d.ts +276 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +431 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +576 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +48 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fileFormats.d.ts +52 -0
- package/dist/utils/fileFormats.d.ts.map +1 -0
- package/dist/utils/fileFormats.js +198 -0
- package/dist/utils/fileFormats.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +109 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validators.d.ts +48 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +445 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { BaseView } from './base-view';
|
|
2
|
+
import { FormView } from './form-view';
|
|
3
|
+
import { ReaderView } from './reader-view';
|
|
4
|
+
import { ActionListView } from './action-list-view';
|
|
5
|
+
import { ActionGridView } from './action-grid-view';
|
|
6
|
+
import { QRScanView } from './qr-scan-view';
|
|
7
|
+
import { QRDisplayView } from './qr-display-view';
|
|
8
|
+
import { MessageView } from './message-view';
|
|
9
|
+
import { CardView } from './card-view';
|
|
10
|
+
import { CarouselView } from './carousel-view';
|
|
11
|
+
import { TimelineView } from './timeline-view';
|
|
12
|
+
import { MediaView } from './media-view';
|
|
13
|
+
import { MapView } from './map-view';
|
|
14
|
+
import { Notification } from './notification';
|
|
15
|
+
import { SecureNotificationResponse } from '../types';
|
|
16
|
+
export interface JsonAppConfig {
|
|
17
|
+
appId: string;
|
|
18
|
+
privateKey?: string;
|
|
19
|
+
publicKey?: string;
|
|
20
|
+
allowedDomains?: string[];
|
|
21
|
+
viewExpirationMinutes?: number;
|
|
22
|
+
platformUrl?: string;
|
|
23
|
+
notificationTimeout?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* What `serve()` returns. The whole object goes on the wire as a JSON
|
|
27
|
+
* envelope — `res.json(jsonApp.serve(view))`. The signature CANNOT be
|
|
28
|
+
* forgotten because it lives in the structure itself, not in a header.
|
|
29
|
+
*
|
|
30
|
+
* `payload` is a JSON string (already serialised) — it's the bytes that
|
|
31
|
+
* were signed. The renderer verifies the signature on those exact bytes,
|
|
32
|
+
* then JSON.parses `payload` to get the decoded view envelope. No
|
|
33
|
+
* re-stringification happens on either side, so JS and Dart can't drift
|
|
34
|
+
* on JSON encoding.
|
|
35
|
+
*/
|
|
36
|
+
export interface SignedEnvelope {
|
|
37
|
+
/** JSON string of `{appId, timestamp, view}` — the bytes that were signed. */
|
|
38
|
+
payload: string;
|
|
39
|
+
/** Ed25519 signature over `payload` (base64). */
|
|
40
|
+
signature: string;
|
|
41
|
+
}
|
|
42
|
+
/** Decoded inner payload — the parsed shape of `payload`. */
|
|
43
|
+
export interface DecodedPayload {
|
|
44
|
+
appId: string;
|
|
45
|
+
timestamp: number;
|
|
46
|
+
view: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Claims surfaced by `verifyUserToken` after a successful RS256 check.
|
|
50
|
+
* Mirrors the fields Yeria puts in a per-service JWT.
|
|
51
|
+
*/
|
|
52
|
+
export interface UserTokenClaims {
|
|
53
|
+
/** Yeria user id. */
|
|
54
|
+
sub: string;
|
|
55
|
+
/** Either `'yeria-admin'` for the platform token, or the service id (as string) for a service-scoped token. */
|
|
56
|
+
aud: string;
|
|
57
|
+
/** Issuer — always `'yeria'`. */
|
|
58
|
+
iss: string;
|
|
59
|
+
/** Expiration time (unix seconds). */
|
|
60
|
+
exp: number;
|
|
61
|
+
/** Issued-at time (unix seconds). */
|
|
62
|
+
iat?: number;
|
|
63
|
+
/** Key id from the JWT header (`kid`). Useful for key-rollover scenarios. */
|
|
64
|
+
kid?: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resolver passed to `verifyUserTokenWithResolver`. Given the `kid` from
|
|
68
|
+
* the JWT header, returns the PEM the SDK should verify against — or
|
|
69
|
+
* `null` when the key is expired / unknown / not yet propagated. Wraps
|
|
70
|
+
* whatever lookup strategy the caller wants (typically `YeriaKeyStore`).
|
|
71
|
+
*/
|
|
72
|
+
export type YeriaPublicKeyResolver = (kid: string) => Promise<string | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Projection returned by `JsonApp.fetchUserProfile`. The current Yeria
|
|
75
|
+
* scope is intentionally minimal; the per-service `service_access.profile_scopes`
|
|
76
|
+
* work will widen this set without changing the field names.
|
|
77
|
+
*/
|
|
78
|
+
export interface UserProfile {
|
|
79
|
+
user_id: number;
|
|
80
|
+
first_name: string | null;
|
|
81
|
+
last_name: string | null;
|
|
82
|
+
country_code: string | null;
|
|
83
|
+
}
|
|
84
|
+
export declare class JsonApp {
|
|
85
|
+
private config;
|
|
86
|
+
private privateKey;
|
|
87
|
+
private publicKey;
|
|
88
|
+
constructor(config: JsonAppConfig);
|
|
89
|
+
/**
|
|
90
|
+
* Crée une vue de formulaire sécurisée
|
|
91
|
+
*/
|
|
92
|
+
createFormView(formId: string, title: string, processId?: string): FormView;
|
|
93
|
+
/**
|
|
94
|
+
* Crée une vue de lecture sécurisée
|
|
95
|
+
*/
|
|
96
|
+
createReaderView(viewId: string, title: string, processId?: string): ReaderView;
|
|
97
|
+
/**
|
|
98
|
+
* Crée une vue de liste d'actions sécurisée
|
|
99
|
+
*/
|
|
100
|
+
createActionListView(viewId: string, title: string, processId?: string): ActionListView;
|
|
101
|
+
/**
|
|
102
|
+
* Crée une vue de grille d'actions sécurisée
|
|
103
|
+
*/
|
|
104
|
+
createActionGridView(viewId: string, title: string, processId?: string): ActionGridView;
|
|
105
|
+
/**
|
|
106
|
+
* Crée une vue de scan QR sécurisée
|
|
107
|
+
*/
|
|
108
|
+
createQRScanView(viewId: string, title: string, processId?: string): QRScanView;
|
|
109
|
+
/**
|
|
110
|
+
* Crée une vue d'affichage QR sécurisée
|
|
111
|
+
*/
|
|
112
|
+
createQRDisplayView(viewId: string, title: string, processId?: string): QRDisplayView;
|
|
113
|
+
/**
|
|
114
|
+
* Crée une vue de message sécurisée
|
|
115
|
+
*/
|
|
116
|
+
createMessageView(viewId: string, title: string, processId?: string): MessageView;
|
|
117
|
+
createCardView(viewId: string, title: string, processId?: string): CardView;
|
|
118
|
+
createCarouselView(viewId: string, title: string, processId?: string): CarouselView;
|
|
119
|
+
createTimelineView(viewId: string, title: string, processId?: string): TimelineView;
|
|
120
|
+
createMediaView(viewId: string, title: string, processId?: string): MediaView;
|
|
121
|
+
createMapView(viewId: string, title: string, processId?: string): MapView;
|
|
122
|
+
/**
|
|
123
|
+
* Crée une notification pour un utilisateur spécifique
|
|
124
|
+
*/
|
|
125
|
+
createNotification(userId: string, title: string, body: string, link?: string): Notification;
|
|
126
|
+
/**
|
|
127
|
+
* Signe une notification avec Ed25519
|
|
128
|
+
*/
|
|
129
|
+
signNotification(notification: Notification): SecureNotificationResponse;
|
|
130
|
+
/**
|
|
131
|
+
* Envoie une notification signée à la plateforme City-Mate
|
|
132
|
+
* @param notification - Notification à envoyer
|
|
133
|
+
* @param platformUrl - URL de la plateforme (optionnel, utilise config.platformUrl si non fourni)
|
|
134
|
+
* @throws {ConfigurationError} Si aucune URL de plateforme n'est configurée
|
|
135
|
+
* @throws {ExternalError} Si l'envoi échoue
|
|
136
|
+
*/
|
|
137
|
+
sendNotification(notification: Notification, platformUrl?: string): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Rotate the service's signing key on the Yeria registry. The rotation
|
|
140
|
+
* envelope is signed with the *current* private key — the caller proves
|
|
141
|
+
* they own the still-valid keypair before the new one is accepted.
|
|
142
|
+
*
|
|
143
|
+
* After this call succeeds:
|
|
144
|
+
* - The new public key becomes Active on Yeria.
|
|
145
|
+
* - The old key keeps validating signatures for ~5 minutes (grace
|
|
146
|
+
* window so in-flight signed responses still verify).
|
|
147
|
+
* - This JsonApp instance is mutated to use the new keypair locally.
|
|
148
|
+
*
|
|
149
|
+
* @param yeriaApiBaseUrl - Yeria registry root, e.g. `https://yeria.app`
|
|
150
|
+
* @param serviceId - The service id assigned by Yeria
|
|
151
|
+
* @param newKeys - The freshly-generated keypair to switch to
|
|
152
|
+
*/
|
|
153
|
+
rotateKey(yeriaApiBaseUrl: string, serviceId: string | number, newKeys: {
|
|
154
|
+
privateKey: string;
|
|
155
|
+
publicKey: string;
|
|
156
|
+
}): Promise<{
|
|
157
|
+
keyId: number;
|
|
158
|
+
expiresAt: string;
|
|
159
|
+
gracePeriodMinutes: number;
|
|
160
|
+
}>;
|
|
161
|
+
/**
|
|
162
|
+
* Sérialise une vue, signe les bytes sérialisés, et retourne une
|
|
163
|
+
* enveloppe `{payload, signature}` à envoyer telle quelle au client.
|
|
164
|
+
*
|
|
165
|
+
* Usage côté provider (Express) :
|
|
166
|
+
* res.json(jsonApp.serve(view));
|
|
167
|
+
* res.status(400).json(jsonApp.serve(errorMessage));
|
|
168
|
+
*
|
|
169
|
+
* La signature est dans la structure de retour — impossible de
|
|
170
|
+
* l'oublier en l'envoyant. Le client vérifie sur `payload` (string)
|
|
171
|
+
* sans re-stringification.
|
|
172
|
+
*/
|
|
173
|
+
serve(view: BaseView): SignedEnvelope;
|
|
174
|
+
/**
|
|
175
|
+
* Obtient la clé publique pour la vérification côté frontend
|
|
176
|
+
*/
|
|
177
|
+
getPublicKey(): string;
|
|
178
|
+
/**
|
|
179
|
+
* Vérifie l'intégrité d'une enveloppe signée reçue du wire.
|
|
180
|
+
*
|
|
181
|
+
* @throws {AppIdMismatchError} si appId ne matche pas this.config.appId
|
|
182
|
+
* @throws {ViewExpiredError} si timestamp > viewExpirationMinutes
|
|
183
|
+
* @throws {SignatureVerificationError} si signature invalide ou payload malformé
|
|
184
|
+
*/
|
|
185
|
+
verifyIntegrity(envelope: SignedEnvelope): boolean;
|
|
186
|
+
/**
|
|
187
|
+
* Méthode statique pour vérifier une signature.
|
|
188
|
+
* @param publicKey - Clé publique Ed25519 (PEM format)
|
|
189
|
+
* @param payload - JSON string signée (extraite de l'enveloppe)
|
|
190
|
+
* @param signature - Signature base64
|
|
191
|
+
* @param onError - Optional error callback for logging
|
|
192
|
+
* @returns true si la signature est valide
|
|
193
|
+
*/
|
|
194
|
+
static verifySignature(publicKey: string, payload: string, signature: string, onError?: (error: Error) => void): boolean;
|
|
195
|
+
/**
|
|
196
|
+
* Génère statiquement une enveloppe signée sans instance JsonApp.
|
|
197
|
+
*/
|
|
198
|
+
static signView(view: Record<string, unknown>, appId: string, privateKey: string, timestamp?: number): SignedEnvelope;
|
|
199
|
+
/**
|
|
200
|
+
* Verify a Yeria-issued user token (RS256 JWT signed by Yeria's
|
|
201
|
+
* Registry RSA key). Used by providers to authenticate inbound
|
|
202
|
+
* requests carrying `Authorization: Bearer <serviceToken>`.
|
|
203
|
+
*
|
|
204
|
+
* @param jwtToken Compact JWT (header.payload.signature, base64url).
|
|
205
|
+
* @param yeriaPublicKey Yeria's Registry public key in PEM format.
|
|
206
|
+
* Fetch once at boot from
|
|
207
|
+
* `GET /api/v1/registry/public-key` and cache.
|
|
208
|
+
* @param expectedServiceId When supplied, asserts `aud === String(expectedServiceId)`.
|
|
209
|
+
* Pass the service id your backend is hosting; refuse
|
|
210
|
+
* tokens scoped to a different service.
|
|
211
|
+
* @returns The verified claims object.
|
|
212
|
+
* @throws SignatureVerificationError if signature invalid / token malformed / wrong issuer / wrong audience.
|
|
213
|
+
* @throws ViewExpiredError if the `exp` claim is in the past.
|
|
214
|
+
*/
|
|
215
|
+
static verifyUserToken(jwtToken: string, yeriaPublicKey: string, expectedServiceId?: string | number): UserTokenClaims;
|
|
216
|
+
/**
|
|
217
|
+
* Same audience-scoped JWT verify as `verifyUserToken`, but the second
|
|
218
|
+
* argument is a kid resolver instead of a fixed PEM. The SDK pulls
|
|
219
|
+
* the `kid` from the JWT header, calls `resolver(kid)`, and verifies
|
|
220
|
+
* the signature against whatever PEM comes back.
|
|
221
|
+
*
|
|
222
|
+
* Pair with `YeriaKeyStore` so providers don't have to write key-
|
|
223
|
+
* fetching, caching or rotation-grace handling themselves.
|
|
224
|
+
*
|
|
225
|
+
* @throws SignatureVerificationError if the resolver returns null, the
|
|
226
|
+
* signature fails, the issuer / audience mismatches, or the
|
|
227
|
+
* JWT is malformed.
|
|
228
|
+
* @throws ViewExpiredError when `exp` is in the past.
|
|
229
|
+
*/
|
|
230
|
+
static verifyUserTokenWithResolver(jwtToken: string, resolver: YeriaPublicKeyResolver, expectedServiceId?: string | number): Promise<UserTokenClaims>;
|
|
231
|
+
/**
|
|
232
|
+
* Provider-side helper: fetch a Yeria user's profile by `sub`.
|
|
233
|
+
*
|
|
234
|
+
* Builds an Ed25519-signed envelope and POSTs to
|
|
235
|
+
* `POST /api/v1/provider/services/{serviceId}/users/{userId}/profile`.
|
|
236
|
+
* Yeria already holds every Active public key for this service, so
|
|
237
|
+
* the envelope itself is the only credential — no user JWT is sent
|
|
238
|
+
* in the body and the PEM is never disclosed.
|
|
239
|
+
*
|
|
240
|
+
* Typical usage (provider middleware after `verifyUserTokenWithResolver`):
|
|
241
|
+
*
|
|
242
|
+
* let user = await db.users.findByYeriaSub(claims.sub);
|
|
243
|
+
* if (!user) {
|
|
244
|
+
* const profile = await JsonApp.fetchUserProfile({
|
|
245
|
+
* baseUrl: process.env.YERIA_BASE_URL,
|
|
246
|
+
* serviceId: MY_SERVICE_ID,
|
|
247
|
+
* userId: claims.sub,
|
|
248
|
+
* privateKey: SERVICE_ED25519_PRIVATE_KEY,
|
|
249
|
+
* });
|
|
250
|
+
* user = await db.users.insert({ yeria_sub: claims.sub, ...profile });
|
|
251
|
+
* }
|
|
252
|
+
*
|
|
253
|
+
* The hot path stays local-DB after the first miss.
|
|
254
|
+
*/
|
|
255
|
+
static fetchUserProfile(opts: {
|
|
256
|
+
baseUrl: string;
|
|
257
|
+
serviceId: string | number;
|
|
258
|
+
userId: string | number;
|
|
259
|
+
privateKey: string;
|
|
260
|
+
fetch?: typeof fetch;
|
|
261
|
+
}): Promise<UserProfile>;
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=jsonapp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonapp.d.ts","sourceRoot":"","sources":["../../src/core/jsonapp.ts"],"names":[],"mappings":"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"}
|