Skip to content

Commit

Permalink
Email confirmation/update (bluesky-social#1568)
Browse files Browse the repository at this point in the history
* lexicons

* codegen

* email templates

* request routes

* impl

* migration

* tidy

* tests

* tidy & bugfixes

* format

* fix api test

* fix auth test

* codegen

* add unique constraint

* Add email confirmed to AtpSessionData

* interop test files (bluesky-social#1529)

* initial interop-test-files

* crypto: switch signature-fixtures.json to a symlink

* syntax: test against interop files

* prettier

* Update interop-test-files/README.md

Co-authored-by: Eric Bailey <[email protected]>

* disable prettier on test vectors

---------

Co-authored-by: Eric Bailey <[email protected]>
Co-authored-by: dholms <[email protected]>

* add getSuggestedFollowsByActor (bluesky-social#1553)

* add getSuggestedFollowsByActor lex

* remove pagination

* codegen

* add pds route

* add app view route

* first pass at likes-based suggested actors, plus tests

* format

* backfill with suggested_follow table

* combine actors queries

* fall back to popular follows, handle backfill differently

* revert seed change, update test

* lower likes threshold

* cleanup

* remove todo

* format

* optimize queries

* cover mute lists

* clean up into pipeline steps

* add changeset

* List feeds (bluesky-social#1557)

* lexicons for block lists

* reorg blockset functionality into graph service, impl block/mute filtering

* apply filterBlocksAndMutes() throughout appview except feeds

* update local feeds to pass through cleanFeedSkeleton(), offload block/mute application

* impl for grabbing block/mute details by did pair

* refactor getActorInfos away, use actor service

* experiment with moving getFeedGenerators over to a pipeline

* move getPostThread over to a pipeline

* move feeds over to pipelines

* move suggestions and likes over to pipelines

* move reposted-by, follows, followers over to pipelines, tidy author feed and post thread

* remove old block/mute checks

* unify post presentation logic

* move profiles endpoints over to pipelines

* tidy

* tidy

* misc fixes

* unify some profile hydration/presentation in appview

* profile detail, split hydration and presentation, misc fixes

* unify feed hydration w/ profile hydration

* unify hydration step for embeds, tidy application of labels

* setup indexing of list-blocks in bsky appview

* apply list-blocks, impl getListBlocks, tidy getList, tests

* tidy

* update pds proxy snaps

* update pds proxy snaps

* fix snap

* make algos return feed items, save work in getFeed

* misc changes, tidy

* tidy

* fix aturi import

* lex

* list purpose

* lex gen

* add route

* add proxy route

* seed client helpers

* tests

* mutes and blocks

* proxy test

* snapshot

* hoist actors out of composeThread()

* tidy

* tidy

* run ci on all prs

* format

* format

* fix snap name

* fix snapsh

---------

Co-authored-by: Devin Ivy <[email protected]>

* Improve xrpc server error handling (bluesky-social#1597)

improve xrpc server error handling

* Remove appview proxy runtime flags (bluesky-social#1590)

* remove appview proxy runtime flags

* clean up proxy tests

* getPopular hotfix (bluesky-social#1599)

dont pass all params

* Interaction Gating (bluesky-social#1561)

* lexicons for block lists

* reorg blockset functionality into graph service, impl block/mute filtering

* apply filterBlocksAndMutes() throughout appview except feeds

* update local feeds to pass through cleanFeedSkeleton(), offload block/mute application

* impl for grabbing block/mute details by did pair

* refactor getActorInfos away, use actor service

* experiment with moving getFeedGenerators over to a pipeline

* move getPostThread over to a pipeline

* move feeds over to pipelines

* move suggestions and likes over to pipelines

* move reposted-by, follows, followers over to pipelines, tidy author feed and post thread

* remove old block/mute checks

* unify post presentation logic

* move profiles endpoints over to pipelines

* tidy

* tidy

* misc fixes

* unify some profile hydration/presentation in appview

* profile detail, split hydration and presentation, misc fixes

* unify feed hydration w/ profile hydration

* unify hydration step for embeds, tidy application of labels

* setup indexing of list-blocks in bsky appview

* apply list-blocks, impl getListBlocks, tidy getList, tests

* tidy

* update pds proxy snaps

* update pds proxy snaps

* fix snap

* make algos return feed items, save work in getFeed

* misc changes, tidy

* tidy

* fix aturi import

* initial lexicons for interaction-gating

* add interactions view to post views

* codegen

* model bad reply/interaction check state on posts

* initial impl for checking bad reply or interaction on write

* omit invalid interactions from post thread

* support not-found list in interaction view

* hydrate can-reply state on threads

* present interaction views on posts

* misc fixes, update snaps

* tidy/reorg

* tidy

* split interaction gating into separate record in lexicon

* switch interaction-gating impl to use separate record type

* allow checking reply gate w/ root post deletion

* fix

* initial gating tests

* tighten gated reply views, tests

* reply-gating list rule tests

* allow custom post rkeys within window

* hoist actors out of composeThread()

* tidy

* update thread gate lexicons, codegen

* lex fix

* rename gate to threadgate in bsky, update views

* lex fix

* improve terminology around reply validation

* fix down migration

* remove thread gates on actor unindexing

* add back .prettierignore

* tidy

* run ci on all prs

* syntax

* run ci on all prs

* format

* fix snap

---------

Co-authored-by: Devin Ivy <[email protected]>

* order by `like.indexedAt` in app view (bluesky-social#1592)

* order by like.indexedAt

* use keyset for ordering

* simplify

* ok ok ok I get it now

* Update packages/bsky/src/api/app/bsky/feed/getActorLikes.ts

Co-authored-by: Daniel Holmgren <[email protected]>

---------

Co-authored-by: Daniel Holmgren <[email protected]>

* Remove default value for post table invalid attrs (bluesky-social#1601)

remove default value for post table attrs

* Version packages (bluesky-social#1602)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* update Bluesky PBLLC to PBC (Public Benefit Corporation) (bluesky-social#1600)

* Temporarily disable filtering `invalidReplyRoot`s (bluesky-social#1609)

temporarily disable invalidReplyRoot check

* fix syntax docs (bluesky-social#1611)

* Version packages (bluesky-social#1612)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Allow bypass on ratelimit ip (bluesky-social#1613)

allow bypass on ratelimit ip

* Write rate limits (bluesky-social#1578)

* get rate limit ip correctly

* add write rate-limits

* Tweak createSession rate limit key (bluesky-social#1614)

tweak create session rl key

* Filter preferences for app passwords (bluesky-social#1626)

filter preferences for app passwords

* Tweak rate limit setup for multi rate limit routes (bluesky-social#1627)

tweak rate limit setup for multi rate limit routes

* Remove zod from xrpc-server error handling (bluesky-social#1631)

remove zod from xrpc-server error handling check

* Enforce properties field on lexicon object schemas (bluesky-social#1628)

* add empty properites to thread gate schema fragments

* tweak lexicon type

* Add feed-vew and thread-view preferences (bluesky-social#1638)

* Add feed and thread preference lexicons

* Add feed-view and thread-view preference APIs

* Add changeset for new preferences  (bluesky-social#1639)

Add changeset

* Version packages (bluesky-social#1640)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Disable getAccountInviteCodes for app passwords (bluesky-social#1642)

disable getAccountInviteCodes for app passwords

* remove cruft packages (uri, nsid, identifier) (bluesky-social#1606)

* remove @atproto/nsid (previously moved to syntax)

* remove @atproto/uri (previously moved to syntax)

* remove @atproto/identifier (previously moved to syntax)

* bump lockfile to remove old packages

---------

Co-authored-by: Eric Bailey <[email protected]>

* api: update login/resumeSession examples in README (bluesky-social#1634)

* api: update login/resumeSession examples in README

* Update packages/api/README.md

Co-authored-by: Daniel Holmgren <[email protected]>

---------

Co-authored-by: Daniel Holmgren <[email protected]>

* small syntax lints (bluesky-social#1646)

* lint: remove unused imports and variables

* lint: prefix unused args with '_'

* eslint: skip no-explicit-any; ignore unused _var (prefix)

* eslint: explicitly mark ignores for tricky cases

* indicate that getPopular is deprecated (bluesky-social#1647)

* indicate that getPopular is deprecated

* codegen for deprecating getPopular

* tidy up package.json and READMEs (bluesky-social#1649)

* identity: README example and tidy

* tidy up package metadata (package.json files)

* updated README headers/stubs for several packages

* crypto: longer README, with usage

* syntax: tweak README

* Apply suggestions from code review

Co-authored-by: Eric Bailey <[email protected]>
Co-authored-by: devin ivy <[email protected]>

---------

Co-authored-by: Eric Bailey <[email protected]>
Co-authored-by: devin ivy <[email protected]>

* Improve the types of the thread and feed preferences APIs (bluesky-social#1653)

* Improve the types of the thread and feed preferences APIs

* Remove unused import

* Add changeset

* Version packages (bluesky-social#1654)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Disable pds appview routes (bluesky-social#1644)

* wip

* remove all canProxyReadc

* finish cleanup

* clean up tests

* fix up tests

* fix api tests

* fix build

* fix compression test

* update image tests

* fix dev envs

* build branch

* fix service file

* re-enable getPopular

* format

* rm unused sharp code

* dont build branch

* auto-moderator tweaks: pass along record URI, create report for takedown action (bluesky-social#1643)

* auto-moderator: include record URI in abyss requests

* auto-moderator: log attempt at hard takedown; create report as well

The motivation is to flag the event to mod team, and to make it easier
to confirm that takedown took place.

* auto-mod: typo fix

* auto-mod: bugfixes

* bsky: always create auto-mod report locally, not pushAgent (if possible)

* bsky: fix auto-mod build

* bsky: URL-encode scanBlob call

* Clear follow viewer state when blocking (bluesky-social#1659)

* clear follow viewer state when blocking

* tidy

* add `tags` to posts (bluesky-social#1637)

* add tags to post lex

* kiss

* add richtext facet and validation attrs

* add tag validation attrs to post

* codegen

* add maxLength for tags, add description

* validate post tags on write

* add test

* handle tags in indexer

* add tags to postView, codegen

* return tags on post thread view

* format

* revert formatting change to docs

* use establish validation pattern

* add changeset

(cherry picked from commit 464b8074f726fa12b0dc9887add3537ae85b8055)

* remove tags from postView, codegen

* remove tags from thread view

* revert unused changes

* Version packages (bluesky-social#1664)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* merge

* Reverse order of blocks from sync.getRepo (bluesky-social#1665)

* reverse order of blocks from sync.getRepo

* write to car while fetching next page

* Add hashtag detection to richtext (bluesky-social#1651)

* add tag detection to richtext

* fix duplicate tag index error

* add utils

* fix leading space index failures, test for them

* add changeset

* Version packages (bluesky-social#1669)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* proposed new search lexicons (bluesky-social#1594)

* proposed new search lexicons

* lexicons: lint

* lexicons: fix actors typo

* lexicons: camelCase bites again, ssssss

* lexicons: add 'q' and mark 'term' as deprecated for search endpoints

* codegen for search lexicon updates

* bsky: prefer 'q' over 'term' in existing search endpoints

* search: bugfix

* lexicons: make unspecced search endpoints return skeleton obj

* re-codegen for search skeleton obj

* Disable pds appview indexing (bluesky-social#1645)

* rm indexing service

* remove message queue & refactor background queue

* wip

* remove all canProxyReadc

* finish cleanup

* clean up tests

* fix up tests

* fix api tests

* fix build

* fix compression test

* update image tests

* fix dev envs

* build branch

* wip - removing labeler

* fix service file

* remove kysely tables

* re-enable getPopular

* format

* cleaning up tests

* rm unused sharp code

* rm pds build

* clean up tests

* fix build

* fix build

* migration

* tidy

* build branch

* tidy

* build branch

* small tidy

* dont build

* Refactor PDS appview routes (bluesky-social#1673)

move routes around

* Strip leading `#` from from detected tag facets (bluesky-social#1674)

ensure # is removed from facets

* Version packages (bluesky-social#1675)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Proxy search queries (bluesky-social#1676)

* proxy search

* tweak profile resp

* fix admin.searchRepos

* add mock mailer

* Fix to daniel's MOCKERY of a mock mailer

* Don't allow non-verified email updates until app feature is out (bluesky-social#1682)

stricter updating email until app feature is out

* changesets

---------

Co-authored-by: Paul Frazee <[email protected]>
Co-authored-by: bnewbold <[email protected]>
Co-authored-by: Eric Bailey <[email protected]>
Co-authored-by: Devin Ivy <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
7 people authored Sep 27, 2023
1 parent 1f2fe20 commit 6f2ef46
Show file tree
Hide file tree
Showing 58 changed files with 2,375 additions and 7 deletions.
7 changes: 7 additions & 0 deletions .changeset/little-fans-obey.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@atproto/dev-env': patch
'@atproto/api': patch
'@atproto/pds': patch
---

Added email verification and update flows
5 changes: 5 additions & 0 deletions .changeset/witty-islands-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@atproto/common-web': patch
---

Added lessThanAgoMs utility
27 changes: 27 additions & 0 deletions lexicons/com/atproto/server/confirmEmail.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"lexicon": 1,
"id": "com.atproto.server.confirmEmail",
"defs": {
"main": {
"type": "procedure",
"description": "Confirm an email using a token from com.atproto.server.requestEmailConfirmation.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["email", "token"],
"properties": {
"email": { "type": "string" },
"token": { "type": "string" }
}
}
},
"errors": [
{ "name": "AccountNotFound" },
{ "name": "ExpiredToken" },
{ "name": "InvalidToken" },
{ "name": "InvalidEmail" }
]
}
}
}
3 changes: 2 additions & 1 deletion lexicons/com/atproto/server/createSession.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
"refreshJwt": { "type": "string" },
"handle": { "type": "string", "format": "handle" },
"did": { "type": "string", "format": "did" },
"email": { "type": "string" }
"email": { "type": "string" },
"emailConfirmed": { "type": "boolean" }
}
}
},
Expand Down
3 changes: 2 additions & 1 deletion lexicons/com/atproto/server/getSession.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
"properties": {
"handle": { "type": "string", "format": "handle" },
"did": { "type": "string", "format": "did" },
"email": { "type": "string" }
"email": { "type": "string" },
"emailConfirmed": { "type": "boolean" }
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions lexicons/com/atproto/server/requestEmailConfirmation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"lexicon": 1,
"id": "com.atproto.server.requestEmailConfirmation",
"defs": {
"main": {
"type": "procedure",
"description": "Request an email with a code to confirm ownership of email"
}
}
}
20 changes: 20 additions & 0 deletions lexicons/com/atproto/server/requestEmailUpdate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"lexicon": 1,
"id": "com.atproto.server.requestEmailUpdate",
"defs": {
"main": {
"type": "procedure",
"description": "Request a token in order to update email.",
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["tokenRequired"],
"properties": {
"tokenRequired": { "type": "boolean" }
}
}
}
}
}
}
29 changes: 29 additions & 0 deletions lexicons/com/atproto/server/updateEmail.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"lexicon": 1,
"id": "com.atproto.server.updateEmail",
"defs": {
"main": {
"type": "procedure",
"description": "Update an account's email.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["email"],
"properties": {
"email": { "type": "string" },
"token": {
"type": "string",
"description": "Requires a token from com.atproto.sever.requestEmailUpdate if the account's email has been confirmed."
}
}
}
},
"errors": [
{ "name": "ExpiredToken" },
{ "name": "InvalidToken" },
{ "name": "TokenRequired" }
]
}
}
}
4 changes: 4 additions & 0 deletions packages/api/src/agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ export class AtpAgent {
handle: res.data.handle,
did: res.data.did,
email: opts.email,
emailConfirmed: false,
}
return res
} catch (e) {
Expand Down Expand Up @@ -126,6 +127,7 @@ export class AtpAgent {
handle: res.data.handle,
did: res.data.did,
email: res.data.email,
emailConfirmed: res.data.emailConfirmed,
}
return res
} catch (e) {
Expand Down Expand Up @@ -154,6 +156,7 @@ export class AtpAgent {
}
this.session.email = res.data.email
this.session.handle = res.data.handle
this.session.emailConfirmed = res.data.emailConfirmed
return res
} catch (e) {
this.session = undefined
Expand Down Expand Up @@ -268,6 +271,7 @@ export class AtpAgent {
} else if (isNewSessionObject(this._baseClient, res.body)) {
// succeeded, update the session
this.session = {
...(this.session || {}),
accessJwt: res.body.accessJwt,
refreshJwt: res.body.refreshJwt,
handle: res.body.handle,
Expand Down
52 changes: 52 additions & 0 deletions packages/api/src/client/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import * as ComAtprotoRepoListRecords from './types/com/atproto/repo/listRecords
import * as ComAtprotoRepoPutRecord from './types/com/atproto/repo/putRecord'
import * as ComAtprotoRepoStrongRef from './types/com/atproto/repo/strongRef'
import * as ComAtprotoRepoUploadBlob from './types/com/atproto/repo/uploadBlob'
import * as ComAtprotoServerConfirmEmail from './types/com/atproto/server/confirmEmail'
import * as ComAtprotoServerCreateAccount from './types/com/atproto/server/createAccount'
import * as ComAtprotoServerCreateAppPassword from './types/com/atproto/server/createAppPassword'
import * as ComAtprotoServerCreateInviteCode from './types/com/atproto/server/createInviteCode'
Expand All @@ -55,9 +56,12 @@ import * as ComAtprotoServerGetSession from './types/com/atproto/server/getSessi
import * as ComAtprotoServerListAppPasswords from './types/com/atproto/server/listAppPasswords'
import * as ComAtprotoServerRefreshSession from './types/com/atproto/server/refreshSession'
import * as ComAtprotoServerRequestAccountDelete from './types/com/atproto/server/requestAccountDelete'
import * as ComAtprotoServerRequestEmailConfirmation from './types/com/atproto/server/requestEmailConfirmation'
import * as ComAtprotoServerRequestEmailUpdate from './types/com/atproto/server/requestEmailUpdate'
import * as ComAtprotoServerRequestPasswordReset from './types/com/atproto/server/requestPasswordReset'
import * as ComAtprotoServerResetPassword from './types/com/atproto/server/resetPassword'
import * as ComAtprotoServerRevokeAppPassword from './types/com/atproto/server/revokeAppPassword'
import * as ComAtprotoServerUpdateEmail from './types/com/atproto/server/updateEmail'
import * as ComAtprotoSyncGetBlob from './types/com/atproto/sync/getBlob'
import * as ComAtprotoSyncGetBlocks from './types/com/atproto/sync/getBlocks'
import * as ComAtprotoSyncGetCheckout from './types/com/atproto/sync/getCheckout'
Expand Down Expand Up @@ -170,6 +174,7 @@ export * as ComAtprotoRepoListRecords from './types/com/atproto/repo/listRecords
export * as ComAtprotoRepoPutRecord from './types/com/atproto/repo/putRecord'
export * as ComAtprotoRepoStrongRef from './types/com/atproto/repo/strongRef'
export * as ComAtprotoRepoUploadBlob from './types/com/atproto/repo/uploadBlob'
export * as ComAtprotoServerConfirmEmail from './types/com/atproto/server/confirmEmail'
export * as ComAtprotoServerCreateAccount from './types/com/atproto/server/createAccount'
export * as ComAtprotoServerCreateAppPassword from './types/com/atproto/server/createAppPassword'
export * as ComAtprotoServerCreateInviteCode from './types/com/atproto/server/createInviteCode'
Expand All @@ -184,9 +189,12 @@ export * as ComAtprotoServerGetSession from './types/com/atproto/server/getSessi
export * as ComAtprotoServerListAppPasswords from './types/com/atproto/server/listAppPasswords'
export * as ComAtprotoServerRefreshSession from './types/com/atproto/server/refreshSession'
export * as ComAtprotoServerRequestAccountDelete from './types/com/atproto/server/requestAccountDelete'
export * as ComAtprotoServerRequestEmailConfirmation from './types/com/atproto/server/requestEmailConfirmation'
export * as ComAtprotoServerRequestEmailUpdate from './types/com/atproto/server/requestEmailUpdate'
export * as ComAtprotoServerRequestPasswordReset from './types/com/atproto/server/requestPasswordReset'
export * as ComAtprotoServerResetPassword from './types/com/atproto/server/resetPassword'
export * as ComAtprotoServerRevokeAppPassword from './types/com/atproto/server/revokeAppPassword'
export * as ComAtprotoServerUpdateEmail from './types/com/atproto/server/updateEmail'
export * as ComAtprotoSyncGetBlob from './types/com/atproto/sync/getBlob'
export * as ComAtprotoSyncGetBlocks from './types/com/atproto/sync/getBlocks'
export * as ComAtprotoSyncGetCheckout from './types/com/atproto/sync/getCheckout'
Expand Down Expand Up @@ -712,6 +720,17 @@ export class ServerNS {
this._service = service
}

confirmEmail(
data?: ComAtprotoServerConfirmEmail.InputSchema,
opts?: ComAtprotoServerConfirmEmail.CallOptions,
): Promise<ComAtprotoServerConfirmEmail.Response> {
return this._service.xrpc
.call('com.atproto.server.confirmEmail', opts?.qp, data, opts)
.catch((e) => {
throw ComAtprotoServerConfirmEmail.toKnownErr(e)
})
}

createAccount(
data?: ComAtprotoServerCreateAccount.InputSchema,
opts?: ComAtprotoServerCreateAccount.CallOptions,
Expand Down Expand Up @@ -855,6 +874,28 @@ export class ServerNS {
})
}

requestEmailConfirmation(
data?: ComAtprotoServerRequestEmailConfirmation.InputSchema,
opts?: ComAtprotoServerRequestEmailConfirmation.CallOptions,
): Promise<ComAtprotoServerRequestEmailConfirmation.Response> {
return this._service.xrpc
.call('com.atproto.server.requestEmailConfirmation', opts?.qp, data, opts)
.catch((e) => {
throw ComAtprotoServerRequestEmailConfirmation.toKnownErr(e)
})
}

requestEmailUpdate(
data?: ComAtprotoServerRequestEmailUpdate.InputSchema,
opts?: ComAtprotoServerRequestEmailUpdate.CallOptions,
): Promise<ComAtprotoServerRequestEmailUpdate.Response> {
return this._service.xrpc
.call('com.atproto.server.requestEmailUpdate', opts?.qp, data, opts)
.catch((e) => {
throw ComAtprotoServerRequestEmailUpdate.toKnownErr(e)
})
}

requestPasswordReset(
data?: ComAtprotoServerRequestPasswordReset.InputSchema,
opts?: ComAtprotoServerRequestPasswordReset.CallOptions,
Expand Down Expand Up @@ -887,6 +928,17 @@ export class ServerNS {
throw ComAtprotoServerRevokeAppPassword.toKnownErr(e)
})
}

updateEmail(
data?: ComAtprotoServerUpdateEmail.InputSchema,
opts?: ComAtprotoServerUpdateEmail.CallOptions,
): Promise<ComAtprotoServerUpdateEmail.Response> {
return this._service.xrpc
.call('com.atproto.server.updateEmail', opts?.qp, data, opts)
.catch((e) => {
throw ComAtprotoServerUpdateEmail.toKnownErr(e)
})
}
}

export class SyncNS {
Expand Down
Loading

0 comments on commit 6f2ef46

Please sign in to comment.