Licence
AGPL-3.0-or-later
Version
0.14.0
Deps
4
Size
212 kB
Vulns
0
Weekly
108
@commonpub/protocol
ActivityPub federation protocol implementation for CommonPub.
Overview
Implements the ActivityPub protocol layer: WebFinger discovery, NodeInfo, activity building and processing, content mapping, actor resolution, keypair management, and inbox/outbox handling. Pure TypeScript — a hand-rolled ActivityPub implementation with zero Fedify dependency (HTTP Signatures via jose).
Installation
pnpm add @commonpub/protocolUsage
WebFinger Discovery
import { parseWebFingerResource, buildWebFingerResponse } from '@commonpub/protocol';
// Parse an acct: URI
const parsed = parseWebFingerResource('acct:alice@hack.build');
// { username: 'alice', domain: 'hack.build' }
// Build a WebFinger response
const response = buildWebFingerResponse({
subject: 'acct:alice@hack.build',
actorUrl: 'https://hack.build/users/alice',
profileUrl: 'https://hack.build/@alice',
});NodeInfo
import { buildNodeInfoResponse, buildNodeInfoWellKnown } from '@commonpub/protocol';
const nodeInfo = buildNodeInfoResponse({
domain: 'hack.build',
name: 'hack.build',
description: 'A maker community',
totalUsers: 42,
activeMonth: 15,
localPosts: 128,
});Building Activities
import {
buildCreateActivity,
buildFollowActivity,
buildLikeActivity,
buildAnnounceActivity,
} from '@commonpub/protocol';
// Create a new article
const create = buildCreateActivity({
actorId: 'https://hack.build/users/alice',
object: article,
});
// Follow an actor
const follow = buildFollowActivity({
actorId: 'https://hack.build/users/alice',
targetId: 'https://deveco.io/users/bob',
});Content Mapping
Bidirectional mapping between CommonPub content and AP objects:
import { contentToArticle, articleToContent, contentToNote, noteToComment } from '@commonpub/protocol';
// CommonPub content -> AP Article
const article = contentToArticle(contentItem, author);
// AP Article -> CommonPub content
const content = articleToContent(apArticle);Actor Resolution
import { resolveActor, resolveActorViaWebFinger } from '@commonpub/protocol';
// Resolve by actor URL
const actor = await resolveActor('https://deveco.io/users/bob');
// Resolve via WebFinger
const actor = await resolveActorViaWebFinger('bob@deveco.io');Keypair Management
RSA 2048 keypairs for HTTP signatures:
import { generateKeypair, exportPublicKeyPem, buildKeyId } from '@commonpub/protocol';
const keypair = await generateKeypair();
const publicPem = await exportPublicKeyPem(keypair.publicKey);
const keyId = buildKeyId('https://hack.build/users/alice');Inbox Processing
import { processInboxActivity } from '@commonpub/protocol';
const result = await processInboxActivity(activity, {
onFollow: async (follower, target) => { /* ... */ },
onLike: async (actor, object) => { /* ... */ },
onAnnounce: async (actor, object) => { /* ... */ },
// ... handlers for all 9 activity types
});Supported Activity Types
| Activity | Direction | Description |
|---|---|---|
Create |
Out/In | New content published |
Update |
Out/In | Content edited |
Delete |
Out/In | Content removed (Tombstone) |
Follow |
Out/In | Follow request |
Accept |
Out/In | Follow request accepted |
Reject |
Out/In | Follow request rejected |
Undo |
Out/In | Undo a previous activity |
Like |
Out/In | Content liked |
Announce |
Out/In | Content shared/boosted |
AP Object Types
APArticle: Long-form content (projects, articles, guides)APNote: Short-form content (comments, replies)APTombstone: Deleted content marker
OAuth2 SSO
OAuth2 authorization and token validation for cross-instance SSO:
import { validateAuthorizeRequest, validateTokenRequest } from '@commonpub/protocol';Development
pnpm build # Compile TypeScript
pnpm test # Run 42 tests
pnpm typecheck # Type-check without emittingDependencies
jose: JWT and JWK operationszod: Input validation@commonpub/config: Feature flags@commonpub/schema: Table definitions for federation state