mirror of
https://github.com/versia-pub/api.git
synced 2025-12-06 08:28:19 +01:00
docs(federation): 📝 Update READMEs and some docstrings
This commit is contained in:
parent
b86933e77d
commit
e34bd84b0c
|
|
@ -16,12 +16,6 @@ Compilation (bundling/minifying) time is a few seconds, almost all of which is s
|
||||||
|
|
||||||
### Federation
|
### Federation
|
||||||
|
|
||||||
#### Roadmap
|
|
||||||
|
|
||||||
- [x] Validation
|
|
||||||
- [ ] Signing code
|
|
||||||
- [ ] Advanced validator
|
|
||||||
|
|
||||||
#### Validation
|
#### Validation
|
||||||
|
|
||||||
[**Zod**](https://zod.dev) is used to validate and parse the objects. All Lysand objects are already written for you.
|
[**Zod**](https://zod.dev) is used to validate and parse the objects. All Lysand objects are already written for you.
|
||||||
|
|
@ -54,10 +48,70 @@ const validNote = await validator.Note(validNoteObject);
|
||||||
// validNote is still the same as noteObject
|
// validNote is still the same as noteObject
|
||||||
```
|
```
|
||||||
|
|
||||||
For more information about Note's methods, see the [**Zod documentation**](https://zod.dev/docs/).
|
|
||||||
|
|
||||||
Your editor's IntelliSense should provide you with every method and property available, which all match the [**Lysand**](https://lysand.org) specification names.
|
Your editor's IntelliSense should provide you with every method and property available, which all match the [**Lysand**](https://lysand.org) specification names.
|
||||||
|
|
||||||
|
#### Cryptography
|
||||||
|
|
||||||
|
The cryptography module provides two main classes: [`SignatureConstructor`](federation/cryptography/index.ts) and [`SignatureValidator`](federation/cryptography/index.ts). These classes are used to construct and validate signatures for requests, respectively.
|
||||||
|
|
||||||
|
##### SignatureConstructor
|
||||||
|
|
||||||
|
The [`SignatureConstructor`](federation/cryptography/index.ts) class is used to construct a signature for a request. It can be instantiated with a private key and a key ID:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const privateKey = // CryptoKey
|
||||||
|
const keyId = "https://example.com/users/6a18f2c3-120e-4949-bda4-2aa4c8264d51";
|
||||||
|
const constructor = new SignatureConstructor(privateKey, keyId);
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can create a `SignatureConstructor` instance from a base64-encoded private key:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const privateKey = "base64PrivateKey";
|
||||||
|
const keyId = "https://example.com/users/6a18f2c3-120e-4949-bda4-2aa4c8264d51";
|
||||||
|
const constructor = await SignatureConstructor.fromStringKey(privateKey, keyId);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `sign` method is used to sign a request:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const request = new Request();
|
||||||
|
// Returns a Request object with Signature and Date set
|
||||||
|
const signature = await constructor.sign(request);
|
||||||
|
// Alternatively
|
||||||
|
// Returns a Header object with Signature and Date set
|
||||||
|
const signature = await constructor.sign(date, method, url, body);
|
||||||
|
```
|
||||||
|
|
||||||
|
##### SignatureValidator
|
||||||
|
|
||||||
|
The [`SignatureValidator`](federation/cryptography/index.ts) class is used to validate the signature of a request. It can be instantiated with a public key:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const publicKey = // CryptoKey
|
||||||
|
const validator = new SignatureValidator(publicKey);
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can create a `SignatureValidator` instance from a base64-encoded public key:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const publicKey = "base64PublicKey";
|
||||||
|
const validator = await SignatureValidator.fromStringKey(publicKey);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `validate` method is used to validate a request or signature:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const request = new Request();
|
||||||
|
// Returns boolean or TypeError if data is invalid
|
||||||
|
const isValid = await validator.validate(request);
|
||||||
|
// Alternatively
|
||||||
|
// Returns boolean or TypeError if data is invalid
|
||||||
|
const isValid = await validator.validate(signature, date, method, url, body);
|
||||||
|
```
|
||||||
|
|
||||||
|
Please note that these classes require the WebCrypto API and Ed25519 support in the environment. WebCrypto support is automatically checked, but Ed25519 cannot be as far as I know.
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { describe, beforeAll, test, expect, beforeEach } from "bun:test";
|
import { beforeAll, beforeEach, describe, expect, test } from "bun:test";
|
||||||
import { SignatureValidator, SignatureConstructor } from "./index";
|
import { SignatureConstructor, SignatureValidator } from "./index";
|
||||||
|
|
||||||
describe("SignatureValidator", () => {
|
describe("SignatureValidator", () => {
|
||||||
let validator: SignatureValidator;
|
let validator: SignatureValidator;
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,11 @@ export class SignatureConstructor {
|
||||||
/**
|
/**
|
||||||
* Creates a new instance of SignatureConstructor.
|
* Creates a new instance of SignatureConstructor.
|
||||||
* @param privateKey The private key used for signature generation.
|
* @param privateKey The private key used for signature generation.
|
||||||
|
* @param keyId The key ID used for the Signature header.
|
||||||
|
* @example
|
||||||
|
* const privateKey = // CryptoKey
|
||||||
|
* const keyId = "https://example.com/users/6a18f2c3-120e-4949-bda4-2aa4c8264d51";
|
||||||
|
* const constructor = new SignatureConstructor(privateKey, keyId);
|
||||||
*/
|
*/
|
||||||
constructor(
|
constructor(
|
||||||
private privateKey: CryptoKey,
|
private privateKey: CryptoKey,
|
||||||
|
|
@ -200,10 +205,12 @@ export class SignatureConstructor {
|
||||||
/**
|
/**
|
||||||
* Creates a SignatureConstructor instance from a base64-encoded private key.
|
* Creates a SignatureConstructor instance from a base64-encoded private key.
|
||||||
* @param base64PrivateKey The base64-encoded private key.
|
* @param base64PrivateKey The base64-encoded private key.
|
||||||
|
* @param keyId The key ID used for the Signature header.
|
||||||
* @returns A Promise that resolves to a SignatureConstructor instance.
|
* @returns A Promise that resolves to a SignatureConstructor instance.
|
||||||
* @example
|
* @example
|
||||||
* const privateKey = "base64PrivateKey";
|
* const privateKey = "base64PrivateKey";
|
||||||
* const constructor = await SignatureConstructor.fromStringKey(privateKey);
|
* const keyId = "https://example.com/users/6a18f2c3-120e-4949-bda4-2aa4c8264d51";
|
||||||
|
* const constructor = await SignatureConstructor.fromStringKey(privateKey, keyId);
|
||||||
*/
|
*/
|
||||||
static async fromStringKey(
|
static async fromStringKey(
|
||||||
base64PrivateKey: string,
|
base64PrivateKey: string,
|
||||||
|
|
@ -243,8 +250,7 @@ export class SignatureConstructor {
|
||||||
* const method = "GET";
|
* const method = "GET";
|
||||||
* const url = new URL("https://example.com");
|
* const url = new URL("https://example.com");
|
||||||
* const body = "request body";
|
* const body = "request body";
|
||||||
* const headers = new Headers();
|
* const signedHeaders = await constructor.sign(method, url, body);
|
||||||
* const signedHeaders = await constructor.sign(method, url, body, headers);
|
|
||||||
*/
|
*/
|
||||||
async sign(
|
async sign(
|
||||||
method: HttpVerb,
|
method: HttpVerb,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue