* Scaffold xrpc-stream * Write and test stream frames * Write and test stream server * Test bad stream frame parsing cases * Proof of concept streaming on xrpc-server * Test bad streaming endpoint * Make frame stream to fix buffering frame bytes together * reorg * some lex-cli things * better codegen for subscriptions * scaffolding repo subscriptions * wip * remove repo ops * setup notify/listen for db * end pool to fix hanging test * small comment in test * basic sequencer * some refactoring * switch to event emitter * reconnect on listener error * rename notifyClient * remove payload on channels * pr feedback * subscribeRepo outbox * some cleanup * wip * wip * bugfixin * only send msgs after tx is committed * better handle event-emitter -> generator * max buffer size * cleanup * Sync-up xrpc subscriptions with current iteration of the spec * Allow missing encoding for subscriptions * track sequencedAt & eventType as well * Resolve streaming type codes, streaming tests * Fix interface for hooking into http server for streaming, fix stream routing * Minor reorg how streaming is enabled in xrpc-server * Server codegen for xrpc subscriptions, supporting types in xrpc-server * fix up buffer overloading * Rename data frame to message frame, rename subscription lex output to message * Move body param first for streaming frames * Tidy * clean up evt types * buff up tests * missed merge conflict * new schema * blobs on subscriptions * rm genned client subscription methods * backfill limits * testing subscription route & quick outbox bugfix * fix up migration * cascade on delete * comments & naming * fix dev env * delete seqs on account deletion * tidy * fixing things up with db notify system for schemas * fix duplicates in outbox * tidy * Break out of stream handler when socket closes * fixing up some timing issues * tidy * terminate ws after using * bump up timer on async reader * fixing up NOTIFY in txns * pr feedback * pr bugfixes * make order asc explicit * bringing tests up to speed w atpagent * bump up max listeners on sequencer * increase timeouts for reading from generators --------- Co-authored-by: Devin Ivy <devinivy@gmail.com>
ATP API
Usage
import AtpAgent from '@atproto/api'
const agent = new AtpAgent({service: 'https://example.com'})
// provide a custom fetch implementation (shouldnt be needed in node or the browser)
import {AtpAgentFetchHeaders, AtpAgentFetchHandlerResponse} from '@atproto/api'
AtpAgent.configure({
async fetch(
httpUri: string,
httpMethod: string,
httpHeaders: AtpAgentFetchHeaders,
httpReqBody: any,
): Promise<AtpAgentFetchHandlerResponse> {
// insert definition here...
return {status: 200, /*...*/}
}
})
Session management
import AtpAgent, {AtpSessionEvent, AtpSessionData} from '@atproto/api'
const agent = new AtpAgent({
service: 'https://example.com',
persistSession: (evt: AtpSessionEvent, sess?: AtpSessionData) {
// store the session-data for reuse
}
})
await agent.login({identifier: 'alice@mail.com', password: 'hunter2'})
await agent.resumeSession(savedSessionData)
await agent.createAccount({
email: 'alice@mail.com',
password: 'hunter2',
handle: 'alice.example.com'
})
API calls
// xrpc methods
const res1 = await agent.api.com.atproto.repo.createRecord(
{
did: alice.did,
collection: 'app.bsky.feed.post',
record: {
$type: 'app.bsky.feed.post',
text: 'Hello, world!',
createdAt: (new Date()).toISOString()
}
}
)
const res2 = await agent.api.com.atproto.repo.listRecords({did: alice.did, type: 'app.bsky.feed.post'})
// repo record methods
const res3 = await agent.api.app.bsky.feed.post.create({did: alice.did}, {
text: 'Hello, world!',
createdAt: (new Date()).toISOString()
})
const res4 = await agent.api.app.bsky.feed.post.list({did: alice.did})
License
MIT