refactor: http service (#2233)

This commit is contained in:
Mo
2023-02-28 20:43:25 -06:00
committed by GitHub
parent 6e7618b258
commit e7f1d35341
142 changed files with 1116 additions and 1307 deletions

View File

@@ -1,10 +1,11 @@
import { HttpResponse } from '@standardnotes/responses'
import { ApiVersion } from '../../Api'
import { ApiCallError } from '../../Error/ApiCallError'
import { ErrorMessage } from '../../Error/ErrorMessage'
import {
GenerateRecoveryCodesResponse,
RecoveryKeyParamsResponse,
SignInWithRecoveryCodesResponse,
GenerateRecoveryCodesResponseBody,
RecoveryKeyParamsResponseBody,
SignInWithRecoveryCodesResponseBody,
} from '../../Response'
import { AuthServerInterface } from '../../Server'
@@ -18,7 +19,7 @@ export class AuthApiService implements AuthApiServiceInterface {
this.operationsInProgress = new Map()
}
async generateRecoveryCodes(): Promise<GenerateRecoveryCodesResponse> {
async generateRecoveryCodes(): Promise<HttpResponse<GenerateRecoveryCodesResponseBody>> {
if (this.operationsInProgress.get(AuthApiOperations.GenerateRecoveryCodes)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -40,7 +41,7 @@ export class AuthApiService implements AuthApiServiceInterface {
username: string
codeChallenge: string
recoveryCodes: string
}): Promise<RecoveryKeyParamsResponse> {
}): Promise<HttpResponse<RecoveryKeyParamsResponseBody>> {
if (this.operationsInProgress.get(AuthApiOperations.GetRecoveryKeyParams)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -68,7 +69,7 @@ export class AuthApiService implements AuthApiServiceInterface {
password: string
codeVerifier: string
recoveryCodes: string
}): Promise<SignInWithRecoveryCodesResponse> {
}): Promise<HttpResponse<SignInWithRecoveryCodesResponseBody>> {
if (this.operationsInProgress.get(AuthApiOperations.SignInWithRecoveryCodes)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}

View File

@@ -1,20 +1,21 @@
import { HttpResponse } from '@standardnotes/responses'
import {
GenerateRecoveryCodesResponse,
RecoveryKeyParamsResponse,
SignInWithRecoveryCodesResponse,
GenerateRecoveryCodesResponseBody,
RecoveryKeyParamsResponseBody,
SignInWithRecoveryCodesResponseBody,
} from '../../Response'
export interface AuthApiServiceInterface {
generateRecoveryCodes(): Promise<GenerateRecoveryCodesResponse>
generateRecoveryCodes(): Promise<HttpResponse<GenerateRecoveryCodesResponseBody>>
recoveryKeyParams(dto: {
username: string
codeChallenge: string
recoveryCodes: string
}): Promise<RecoveryKeyParamsResponse>
}): Promise<HttpResponse<RecoveryKeyParamsResponseBody>>
signInWithRecoveryCodes(dto: {
username: string
password: string
codeVerifier: string
recoveryCodes: string
}): Promise<SignInWithRecoveryCodesResponse>
}): Promise<HttpResponse<SignInWithRecoveryCodesResponseBody>>
}

View File

@@ -1,14 +1,15 @@
import { ErrorMessage } from '../../Error/ErrorMessage'
import { ApiCallError } from '../../Error/ApiCallError'
import { HttpResponse } from '@standardnotes/responses'
import { AuthenticatorApiServiceInterface } from './AuthenticatorApiServiceInterface'
import { AuthenticatorApiOperations } from './AuthenticatorApiOperations'
import {
ListAuthenticatorsResponse,
DeleteAuthenticatorResponse,
GenerateAuthenticatorRegistrationOptionsResponse,
VerifyAuthenticatorRegistrationResponseResponse,
GenerateAuthenticatorAuthenticationOptionsResponse,
ListAuthenticatorsResponseBody,
DeleteAuthenticatorResponseBody,
GenerateAuthenticatorRegistrationOptionsResponseBody,
VerifyAuthenticatorRegistrationResponseBody,
GenerateAuthenticatorAuthenticationOptionsResponseBody,
} from '../../Response'
import { AuthenticatorServerInterface } from '../../Server/Authenticator/AuthenticatorServerInterface'
@@ -19,7 +20,7 @@ export class AuthenticatorApiService implements AuthenticatorApiServiceInterface
this.operationsInProgress = new Map()
}
async list(): Promise<ListAuthenticatorsResponse> {
async list(): Promise<HttpResponse<ListAuthenticatorsResponseBody>> {
if (this.operationsInProgress.get(AuthenticatorApiOperations.List)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -37,7 +38,7 @@ export class AuthenticatorApiService implements AuthenticatorApiServiceInterface
}
}
async delete(authenticatorId: string): Promise<DeleteAuthenticatorResponse> {
async delete(authenticatorId: string): Promise<HttpResponse<DeleteAuthenticatorResponseBody>> {
if (this.operationsInProgress.get(AuthenticatorApiOperations.Delete)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -57,7 +58,7 @@ export class AuthenticatorApiService implements AuthenticatorApiServiceInterface
}
}
async generateRegistrationOptions(): Promise<GenerateAuthenticatorRegistrationOptionsResponse> {
async generateRegistrationOptions(): Promise<HttpResponse<GenerateAuthenticatorRegistrationOptionsResponseBody>> {
if (this.operationsInProgress.get(AuthenticatorApiOperations.GenerateRegistrationOptions)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -79,7 +80,7 @@ export class AuthenticatorApiService implements AuthenticatorApiServiceInterface
userUuid: string,
name: string,
attestationResponse: Record<string, unknown>,
): Promise<VerifyAuthenticatorRegistrationResponseResponse> {
): Promise<HttpResponse<VerifyAuthenticatorRegistrationResponseBody>> {
if (this.operationsInProgress.get(AuthenticatorApiOperations.VerifyRegistrationResponse)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -101,7 +102,9 @@ export class AuthenticatorApiService implements AuthenticatorApiServiceInterface
}
}
async generateAuthenticationOptions(username: string): Promise<GenerateAuthenticatorAuthenticationOptionsResponse> {
async generateAuthenticationOptions(
username: string,
): Promise<HttpResponse<GenerateAuthenticatorAuthenticationOptionsResponseBody>> {
if (this.operationsInProgress.get(AuthenticatorApiOperations.GenerateAuthenticationOptions)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}

View File

@@ -1,19 +1,22 @@
import { HttpResponse } from '@standardnotes/responses'
import {
ListAuthenticatorsResponse,
DeleteAuthenticatorResponse,
GenerateAuthenticatorRegistrationOptionsResponse,
VerifyAuthenticatorRegistrationResponseResponse,
GenerateAuthenticatorAuthenticationOptionsResponse,
ListAuthenticatorsResponseBody,
DeleteAuthenticatorResponseBody,
GenerateAuthenticatorRegistrationOptionsResponseBody,
VerifyAuthenticatorRegistrationResponseBody,
GenerateAuthenticatorAuthenticationOptionsResponseBody,
} from '../../Response'
export interface AuthenticatorApiServiceInterface {
list(): Promise<ListAuthenticatorsResponse>
delete(authenticatorId: string): Promise<DeleteAuthenticatorResponse>
generateRegistrationOptions(): Promise<GenerateAuthenticatorRegistrationOptionsResponse>
list(): Promise<HttpResponse<ListAuthenticatorsResponseBody>>
delete(authenticatorId: string): Promise<HttpResponse<DeleteAuthenticatorResponseBody>>
generateRegistrationOptions(): Promise<HttpResponse<GenerateAuthenticatorRegistrationOptionsResponseBody>>
verifyRegistrationResponse(
userUuid: string,
name: string,
attestationResponse: Record<string, unknown>,
): Promise<VerifyAuthenticatorRegistrationResponseResponse>
generateAuthenticationOptions(username: string): Promise<GenerateAuthenticatorAuthenticationOptionsResponse>
): Promise<HttpResponse<VerifyAuthenticatorRegistrationResponseBody>>
generateAuthenticationOptions(
username: string,
): Promise<HttpResponse<GenerateAuthenticatorAuthenticationOptionsResponseBody>>
}

View File

@@ -1,12 +1,13 @@
import { ErrorMessage } from '../../Error/ErrorMessage'
import { ApiCallError } from '../../Error/ApiCallError'
import { HttpResponse } from '@standardnotes/responses'
import { RevisionApiServiceInterface } from './RevisionApiServiceInterface'
import { RevisionApiOperations } from './RevisionApiOperations'
import { RevisionServerInterface } from '../../Server'
import { DeleteRevisionResponse } from '../../Response/Revision/DeleteRevisionResponse'
import { GetRevisionResponse } from '../../Response/Revision/GetRevisionResponse'
import { ListRevisionsResponse } from '../../Response/Revision/ListRevisionsResponse'
import { DeleteRevisionResponseBody } from '../../Response/Revision/DeleteRevisionResponseBody'
import { GetRevisionResponseBody } from '../../Response/Revision/GetRevisionResponseBody'
import { ListRevisionsResponseBody } from '../../Response/Revision/ListRevisionsResponseBody'
export class RevisionApiService implements RevisionApiServiceInterface {
private operationsInProgress: Map<RevisionApiOperations, boolean>
@@ -15,7 +16,7 @@ export class RevisionApiService implements RevisionApiServiceInterface {
this.operationsInProgress = new Map()
}
async listRevisions(itemUuid: string): Promise<ListRevisionsResponse> {
async listRevisions(itemUuid: string): Promise<HttpResponse<ListRevisionsResponseBody>> {
if (this.operationsInProgress.get(RevisionApiOperations.List)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -35,7 +36,7 @@ export class RevisionApiService implements RevisionApiServiceInterface {
}
}
async getRevision(itemUuid: string, revisionUuid: string): Promise<GetRevisionResponse> {
async getRevision(itemUuid: string, revisionUuid: string): Promise<HttpResponse<GetRevisionResponseBody>> {
if (this.operationsInProgress.get(RevisionApiOperations.Get)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -56,7 +57,7 @@ export class RevisionApiService implements RevisionApiServiceInterface {
}
}
async deleteRevision(itemUuid: string, revisionUuid: string): Promise<DeleteRevisionResponse> {
async deleteRevision(itemUuid: string, revisionUuid: string): Promise<HttpResponse<DeleteRevisionResponseBody>> {
if (this.operationsInProgress.get(RevisionApiOperations.Delete)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}

View File

@@ -1,9 +1,10 @@
import { DeleteRevisionResponse } from '../../Response/Revision/DeleteRevisionResponse'
import { GetRevisionResponse } from '../../Response/Revision/GetRevisionResponse'
import { ListRevisionsResponse } from '../../Response/Revision/ListRevisionsResponse'
import { HttpResponse } from '@standardnotes/responses'
import { DeleteRevisionResponseBody } from '../../Response/Revision/DeleteRevisionResponseBody'
import { GetRevisionResponseBody } from '../../Response/Revision/GetRevisionResponseBody'
import { ListRevisionsResponseBody } from '../../Response/Revision/ListRevisionsResponseBody'
export interface RevisionApiServiceInterface {
listRevisions(itemUuid: string): Promise<ListRevisionsResponse>
getRevision(itemUuid: string, revisionUuid: string): Promise<GetRevisionResponse>
deleteRevision(itemUuid: string, revisionUuid: string): Promise<DeleteRevisionResponse>
listRevisions(itemUuid: string): Promise<HttpResponse<ListRevisionsResponseBody>>
getRevision(itemUuid: string, revisionUuid: string): Promise<HttpResponse<GetRevisionResponseBody>>
deleteRevision(itemUuid: string, revisionUuid: string): Promise<HttpResponse<DeleteRevisionResponseBody>>
}

View File

@@ -3,14 +3,15 @@ import { ApiCallError } from '../../Error/ApiCallError'
import { ApiVersion } from '../../Api/ApiVersion'
import { ApiEndpointParam } from '../../Request/ApiEndpointParam'
import { SubscriptionServerInterface } from '../../Server/Subscription/SubscriptionServerInterface'
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
import { SubscriptionInviteAcceptResponse } from '../../Response/Subscription/SubscriptionInviteAcceptResponse'
import { AppleIAPConfirmResponseBody } from './../../Response/Subscription/AppleIAPConfirmResponseBody'
import { SubscriptionInviteAcceptResponseBody } from '../../Response/Subscription/SubscriptionInviteAcceptResponseBody'
import { SubscriptionInviteCancelResponseBody } from '../../Response/Subscription/SubscriptionInviteCancelResponseBody'
import { SubscriptionInviteListResponseBody } from '../../Response/Subscription/SubscriptionInviteListResponseBody'
import { SubscriptionInviteResponseBody } from '../../Response/Subscription/SubscriptionInviteResponseBody'
import { HttpResponse } from '@standardnotes/responses'
import { SubscriptionApiServiceInterface } from './SubscriptionApiServiceInterface'
import { SubscriptionApiOperations } from './SubscriptionApiOperations'
import { AppleIAPConfirmResponse } from './../../Response/Subscription/AppleIAPConfirmResponse'
import { AppleIAPConfirmRequestParams } from '../../Request'
export class SubscriptionApiService implements SubscriptionApiServiceInterface {
@@ -20,7 +21,7 @@ export class SubscriptionApiService implements SubscriptionApiServiceInterface {
this.operationsInProgress = new Map()
}
async listInvites(): Promise<SubscriptionInviteListResponse> {
async listInvites(): Promise<HttpResponse<SubscriptionInviteListResponseBody>> {
if (this.operationsInProgress.get(SubscriptionApiOperations.ListingInvites)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -40,7 +41,7 @@ export class SubscriptionApiService implements SubscriptionApiServiceInterface {
}
}
async cancelInvite(inviteUuid: string): Promise<SubscriptionInviteCancelResponse> {
async cancelInvite(inviteUuid: string): Promise<HttpResponse<SubscriptionInviteCancelResponseBody>> {
if (this.operationsInProgress.get(SubscriptionApiOperations.CancelingInvite)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -61,7 +62,7 @@ export class SubscriptionApiService implements SubscriptionApiServiceInterface {
}
}
async invite(inviteeEmail: string): Promise<SubscriptionInviteResponse> {
async invite(inviteeEmail: string): Promise<HttpResponse<SubscriptionInviteResponseBody>> {
if (this.operationsInProgress.get(SubscriptionApiOperations.Inviting)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -82,7 +83,7 @@ export class SubscriptionApiService implements SubscriptionApiServiceInterface {
}
}
async acceptInvite(inviteUuid: string): Promise<SubscriptionInviteAcceptResponse> {
async acceptInvite(inviteUuid: string): Promise<HttpResponse<SubscriptionInviteAcceptResponseBody>> {
if (this.operationsInProgress.get(SubscriptionApiOperations.AcceptingInvite)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}
@@ -102,7 +103,7 @@ export class SubscriptionApiService implements SubscriptionApiServiceInterface {
}
}
async confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<AppleIAPConfirmResponse> {
async confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<HttpResponse<AppleIAPConfirmResponseBody>> {
if (this.operationsInProgress.get(SubscriptionApiOperations.ConfirmAppleIAP)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}

View File

@@ -1,14 +1,15 @@
import { AppleIAPConfirmResponse } from './../../Response/Subscription/AppleIAPConfirmResponse'
import { AppleIAPConfirmRequestParams } from '../../Request'
import { SubscriptionInviteAcceptResponse } from '../../Response/Subscription/SubscriptionInviteAcceptResponse'
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
import { AppleIAPConfirmResponseBody } from './../../Response/Subscription/AppleIAPConfirmResponseBody'
import { SubscriptionInviteAcceptResponseBody } from '../../Response/Subscription/SubscriptionInviteAcceptResponseBody'
import { SubscriptionInviteCancelResponseBody } from '../../Response/Subscription/SubscriptionInviteCancelResponseBody'
import { SubscriptionInviteListResponseBody } from '../../Response/Subscription/SubscriptionInviteListResponseBody'
import { SubscriptionInviteResponseBody } from '../../Response/Subscription/SubscriptionInviteResponseBody'
import { HttpResponse } from '@standardnotes/responses'
export interface SubscriptionApiServiceInterface {
invite(inviteeEmail: string): Promise<SubscriptionInviteResponse>
listInvites(): Promise<SubscriptionInviteListResponse>
cancelInvite(inviteUuid: string): Promise<SubscriptionInviteCancelResponse>
acceptInvite(inviteUuid: string): Promise<SubscriptionInviteAcceptResponse>
confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<AppleIAPConfirmResponse>
invite(inviteeEmail: string): Promise<HttpResponse<SubscriptionInviteResponseBody>>
listInvites(): Promise<HttpResponse<SubscriptionInviteListResponseBody>>
cancelInvite(inviteUuid: string): Promise<HttpResponse<SubscriptionInviteCancelResponseBody>>
acceptInvite(inviteUuid: string): Promise<HttpResponse<SubscriptionInviteAcceptResponseBody>>
confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<HttpResponse<AppleIAPConfirmResponseBody>>
}

View File

@@ -3,12 +3,14 @@ import { UserRequestType } from '@standardnotes/common'
import { ErrorMessage } from '../../Error/ErrorMessage'
import { ApiCallError } from '../../Error/ApiCallError'
import { UserRegistrationResponse } from '../../Response/User/UserRegistrationResponse'
import { UserServerInterface } from '../../Server/User/UserServerInterface'
import { ApiVersion } from '../../Api/ApiVersion'
import { ApiEndpointParam } from '../../Request/ApiEndpointParam'
import { UserRequestResponse } from '../../Response/UserRequest/UserRequestResponse'
import { UserDeletionResponse } from '../../Response/User/UserDeletionResponse'
import { HttpResponse } from '@standardnotes/responses'
import { UserDeletionResponseBody } from '../../Response/User/UserDeletionResponseBody'
import { UserRegistrationResponseBody } from '../../Response/User/UserRegistrationResponseBody'
import { UserRequestResponseBody } from '../../Response/UserRequest/UserRequestResponseBody'
import { UserRequestServerInterface } from '../../Server/UserRequest/UserRequestServerInterface'
import { UserApiOperations } from './UserApiOperations'
@@ -21,7 +23,7 @@ export class UserApiService implements UserApiServiceInterface {
this.operationsInProgress = new Map()
}
async deleteAccount(userUuid: string): Promise<UserDeletionResponse> {
async deleteAccount(userUuid: string): Promise<HttpResponse<UserDeletionResponseBody>> {
this.lockOperation(UserApiOperations.DeletingAccount)
try {
@@ -37,7 +39,10 @@ export class UserApiService implements UserApiServiceInterface {
}
}
async submitUserRequest(dto: { userUuid: string; requestType: UserRequestType }): Promise<UserRequestResponse> {
async submitUserRequest(dto: {
userUuid: string
requestType: UserRequestType
}): Promise<HttpResponse<UserRequestResponseBody>> {
this.lockOperation(UserApiOperations.SubmittingRequest)
try {
@@ -59,7 +64,7 @@ export class UserApiService implements UserApiServiceInterface {
serverPassword: string
keyParams: RootKeyParamsInterface
ephemeral: boolean
}): Promise<UserRegistrationResponse> {
}): Promise<HttpResponse<UserRegistrationResponseBody>> {
this.lockOperation(UserApiOperations.Registering)
try {

View File

@@ -1,9 +1,10 @@
import { UserRequestType } from '@standardnotes/common'
import { type RootKeyParamsInterface } from '@standardnotes/models'
import { HttpResponse } from '@standardnotes/responses'
import { UserDeletionResponse } from '../../Response/User/UserDeletionResponse'
import { UserRegistrationResponse } from '../../Response/User/UserRegistrationResponse'
import { UserRequestResponse } from '../../Response/UserRequest/UserRequestResponse'
import { UserDeletionResponseBody } from '../../Response/User/UserDeletionResponseBody'
import { UserRegistrationResponseBody } from '../../Response/User/UserRegistrationResponseBody'
import { UserRequestResponseBody } from '../../Response/UserRequest/UserRequestResponseBody'
export interface UserApiServiceInterface {
register(registerDTO: {
@@ -11,7 +12,10 @@ export interface UserApiServiceInterface {
serverPassword: string
keyParams: RootKeyParamsInterface
ephemeral: boolean
}): Promise<UserRegistrationResponse>
submitUserRequest(dto: { userUuid: string; requestType: UserRequestType }): Promise<UserRequestResponse>
deleteAccount(userUuid: string): Promise<UserDeletionResponse>
}): Promise<HttpResponse<UserRegistrationResponseBody>>
submitUserRequest(dto: {
userUuid: string
requestType: UserRequestType
}): Promise<HttpResponse<UserRequestResponseBody>>
deleteAccount(userUuid: string): Promise<HttpResponse<UserDeletionResponseBody>>
}

View File

@@ -4,7 +4,8 @@ import { ApiCallError } from '../../Error/ApiCallError'
import { WebSocketApiServiceInterface } from './WebSocketApiServiceInterface'
import { WebSocketApiOperations } from './WebSocketApiOperations'
import { WebSocketServerInterface } from '../../Server'
import { WebSocketConnectionTokenResponse } from '../../Response'
import { HttpResponse } from '@standardnotes/responses'
import { WebSocketConnectionTokenResponseBody } from '../../Response'
export class WebSocketApiService implements WebSocketApiServiceInterface {
private operationsInProgress: Map<WebSocketApiOperations, boolean>
@@ -13,7 +14,7 @@ export class WebSocketApiService implements WebSocketApiServiceInterface {
this.operationsInProgress = new Map()
}
async createConnectionToken(): Promise<WebSocketConnectionTokenResponse> {
async createConnectionToken(): Promise<HttpResponse<WebSocketConnectionTokenResponseBody>> {
if (this.operationsInProgress.get(WebSocketApiOperations.CreatingConnectionToken)) {
throw new ApiCallError(ErrorMessage.GenericInProgress)
}

View File

@@ -1,5 +1,6 @@
import { WebSocketConnectionTokenResponse } from '../../Response'
import { HttpResponse } from '@standardnotes/responses'
import { WebSocketConnectionTokenResponseBody } from '../../Response'
export interface WebSocketApiServiceInterface {
createConnectionToken(): Promise<WebSocketConnectionTokenResponse>
createConnectionToken(): Promise<HttpResponse<WebSocketConnectionTokenResponseBody>>
}

View File

@@ -1,8 +0,0 @@
import { ErrorTag } from './ErrorTag'
export type HttpErrorResponseBody = {
error: {
message: string
tag?: ErrorTag
}
}

View File

@@ -1,12 +0,0 @@
import { HttpStatusCode } from './HttpStatusCode'
import { HttpResponseBody } from './HttpResponseBody'
import { HttpErrorResponseBody } from './HttpErrorResponseBody'
import { HttpResponseMeta } from './HttpResponseMeta'
import { HttpHeaders } from './HttpHeaders'
export interface HttpResponse {
status: HttpStatusCode
data?: HttpResponseBody | HttpErrorResponseBody
meta?: HttpResponseMeta
headers?: HttpHeaders
}

View File

@@ -1 +0,0 @@
export type HttpResponseBody = Record<string, unknown>

View File

@@ -1,35 +1,50 @@
import { isString, joinPaths, sleep } from '@standardnotes/utils'
import { Environment } from '@standardnotes/models'
import { Session, SessionToken } from '@standardnotes/domain-core'
import { HttpRequestParams } from './HttpRequestParams'
import { HttpVerb } from './HttpVerb'
import { HttpRequest } from './HttpRequest'
import { HttpResponse } from './HttpResponse'
import {
HttpStatusCode,
HttpRequestParams,
HttpVerb,
HttpRequest,
HttpResponse,
HttpResponseMeta,
HttpErrorResponse,
isErrorResponse,
} from '@standardnotes/responses'
import { HttpServiceInterface } from './HttpServiceInterface'
import { HttpStatusCode } from './HttpStatusCode'
import { XMLHttpRequestState } from './XMLHttpRequestState'
import { ErrorMessage } from '../Error/ErrorMessage'
import { HttpResponseMeta } from './HttpResponseMeta'
import { HttpErrorResponseBody } from './HttpErrorResponseBody'
import { Paths } from '../Server/Auth/Paths'
import { SessionRefreshResponse } from '../Response/Auth/SessionRefreshResponse'
import { SessionRefreshResponseBody } from '../Response/Auth/SessionRefreshResponseBody'
export class HttpService implements HttpServiceInterface {
private session: Session | null
private __latencySimulatorMs?: number
private declare host: string
constructor(
private environment: Environment,
private appVersion: string,
private snjsVersion: string,
private updateMetaCallback: (meta: HttpResponseMeta) => void,
private refreshSessionCallback: (session: Session) => void,
) {
private inProgressRefreshSessionPromise?: Promise<boolean>
private updateMetaCallback!: (meta: HttpResponseMeta) => void
private refreshSessionCallback!: (session: Session) => void
constructor(private environment: Environment, private appVersion: string, private snjsVersion: string) {
this.session = null
}
setCallbacks(
updateMetaCallback: (meta: HttpResponseMeta) => void,
refreshSessionCallback: (session: Session) => void,
): void {
this.updateMetaCallback = updateMetaCallback
this.refreshSessionCallback = refreshSessionCallback
}
public deinit(): void {
this.session = null
;(this.updateMetaCallback as unknown) = undefined
;(this.refreshSessionCallback as unknown) = undefined
}
setSession(session: Session): void {
this.session = session
}
@@ -38,7 +53,7 @@ export class HttpService implements HttpServiceInterface {
this.host = host
}
async get(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse> {
async get<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>> {
return this.runHttp({
url: joinPaths(this.host, path),
params,
@@ -47,7 +62,7 @@ export class HttpService implements HttpServiceInterface {
})
}
async post(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse> {
async post<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>> {
return this.runHttp({
url: joinPaths(this.host, path),
params,
@@ -56,7 +71,7 @@ export class HttpService implements HttpServiceInterface {
})
}
async put(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse> {
async put<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>> {
return this.runHttp({
url: joinPaths(this.host, path),
params,
@@ -65,7 +80,7 @@ export class HttpService implements HttpServiceInterface {
})
}
async patch(path: string, params: HttpRequestParams, authentication?: string): Promise<HttpResponse> {
async patch<T>(path: string, params: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>> {
return this.runHttp({
url: joinPaths(this.host, path),
params,
@@ -74,7 +89,7 @@ export class HttpService implements HttpServiceInterface {
})
}
async delete(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse> {
async delete<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>> {
return this.runHttp({
url: joinPaths(this.host, path),
params,
@@ -83,23 +98,36 @@ export class HttpService implements HttpServiceInterface {
})
}
private async runHttp(httpRequest: HttpRequest): Promise<HttpResponse> {
async runHttp<T>(httpRequest: HttpRequest): Promise<HttpResponse<T>> {
if (this.inProgressRefreshSessionPromise) {
await this.inProgressRefreshSessionPromise
httpRequest.authentication = this.session?.accessToken.value
}
const request = this.createXmlRequest(httpRequest)
if (this.__latencySimulatorMs) {
await sleep(this.__latencySimulatorMs, true)
}
const response = await this.runRequest(request, this.createRequestBody(httpRequest))
const response = await this.runRequest<T>(request, this.createRequestBody(httpRequest))
if (response.meta) {
this.updateMetaCallback(response.meta)
this.updateMetaCallback?.(response.meta)
}
if (response.status === HttpStatusCode.ExpiredAccessToken) {
const isSessionRefreshed = await this.refreshSession()
if (!isSessionRefreshed) {
return response
if (this.inProgressRefreshSessionPromise) {
await this.inProgressRefreshSessionPromise
} else {
this.inProgressRefreshSessionPromise = this.refreshSession()
const isSessionRefreshed = await this.inProgressRefreshSessionPromise
this.inProgressRefreshSessionPromise = undefined
if (!isSessionRefreshed) {
return response
}
}
httpRequest.authentication = this.session?.accessToken.value
@@ -115,17 +143,17 @@ export class HttpService implements HttpServiceInterface {
return false
}
const response = (await this.post(Paths.v1.refreshSession, {
const response = await this.post<SessionRefreshResponseBody>(Paths.v1.refreshSession, {
access_token: this.session.accessToken.value,
refresh_token: this.session.refreshToken.value,
})) as SessionRefreshResponse
})
if (response.data.error) {
if (isErrorResponse(response)) {
return false
}
if (response.meta) {
this.updateMetaCallback(response.meta)
this.updateMetaCallback?.(response.meta)
}
const accessTokenOrError = SessionToken.create(
@@ -135,6 +163,7 @@ export class HttpService implements HttpServiceInterface {
if (accessTokenOrError.isFailed()) {
return false
}
const accessToken = accessTokenOrError.getValue()
const refreshTokenOrError = SessionToken.create(
@@ -144,6 +173,7 @@ export class HttpService implements HttpServiceInterface {
if (refreshTokenOrError.isFailed()) {
return false
}
const refreshToken = refreshTokenOrError.getValue()
const sessionOrError = Session.create(accessToken, refreshToken, response.data.session.readonly_access)
@@ -204,27 +234,24 @@ export class HttpService implements HttpServiceInterface {
return request
}
private async runRequest(request: XMLHttpRequest, body?: string | Uint8Array): Promise<HttpResponse> {
return new Promise((resolve, reject) => {
private async runRequest<T>(request: XMLHttpRequest, body?: string | Uint8Array): Promise<HttpResponse<T>> {
return new Promise((resolve) => {
request.onreadystatechange = () => {
this.stateChangeHandlerForRequest(request, resolve, reject)
this.stateChangeHandlerForRequest(request, resolve)
}
request.send(body)
})
}
private stateChangeHandlerForRequest(
request: XMLHttpRequest,
resolve: (response: HttpResponse) => void,
reject: (response: HttpResponse) => void,
) {
private stateChangeHandlerForRequest<T>(request: XMLHttpRequest, resolve: (response: HttpResponse<T>) => void) {
if (request.readyState !== XMLHttpRequestState.Completed) {
return
}
const httpStatus = request.status
const response: HttpResponse = {
const response: HttpResponse<T> = {
status: httpStatus,
headers: new Map<string, string | null>(),
data: {} as T,
}
const responseHeaderLines = request
@@ -266,12 +293,29 @@ export class HttpService implements HttpServiceInterface {
console.error(error)
}
if (httpStatus >= HttpStatusCode.Success && httpStatus < HttpStatusCode.InternalServerError) {
if (httpStatus === HttpStatusCode.Forbidden && response.data && response.data.error !== undefined) {
;(response.data as HttpErrorResponseBody).error.message = ErrorMessage.RateLimited
if (
httpStatus === HttpStatusCode.Forbidden &&
response.data &&
(response as HttpErrorResponse).data.error !== undefined
) {
;(response as HttpErrorResponse).data.error.message = ErrorMessage.RateLimited
}
resolve(response)
} else {
reject(response)
const errorResponse = response as HttpErrorResponse
if (!errorResponse.data) {
errorResponse.data = {
error: {
message: 'Unknown error',
},
}
}
if (!errorResponse.data.error) {
errorResponse.data.error = {
message: 'Unknown error',
}
}
resolve(response as HttpErrorResponse)
}
}

View File

@@ -1,14 +1,18 @@
import { Session } from '@standardnotes/domain-core'
import { HttpRequestParams } from './HttpRequestParams'
import { HttpResponse } from './HttpResponse'
import { HttpRequest, HttpRequestParams, HttpResponse, HttpResponseMeta } from '@standardnotes/responses'
export interface HttpServiceInterface {
setHost(host: string): void
setSession(session: Session): void
get(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse>
post(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse>
put(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse>
patch(path: string, params: HttpRequestParams, authentication?: string): Promise<HttpResponse>
delete(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse>
get<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>>
post<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>>
put<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>>
patch<T>(path: string, params: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>>
delete<T>(path: string, params?: HttpRequestParams, authentication?: string): Promise<HttpResponse<T>>
runHttp<T>(httpRequest: HttpRequest): Promise<HttpResponse<T>>
setCallbacks(
updateMetaCallback: (meta: HttpResponseMeta) => void,
refreshSessionCallback: (session: Session) => void,
): void
deinit(): void
}

View File

@@ -1,13 +1,3 @@
export * from './ErrorTag'
export * from './HttpErrorResponseBody'
export * from './HttpHeaders'
export * from './HttpRequest'
export * from './HttpRequestParams'
export * from './HttpResponse'
export * from './HttpResponseBody'
export * from './HttpResponseMeta'
export * from './HttpService'
export * from './HttpServiceInterface'
export * from './HttpStatusCode'
export * from './HttpVerb'
export * from './XMLHttpRequestState'

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { SessionRefreshResponseBody } from './SessionRefreshResponseBody'
export interface SessionRefreshResponse extends HttpResponse {
data: Either<SessionRefreshResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { DeleteAuthenticatorResponseBody } from './DeleteAuthenticatorResponseBody'
export interface DeleteAuthenticatorResponse extends HttpResponse {
data: Either<DeleteAuthenticatorResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { GenerateAuthenticatorAuthenticationOptionsResponseBody } from './GenerateAuthenticatorAuthenticationOptionsResponseBody'
export interface GenerateAuthenticatorAuthenticationOptionsResponse extends HttpResponse {
data: Either<GenerateAuthenticatorAuthenticationOptionsResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { GenerateAuthenticatorRegistrationOptionsResponseBody } from './GenerateAuthenticatorRegistrationOptionsResponseBody'
export interface GenerateAuthenticatorRegistrationOptionsResponse extends HttpResponse {
data: Either<GenerateAuthenticatorRegistrationOptionsResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { ListAuthenticatorsResponseBody } from './ListAuthenticatorsResponseBody'
export interface ListAuthenticatorsResponse extends HttpResponse {
data: Either<ListAuthenticatorsResponseBody, HttpErrorResponseBody>
}

View File

@@ -0,0 +1,3 @@
export interface VerifyAuthenticatorRegistrationResponseBody {
success: boolean
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { VerifyAuthenticatorRegistrationResponseResponseBody } from './VerifyAuthenticatorRegistrationResponseResponseBody'
export interface VerifyAuthenticatorRegistrationResponseResponse extends HttpResponse {
data: Either<VerifyAuthenticatorRegistrationResponseResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,3 +0,0 @@
export interface VerifyAuthenticatorRegistrationResponseResponseBody {
success: boolean
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { GenerateRecoveryCodesResponseBody } from './GenerateRecoveryCodesResponseBody'
export interface GenerateRecoveryCodesResponse extends HttpResponse {
data: Either<GenerateRecoveryCodesResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { RecoveryKeyParamsResponseBody } from './RecoveryKeyParamsResponseBody'
export interface RecoveryKeyParamsResponse extends HttpResponse {
data: Either<RecoveryKeyParamsResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { SignInWithRecoveryCodesResponseBody } from './SignInWithRecoveryCodesResponseBody'
export interface SignInWithRecoveryCodesResponse extends HttpResponse {
data: Either<SignInWithRecoveryCodesResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { DeleteRevisionResponseBody } from './DeleteRevisionResponseBody'
export interface DeleteRevisionResponse extends HttpResponse {
data: Either<DeleteRevisionResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { GetRevisionResponseBody } from './GetRevisionResponseBody'
export interface GetRevisionResponse extends HttpResponse {
data: Either<GetRevisionResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,10 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { ListRevisionsResponseBody } from './ListRevisionsResponseBody'
export interface ListRevisionsResponse extends HttpResponse {
data: Either<ListRevisionsResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { AppleIAPConfirmResponseBody } from './AppleIAPConfirmResponseBody'
export interface AppleIAPConfirmResponse extends HttpResponse {
data: Either<AppleIAPConfirmResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { SubscriptionInviteAcceptResponseBody } from './SubscriptionInviteAcceptResponseBody'
export interface SubscriptionInviteAcceptResponse extends HttpResponse {
data: Either<SubscriptionInviteAcceptResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { SubscriptionInviteCancelResponseBody } from './SubscriptionInviteCancelResponseBody'
export interface SubscriptionInviteCancelResponse extends HttpResponse {
data: Either<SubscriptionInviteCancelResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { SubscriptionInviteDeclineResponseBody } from './SubscriptionInviteDeclineResponseBody'
export interface SubscriptionInviteDeclineResponse extends HttpResponse {
data: Either<SubscriptionInviteDeclineResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { SubscriptionInviteListResponseBody } from './SubscriptionInviteListResponseBody'
export interface SubscriptionInviteListResponse extends HttpResponse {
data: Either<SubscriptionInviteListResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { SubscriptionInviteResponseBody } from './SubscriptionInviteResponseBody'
export interface SubscriptionInviteResponse extends HttpResponse {
data: Either<SubscriptionInviteResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { UserDeletionResponseBody } from './UserDeletionResponseBody'
export interface UserDeletionResponse extends HttpResponse {
data: Either<UserDeletionResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,7 +0,0 @@
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { UserRegistrationResponseBody } from './UserRegistrationResponseBody'
export interface UserRegistrationResponse extends HttpResponse {
data: UserRegistrationResponseBody | HttpErrorResponseBody
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { UserRequestResponseBody } from './UserRequestResponseBody'
export interface UserRequestResponse extends HttpResponse {
data: Either<UserRequestResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,9 +0,0 @@
import { Either } from '@standardnotes/common'
import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody'
import { HttpResponse } from '../../Http/HttpResponse'
import { WebSocketConnectionTokenResponseBody } from './WebSocketConnectionTokenResponseBody'
export interface WebSocketConnectionTokenResponse extends HttpResponse {
data: Either<WebSocketConnectionTokenResponseBody, HttpErrorResponseBody>
}

View File

@@ -1,44 +1,22 @@
export * from './Auth/SessionRefreshResponse'
export * from './Auth/SessionRefreshResponseBody'
export * from './Authenticator/DeleteAuthenticatorResponse'
export * from './Authenticator/DeleteAuthenticatorResponseBody'
export * from './Authenticator/GenerateAuthenticatorAuthenticationOptionsResponse'
export * from './Authenticator/GenerateAuthenticatorAuthenticationOptionsResponseBody'
export * from './Authenticator/GenerateAuthenticatorRegistrationOptionsResponse'
export * from './Authenticator/GenerateAuthenticatorRegistrationOptionsResponseBody'
export * from './Authenticator/ListAuthenticatorsResponse'
export * from './Authenticator/ListAuthenticatorsResponseBody'
export * from './Authenticator/VerifyAuthenticatorRegistrationResponseResponse'
export * from './Authenticator/VerifyAuthenticatorRegistrationResponseResponseBody'
export * from './Recovery/GenerateRecoveryCodesResponse'
export * from './Authenticator/VerifyAuthenticatorRegistrationResponseBody'
export * from './Recovery/GenerateRecoveryCodesResponseBody'
export * from './Recovery/RecoveryKeyParamsResponse'
export * from './Recovery/RecoveryKeyParamsResponseBody'
export * from './Recovery/SignInWithRecoveryCodesResponse'
export * from './Recovery/SignInWithRecoveryCodesResponseBody'
export * from './Recovery/GenerateRecoveryCodesResponse'
export * from './Recovery/GenerateRecoveryCodesResponseBody'
export * from './Recovery/RecoveryKeyParamsResponse'
export * from './Recovery/RecoveryKeyParamsResponseBody'
export * from './Recovery/SignInWithRecoveryCodesResponse'
export * from './Recovery/SignInWithRecoveryCodesResponseBody'
export * from './Subscription/AppleIAPConfirmResponse'
export * from './Subscription/AppleIAPConfirmResponseBody'
export * from './Subscription/SubscriptionInviteAcceptResponse'
export * from './Subscription/SubscriptionInviteAcceptResponseBody'
export * from './Subscription/SubscriptionInviteCancelResponse'
export * from './Subscription/SubscriptionInviteCancelResponseBody'
export * from './Subscription/SubscriptionInviteDeclineResponse'
export * from './Subscription/SubscriptionInviteDeclineResponseBody'
export * from './Subscription/SubscriptionInviteListResponse'
export * from './Subscription/SubscriptionInviteListResponseBody'
export * from './Subscription/SubscriptionInviteResponse'
export * from './Subscription/SubscriptionInviteResponseBody'
export * from './User/UserDeletionResponse'
export * from './User/UserDeletionResponseBody'
export * from './User/UserRegistrationResponse'
export * from './User/UserRegistrationResponseBody'
export * from './UserRequest/UserRequestResponse'
export * from './UserRequest/UserRequestResponseBody'
export * from './WebSocket/WebSocketConnectionTokenResponse'
export * from './WebSocket/WebSocketConnectionTokenResponseBody'

View File

@@ -1,9 +1,10 @@
import { HttpServiceInterface } from '../../Http/HttpServiceInterface'
import { RecoveryKeyParamsRequestParams, SignInWithRecoveryCodesRequestParams } from '../../Request'
import { HttpResponse } from '@standardnotes/responses'
import {
GenerateRecoveryCodesResponse,
RecoveryKeyParamsResponse,
SignInWithRecoveryCodesResponse,
GenerateRecoveryCodesResponseBody,
RecoveryKeyParamsResponseBody,
SignInWithRecoveryCodesResponseBody,
} from '../../Response'
import { AuthServerInterface } from './AuthServerInterface'
import { Paths } from './Paths'
@@ -11,23 +12,19 @@ import { Paths } from './Paths'
export class AuthServer implements AuthServerInterface {
constructor(private httpService: HttpServiceInterface) {}
async generateRecoveryCodes(): Promise<GenerateRecoveryCodesResponse> {
const response = await this.httpService.post(Paths.v1.generateRecoveryCodes)
return response as GenerateRecoveryCodesResponse
async generateRecoveryCodes(): Promise<HttpResponse<GenerateRecoveryCodesResponseBody>> {
return this.httpService.post(Paths.v1.generateRecoveryCodes)
}
async recoveryKeyParams(params: RecoveryKeyParamsRequestParams): Promise<RecoveryKeyParamsResponse> {
const response = await this.httpService.post(Paths.v1.recoveryKeyParams, params)
return response as RecoveryKeyParamsResponse
async recoveryKeyParams(
params: RecoveryKeyParamsRequestParams,
): Promise<HttpResponse<RecoveryKeyParamsResponseBody>> {
return this.httpService.post(Paths.v1.recoveryKeyParams, params)
}
async signInWithRecoveryCodes(
params: SignInWithRecoveryCodesRequestParams,
): Promise<SignInWithRecoveryCodesResponse> {
const response = await this.httpService.post(Paths.v1.signInWithRecoveryCodes, params)
return response as SignInWithRecoveryCodesResponse
): Promise<HttpResponse<SignInWithRecoveryCodesResponseBody>> {
return this.httpService.post(Paths.v1.signInWithRecoveryCodes, params)
}
}

View File

@@ -1,12 +1,15 @@
import { HttpResponse } from '@standardnotes/responses'
import { RecoveryKeyParamsRequestParams, SignInWithRecoveryCodesRequestParams } from '../../Request'
import {
GenerateRecoveryCodesResponse,
RecoveryKeyParamsResponse,
SignInWithRecoveryCodesResponse,
GenerateRecoveryCodesResponseBody,
RecoveryKeyParamsResponseBody,
SignInWithRecoveryCodesResponseBody,
} from '../../Response'
export interface AuthServerInterface {
generateRecoveryCodes(): Promise<GenerateRecoveryCodesResponse>
recoveryKeyParams(params: RecoveryKeyParamsRequestParams): Promise<RecoveryKeyParamsResponse>
signInWithRecoveryCodes(params: SignInWithRecoveryCodesRequestParams): Promise<SignInWithRecoveryCodesResponse>
generateRecoveryCodes(): Promise<HttpResponse<GenerateRecoveryCodesResponseBody>>
recoveryKeyParams(params: RecoveryKeyParamsRequestParams): Promise<HttpResponse<RecoveryKeyParamsResponseBody>>
signInWithRecoveryCodes(
params: SignInWithRecoveryCodesRequestParams,
): Promise<HttpResponse<SignInWithRecoveryCodesResponseBody>>
}

View File

@@ -5,12 +5,13 @@ import {
DeleteAuthenticatorRequestParams,
VerifyAuthenticatorRegistrationResponseRequestParams,
} from '../../Request'
import { HttpResponse } from '@standardnotes/responses'
import {
ListAuthenticatorsResponse,
DeleteAuthenticatorResponse,
GenerateAuthenticatorRegistrationOptionsResponse,
VerifyAuthenticatorRegistrationResponseResponse,
GenerateAuthenticatorAuthenticationOptionsResponse,
ListAuthenticatorsResponseBody,
DeleteAuthenticatorResponseBody,
GenerateAuthenticatorRegistrationOptionsResponseBody,
VerifyAuthenticatorRegistrationResponseBody,
GenerateAuthenticatorAuthenticationOptionsResponseBody,
} from '../../Response'
import { AuthenticatorServerInterface } from './AuthenticatorServerInterface'
import { Paths } from './Paths'
@@ -18,37 +19,27 @@ import { Paths } from './Paths'
export class AuthenticatorServer implements AuthenticatorServerInterface {
constructor(private httpService: HttpServiceInterface) {}
async list(params: ListAuthenticatorsRequestParams): Promise<ListAuthenticatorsResponse> {
const response = await this.httpService.get(Paths.v1.listAuthenticators, params)
return response as ListAuthenticatorsResponse
async list(params: ListAuthenticatorsRequestParams): Promise<HttpResponse<ListAuthenticatorsResponseBody>> {
return this.httpService.get(Paths.v1.listAuthenticators, params)
}
async delete(params: DeleteAuthenticatorRequestParams): Promise<DeleteAuthenticatorResponse> {
const response = await this.httpService.delete(Paths.v1.deleteAuthenticator(params.authenticatorId), params)
return response as DeleteAuthenticatorResponse
async delete(params: DeleteAuthenticatorRequestParams): Promise<HttpResponse<DeleteAuthenticatorResponseBody>> {
return this.httpService.delete(Paths.v1.deleteAuthenticator(params.authenticatorId), params)
}
async generateRegistrationOptions(): Promise<GenerateAuthenticatorRegistrationOptionsResponse> {
const response = await this.httpService.get(Paths.v1.generateRegistrationOptions)
return response as GenerateAuthenticatorRegistrationOptionsResponse
async generateRegistrationOptions(): Promise<HttpResponse<GenerateAuthenticatorRegistrationOptionsResponseBody>> {
return this.httpService.get(Paths.v1.generateRegistrationOptions)
}
async verifyRegistrationResponse(
params: VerifyAuthenticatorRegistrationResponseRequestParams,
): Promise<VerifyAuthenticatorRegistrationResponseResponse> {
const response = await this.httpService.post(Paths.v1.verifyRegistrationResponse, params)
return response as VerifyAuthenticatorRegistrationResponseResponse
): Promise<HttpResponse<VerifyAuthenticatorRegistrationResponseBody>> {
return this.httpService.post(Paths.v1.verifyRegistrationResponse, params)
}
async generateAuthenticationOptions(
params: GenerateAuthenticatorAuthenticationOptionsRequestParams,
): Promise<GenerateAuthenticatorAuthenticationOptionsResponse> {
const response = await this.httpService.post(Paths.v1.generateAuthenticationOptions, params)
return response as GenerateAuthenticatorAuthenticationOptionsResponse
): Promise<HttpResponse<GenerateAuthenticatorAuthenticationOptionsResponseBody>> {
return this.httpService.post(Paths.v1.generateAuthenticationOptions, params)
}
}

View File

@@ -1,3 +1,4 @@
import { HttpResponse } from '@standardnotes/responses'
import {
ListAuthenticatorsRequestParams,
DeleteAuthenticatorRequestParams,
@@ -5,21 +6,21 @@ import {
GenerateAuthenticatorAuthenticationOptionsRequestParams,
} from '../../Request'
import {
ListAuthenticatorsResponse,
DeleteAuthenticatorResponse,
GenerateAuthenticatorRegistrationOptionsResponse,
VerifyAuthenticatorRegistrationResponseResponse,
GenerateAuthenticatorAuthenticationOptionsResponse,
ListAuthenticatorsResponseBody,
DeleteAuthenticatorResponseBody,
GenerateAuthenticatorRegistrationOptionsResponseBody,
VerifyAuthenticatorRegistrationResponseBody,
GenerateAuthenticatorAuthenticationOptionsResponseBody,
} from '../../Response'
export interface AuthenticatorServerInterface {
list(params: ListAuthenticatorsRequestParams): Promise<ListAuthenticatorsResponse>
delete(params: DeleteAuthenticatorRequestParams): Promise<DeleteAuthenticatorResponse>
generateRegistrationOptions(): Promise<GenerateAuthenticatorRegistrationOptionsResponse>
list(params: ListAuthenticatorsRequestParams): Promise<HttpResponse<ListAuthenticatorsResponseBody>>
delete(params: DeleteAuthenticatorRequestParams): Promise<HttpResponse<DeleteAuthenticatorResponseBody>>
generateRegistrationOptions(): Promise<HttpResponse<GenerateAuthenticatorRegistrationOptionsResponseBody>>
verifyRegistrationResponse(
params: VerifyAuthenticatorRegistrationResponseRequestParams,
): Promise<VerifyAuthenticatorRegistrationResponseResponse>
): Promise<HttpResponse<VerifyAuthenticatorRegistrationResponseBody>>
generateAuthenticationOptions(
params: GenerateAuthenticatorAuthenticationOptionsRequestParams,
): Promise<GenerateAuthenticatorAuthenticationOptionsResponse>
): Promise<HttpResponse<GenerateAuthenticatorAuthenticationOptionsResponseBody>>
}

View File

@@ -1,8 +1,9 @@
import { HttpServiceInterface } from '../../Http/HttpServiceInterface'
import { DeleteRevisionRequestParams, GetRevisionRequestParams, ListRevisionsRequestParams } from '../../Request'
import { DeleteRevisionResponse } from '../../Response/Revision/DeleteRevisionResponse'
import { GetRevisionResponse } from '../../Response/Revision/GetRevisionResponse'
import { ListRevisionsResponse } from '../../Response/Revision/ListRevisionsResponse'
import { HttpResponse } from '@standardnotes/responses'
import { DeleteRevisionResponseBody } from '../../Response/Revision/DeleteRevisionResponseBody'
import { GetRevisionResponseBody } from '../../Response/Revision/GetRevisionResponseBody'
import { ListRevisionsResponseBody } from '../../Response/Revision/ListRevisionsResponseBody'
import { Paths } from './Paths'
import { RevisionServerInterface } from './RevisionServerInterface'
@@ -10,21 +11,15 @@ import { RevisionServerInterface } from './RevisionServerInterface'
export class RevisionServer implements RevisionServerInterface {
constructor(private httpService: HttpServiceInterface) {}
async listRevisions(params: ListRevisionsRequestParams): Promise<ListRevisionsResponse> {
const response = await this.httpService.get(Paths.v2.listRevisions(params.itemUuid))
return response as ListRevisionsResponse
async listRevisions(params: ListRevisionsRequestParams): Promise<HttpResponse<ListRevisionsResponseBody>> {
return this.httpService.get(Paths.v2.listRevisions(params.itemUuid))
}
async getRevision(params: GetRevisionRequestParams): Promise<GetRevisionResponse> {
const response = await this.httpService.get(Paths.v2.getRevision(params.itemUuid, params.revisionUuid))
return response as GetRevisionResponse
async getRevision(params: GetRevisionRequestParams): Promise<HttpResponse<GetRevisionResponseBody>> {
return this.httpService.get(Paths.v2.getRevision(params.itemUuid, params.revisionUuid))
}
async deleteRevision(params: DeleteRevisionRequestParams): Promise<DeleteRevisionResponse> {
const response = await this.httpService.delete(Paths.v2.deleteRevision(params.itemUuid, params.revisionUuid))
return response as DeleteRevisionResponse
async deleteRevision(params: DeleteRevisionRequestParams): Promise<HttpResponse<DeleteRevisionResponseBody>> {
return this.httpService.delete(Paths.v2.deleteRevision(params.itemUuid, params.revisionUuid))
}
}

View File

@@ -1,12 +1,13 @@
import { HttpResponse } from '@standardnotes/responses'
import { DeleteRevisionRequestParams } from '../../Request/Revision/DeleteRevisionRequestParams'
import { GetRevisionRequestParams } from '../../Request/Revision/GetRevisionRequestParams'
import { ListRevisionsRequestParams } from '../../Request/Revision/ListRevisionsRequestParams'
import { DeleteRevisionResponse } from '../../Response/Revision/DeleteRevisionResponse'
import { GetRevisionResponse } from '../../Response/Revision/GetRevisionResponse'
import { ListRevisionsResponse } from '../../Response/Revision/ListRevisionsResponse'
import { DeleteRevisionResponseBody } from '../../Response/Revision/DeleteRevisionResponseBody'
import { GetRevisionResponseBody } from '../../Response/Revision/GetRevisionResponseBody'
import { ListRevisionsResponseBody } from '../../Response/Revision/ListRevisionsResponseBody'
export interface RevisionServerInterface {
listRevisions(params: ListRevisionsRequestParams): Promise<ListRevisionsResponse>
getRevision(params: GetRevisionRequestParams): Promise<GetRevisionResponse>
deleteRevision(params: DeleteRevisionRequestParams): Promise<DeleteRevisionResponse>
listRevisions(params: ListRevisionsRequestParams): Promise<HttpResponse<ListRevisionsResponseBody>>
getRevision(params: GetRevisionRequestParams): Promise<HttpResponse<GetRevisionResponseBody>>
deleteRevision(params: DeleteRevisionRequestParams): Promise<HttpResponse<DeleteRevisionResponseBody>>
}

View File

@@ -1,4 +1,3 @@
import { AppleIAPConfirmResponse } from './../../Response/Subscription/AppleIAPConfirmResponse'
import { HttpServiceInterface } from '../../Http/HttpServiceInterface'
import { AppleIAPConfirmRequestParams } from '../../Request'
import { SubscriptionInviteAcceptRequestParams } from '../../Request/Subscription/SubscriptionInviteAcceptRequestParams'
@@ -6,11 +5,13 @@ import { SubscriptionInviteCancelRequestParams } from '../../Request/Subscriptio
import { SubscriptionInviteDeclineRequestParams } from '../../Request/Subscription/SubscriptionInviteDeclineRequestParams'
import { SubscriptionInviteListRequestParams } from '../../Request/Subscription/SubscriptionInviteListRequestParams'
import { SubscriptionInviteRequestParams } from '../../Request/Subscription/SubscriptionInviteRequestParams'
import { SubscriptionInviteAcceptResponse } from '../../Response/Subscription/SubscriptionInviteAcceptResponse'
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
import { SubscriptionInviteDeclineResponse } from '../../Response/Subscription/SubscriptionInviteDeclineResponse'
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
import { AppleIAPConfirmResponseBody } from './../../Response/Subscription/AppleIAPConfirmResponseBody'
import { SubscriptionInviteAcceptResponseBody } from '../../Response/Subscription/SubscriptionInviteAcceptResponseBody'
import { SubscriptionInviteCancelResponseBody } from '../../Response/Subscription/SubscriptionInviteCancelResponseBody'
import { SubscriptionInviteDeclineResponseBody } from '../../Response/Subscription/SubscriptionInviteDeclineResponseBody'
import { SubscriptionInviteListResponseBody } from '../../Response/Subscription/SubscriptionInviteListResponseBody'
import { SubscriptionInviteResponseBody } from '../../Response/Subscription/SubscriptionInviteResponseBody'
import { HttpResponse } from '@standardnotes/responses'
import { Paths } from './Paths'
import { SubscriptionServerInterface } from './SubscriptionServerInterface'
@@ -18,39 +19,35 @@ import { SubscriptionServerInterface } from './SubscriptionServerInterface'
export class SubscriptionServer implements SubscriptionServerInterface {
constructor(private httpService: HttpServiceInterface) {}
async acceptInvite(params: SubscriptionInviteAcceptRequestParams): Promise<SubscriptionInviteAcceptResponse> {
const response = await this.httpService.post(Paths.v1.acceptInvite(params.inviteUuid), params)
return response as SubscriptionInviteAcceptResponse
async acceptInvite(
params: SubscriptionInviteAcceptRequestParams,
): Promise<HttpResponse<SubscriptionInviteAcceptResponseBody>> {
return this.httpService.post(Paths.v1.acceptInvite(params.inviteUuid), params)
}
async declineInvite(params: SubscriptionInviteDeclineRequestParams): Promise<SubscriptionInviteDeclineResponse> {
const response = await this.httpService.get(Paths.v1.declineInvite(params.inviteUuid), params)
return response as SubscriptionInviteDeclineResponse
async declineInvite(
params: SubscriptionInviteDeclineRequestParams,
): Promise<HttpResponse<SubscriptionInviteDeclineResponseBody>> {
return this.httpService.get(Paths.v1.declineInvite(params.inviteUuid), params)
}
async cancelInvite(params: SubscriptionInviteCancelRequestParams): Promise<SubscriptionInviteCancelResponse> {
const response = await this.httpService.delete(Paths.v1.cancelInvite(params.inviteUuid), params)
return response as SubscriptionInviteCancelResponse
async cancelInvite(
params: SubscriptionInviteCancelRequestParams,
): Promise<HttpResponse<SubscriptionInviteCancelResponseBody>> {
return this.httpService.delete(Paths.v1.cancelInvite(params.inviteUuid), params)
}
async listInvites(params: SubscriptionInviteListRequestParams): Promise<SubscriptionInviteListResponse> {
const response = await this.httpService.get(Paths.v1.listInvites, params)
return response as SubscriptionInviteListResponse
async listInvites(
params: SubscriptionInviteListRequestParams,
): Promise<HttpResponse<SubscriptionInviteListResponseBody>> {
return this.httpService.get(Paths.v1.listInvites, params)
}
async invite(params: SubscriptionInviteRequestParams): Promise<SubscriptionInviteResponse> {
const response = await this.httpService.post(Paths.v1.invite, params)
return response as SubscriptionInviteResponse
async invite(params: SubscriptionInviteRequestParams): Promise<HttpResponse<SubscriptionInviteResponseBody>> {
return this.httpService.post(Paths.v1.invite, params)
}
async confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<AppleIAPConfirmResponse> {
const response = await this.httpService.post(Paths.v1.confirmAppleIAP, params)
return response as AppleIAPConfirmResponse
async confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<HttpResponse<AppleIAPConfirmResponseBody>> {
return this.httpService.post(Paths.v1.confirmAppleIAP, params)
}
}

View File

@@ -1,21 +1,29 @@
import { AppleIAPConfirmResponse } from './../../Response/Subscription/AppleIAPConfirmResponse'
import { AppleIAPConfirmRequestParams } from './../../Request/Subscription/AppleIAPConfirmRequestParams'
import { SubscriptionInviteAcceptRequestParams } from '../../Request/Subscription/SubscriptionInviteAcceptRequestParams'
import { SubscriptionInviteCancelRequestParams } from '../../Request/Subscription/SubscriptionInviteCancelRequestParams'
import { SubscriptionInviteDeclineRequestParams } from '../../Request/Subscription/SubscriptionInviteDeclineRequestParams'
import { SubscriptionInviteListRequestParams } from '../../Request/Subscription/SubscriptionInviteListRequestParams'
import { SubscriptionInviteRequestParams } from '../../Request/Subscription/SubscriptionInviteRequestParams'
import { SubscriptionInviteAcceptResponse } from '../../Response/Subscription/SubscriptionInviteAcceptResponse'
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
import { SubscriptionInviteDeclineResponse } from '../../Response/Subscription/SubscriptionInviteDeclineResponse'
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
import { AppleIAPConfirmResponseBody } from './../../Response/Subscription/AppleIAPConfirmResponseBody'
import { SubscriptionInviteAcceptResponseBody } from '../../Response/Subscription/SubscriptionInviteAcceptResponseBody'
import { SubscriptionInviteCancelResponseBody } from '../../Response/Subscription/SubscriptionInviteCancelResponseBody'
import { SubscriptionInviteDeclineResponseBody } from '../../Response/Subscription/SubscriptionInviteDeclineResponseBody'
import { SubscriptionInviteListResponseBody } from '../../Response/Subscription/SubscriptionInviteListResponseBody'
import { SubscriptionInviteResponseBody } from '../../Response/Subscription/SubscriptionInviteResponseBody'
import { HttpResponse } from '@standardnotes/responses'
export interface SubscriptionServerInterface {
invite(params: SubscriptionInviteRequestParams): Promise<SubscriptionInviteResponse>
acceptInvite(params: SubscriptionInviteAcceptRequestParams): Promise<SubscriptionInviteAcceptResponse>
declineInvite(params: SubscriptionInviteDeclineRequestParams): Promise<SubscriptionInviteDeclineResponse>
cancelInvite(params: SubscriptionInviteCancelRequestParams): Promise<SubscriptionInviteCancelResponse>
listInvites(params: SubscriptionInviteListRequestParams): Promise<SubscriptionInviteListResponse>
confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<AppleIAPConfirmResponse>
invite(params: SubscriptionInviteRequestParams): Promise<HttpResponse<SubscriptionInviteResponseBody>>
acceptInvite(
params: SubscriptionInviteAcceptRequestParams,
): Promise<HttpResponse<SubscriptionInviteAcceptResponseBody>>
declineInvite(
params: SubscriptionInviteDeclineRequestParams,
): Promise<HttpResponse<SubscriptionInviteDeclineResponseBody>>
cancelInvite(
params: SubscriptionInviteCancelRequestParams,
): Promise<HttpResponse<SubscriptionInviteCancelResponseBody>>
listInvites(params: SubscriptionInviteListRequestParams): Promise<HttpResponse<SubscriptionInviteListResponseBody>>
confirmAppleIAP(params: AppleIAPConfirmRequestParams): Promise<HttpResponse<AppleIAPConfirmResponseBody>>
}

View File

@@ -1,23 +1,20 @@
import { HttpServiceInterface } from '../../Http/HttpServiceInterface'
import { UserDeletionRequestParams } from '../../Request/User/UserDeletionRequestParams'
import { UserRegistrationRequestParams } from '../../Request/User/UserRegistrationRequestParams'
import { UserDeletionResponse } from '../../Response/User/UserDeletionResponse'
import { UserRegistrationResponse } from '../../Response/User/UserRegistrationResponse'
import { HttpResponse } from '@standardnotes/responses'
import { UserDeletionResponseBody } from '../../Response/User/UserDeletionResponseBody'
import { UserRegistrationResponseBody } from '../../Response/User/UserRegistrationResponseBody'
import { Paths } from './Paths'
import { UserServerInterface } from './UserServerInterface'
export class UserServer implements UserServerInterface {
constructor(private httpService: HttpServiceInterface) {}
async deleteAccount(params: UserDeletionRequestParams): Promise<UserDeletionResponse> {
const response = await this.httpService.delete(Paths.v1.deleteAccount(params.userUuid), params)
return response as UserDeletionResponse
async deleteAccount(params: UserDeletionRequestParams): Promise<HttpResponse<UserDeletionResponseBody>> {
return this.httpService.delete(Paths.v1.deleteAccount(params.userUuid), params)
}
async register(params: UserRegistrationRequestParams): Promise<UserRegistrationResponse> {
const response = await this.httpService.post(Paths.v1.register, params)
return response as UserRegistrationResponse
async register(params: UserRegistrationRequestParams): Promise<HttpResponse<UserRegistrationResponseBody>> {
return this.httpService.post(Paths.v1.register, params)
}
}

View File

@@ -1,9 +1,10 @@
import { HttpResponse } from '@standardnotes/responses'
import { UserDeletionRequestParams } from '../../Request/User/UserDeletionRequestParams'
import { UserRegistrationRequestParams } from '../../Request/User/UserRegistrationRequestParams'
import { UserDeletionResponse } from '../../Response/User/UserDeletionResponse'
import { UserRegistrationResponse } from '../../Response/User/UserRegistrationResponse'
import { UserDeletionResponseBody } from '../../Response/User/UserDeletionResponseBody'
import { UserRegistrationResponseBody } from '../../Response/User/UserRegistrationResponseBody'
export interface UserServerInterface {
register(params: UserRegistrationRequestParams): Promise<UserRegistrationResponse>
deleteAccount(params: UserDeletionRequestParams): Promise<UserDeletionResponse>
register(params: UserRegistrationRequestParams): Promise<HttpResponse<UserRegistrationResponseBody>>
deleteAccount(params: UserDeletionRequestParams): Promise<HttpResponse<UserDeletionResponseBody>>
}

View File

@@ -1,6 +1,7 @@
import { HttpServiceInterface } from '../../Http/HttpServiceInterface'
import { UserRequestRequestParams } from '../../Request/UserRequest/UserRequestRequestParams'
import { UserRequestResponse } from '../../Response/UserRequest/UserRequestResponse'
import { HttpResponse } from '@standardnotes/responses'
import { UserRequestResponseBody } from '../../Response/UserRequest/UserRequestResponseBody'
import { Paths } from './Paths'
import { UserRequestServerInterface } from './UserRequestServerInterface'
@@ -8,9 +9,7 @@ import { UserRequestServerInterface } from './UserRequestServerInterface'
export class UserRequestServer implements UserRequestServerInterface {
constructor(private httpService: HttpServiceInterface) {}
async submitUserRequest(params: UserRequestRequestParams): Promise<UserRequestResponse> {
const response = await this.httpService.post(Paths.v1.submitUserRequest(params.userUuid), params)
return response as UserRequestResponse
async submitUserRequest(params: UserRequestRequestParams): Promise<HttpResponse<UserRequestResponseBody>> {
return this.httpService.post(Paths.v1.submitUserRequest(params.userUuid), params)
}
}

View File

@@ -1,6 +1,7 @@
import { HttpResponse } from '@standardnotes/responses'
import { UserRequestRequestParams } from '../../Request/UserRequest/UserRequestRequestParams'
import { UserRequestResponse } from '../../Response/UserRequest/UserRequestResponse'
import { UserRequestResponseBody } from '../../Response/UserRequest/UserRequestResponseBody'
export interface UserRequestServerInterface {
submitUserRequest(params: UserRequestRequestParams): Promise<UserRequestResponse>
submitUserRequest(params: UserRequestRequestParams): Promise<HttpResponse<UserRequestResponseBody>>
}

View File

@@ -1,6 +1,7 @@
import { HttpServiceInterface } from '../../Http/HttpServiceInterface'
import { WebSocketConnectionTokenRequestParams } from '../../Request/WebSocket/WebSocketConnectionTokenRequestParams'
import { WebSocketConnectionTokenResponse } from '../../Response/WebSocket/WebSocketConnectionTokenResponse'
import { HttpResponse } from '@standardnotes/responses'
import { WebSocketConnectionTokenResponseBody } from '../../Response/WebSocket/WebSocketConnectionTokenResponseBody'
import { Paths } from './Paths'
import { WebSocketServerInterface } from './WebSocketServerInterface'
@@ -9,9 +10,7 @@ export class WebSocketServer implements WebSocketServerInterface {
async createConnectionToken(
params: WebSocketConnectionTokenRequestParams,
): Promise<WebSocketConnectionTokenResponse> {
const response = await this.httpService.post(Paths.v1.createConnectionToken, params)
return response as WebSocketConnectionTokenResponse
): Promise<HttpResponse<WebSocketConnectionTokenResponseBody>> {
return this.httpService.post(Paths.v1.createConnectionToken, params)
}
}

View File

@@ -1,6 +1,9 @@
import { HttpResponse } from '@standardnotes/responses'
import { WebSocketConnectionTokenRequestParams } from '../../Request/WebSocket/WebSocketConnectionTokenRequestParams'
import { WebSocketConnectionTokenResponse } from '../../Response/WebSocket/WebSocketConnectionTokenResponse'
import { WebSocketConnectionTokenResponseBody } from '../../Response/WebSocket/WebSocketConnectionTokenResponseBody'
export interface WebSocketServerInterface {
createConnectionToken(params: WebSocketConnectionTokenRequestParams): Promise<WebSocketConnectionTokenResponse>
createConnectionToken(
params: WebSocketConnectionTokenRequestParams,
): Promise<HttpResponse<WebSocketConnectionTokenResponseBody>>
}

View File

@@ -48,13 +48,13 @@ export function CreateAnyKeyParams(keyParams: AnyKeyParamsContent) {
export function KeyParamsFromApiResponse(response: KeyParamsResponse, identifier?: string) {
const rawKeyParams: AnyKeyParamsContent = {
identifier: identifier || response.data.identifier!,
pw_cost: response.data.pw_cost!,
pw_nonce: response.data.pw_nonce!,
pw_salt: response.data.pw_salt!,
version: ProtocolVersionForKeyParams(response.data),
origination: response.data.origination,
created: response.data.created,
identifier: identifier || response.identifier!,
pw_cost: response.pw_cost!,
pw_nonce: response.pw_nonce!,
pw_salt: response.pw_salt!,
version: ProtocolVersionForKeyParams(response),
origination: response.origination,
created: response.created,
}
return CreateAnyKeyParams(rawKeyParams)
}

View File

@@ -1,8 +1,8 @@
import { StartUploadSessionResponse, MinimalHttpResponse, ClientDisplayableError } from '@standardnotes/responses'
import { StartUploadSessionResponse, HttpResponse, ClientDisplayableError } from '@standardnotes/responses'
import { FileContent } from '@standardnotes/models'
export interface FilesApiInterface {
startUploadSession(apiToken: string): Promise<StartUploadSessionResponse>
startUploadSession(apiToken: string): Promise<HttpResponse<StartUploadSessionResponse>>
uploadFileBytes(apiToken: string, chunkId: number, encryptedBytes: Uint8Array): Promise<boolean>
@@ -16,7 +16,7 @@ export interface FilesApiInterface {
onBytesReceived: (bytes: Uint8Array) => Promise<void>,
): Promise<ClientDisplayableError | undefined>
deleteFile(apiToken: string): Promise<MinimalHttpResponse>
deleteFile(apiToken: string): Promise<HttpResponse>
createFileValetToken(
remoteIdentifier: string,

View File

@@ -1,6 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { ChangeCredentialsData } from './ChangeCredentialsData'
export type ChangeCredentialsResponse = HttpResponse & {
data: ChangeCredentialsData
}
export type ChangeCredentialsResponse = ChangeCredentialsData

View File

@@ -1,6 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { KeyParamsData } from './KeyParamsData'
export type KeyParamsResponse = HttpResponse & {
data: KeyParamsData
}
export type KeyParamsResponse = KeyParamsData

View File

@@ -1,6 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { RegistrationData } from './RegistrationData'
export type RegistrationResponse = HttpResponse & {
data: RegistrationData
}
export type RegistrationResponse = RegistrationData

View File

@@ -1,4 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { SessionListEntry } from './SessionListEntry'
export type SessionListResponse = HttpResponse & { data: SessionListEntry[] }
export type SessionListResponse = SessionListEntry[]

View File

@@ -1,6 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { SessionRenewalData } from './SessionRenewalData'
export type SessionRenewalResponse = HttpResponse & {
data: SessionRenewalData
}
export type SessionRenewalResponse = SessionRenewalData

View File

@@ -1,6 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { SignInData } from './SignInData'
export type SignInResponse = HttpResponse & {
data: SignInData
}
export type SignInResponse = SignInData

View File

@@ -1,3 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { HttpSuccessResponse } from '../Http/HttpResponse'
export type SignOutResponse = HttpResponse & Record<string, unknown>
export type SignOutResponse = HttpSuccessResponse

View File

@@ -1,11 +1,9 @@
import { Error } from '../Http/Error'
export class ClientDisplayableError {
constructor(public text: string, public title?: string, public tag?: string) {
console.error('Client Displayable Error:', text, title || '', tag || '')
}
static FromError(error: Error) {
static FromError(error: { message: string; tag?: string }) {
return new ClientDisplayableError(error.message, undefined, error.tag)
}
}

View File

@@ -1,6 +1 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
export type CloseUploadSessionResponse = MinimalHttpResponse & {
success: boolean
message: string
}
export type CloseUploadSessionResponse = { success: boolean; message: string }

View File

@@ -1,6 +1,3 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
import { CreateValetTokenResponseData } from './CreateValetTokenResponseData'
export type CreateValetTokenResponse = MinimalHttpResponse & {
data: CreateValetTokenResponseData
}
export type CreateValetTokenResponse = CreateValetTokenResponseData

View File

@@ -1,5 +1 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
export type DownloadFileChunkResponse = MinimalHttpResponse & {
data: ArrayBuffer
}
export type DownloadFileChunkResponse = ArrayBuffer

View File

@@ -1,6 +1,4 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
export type StartUploadSessionResponse = MinimalHttpResponse & {
export type StartUploadSessionResponse = {
success: boolean
uploadId: string
}

View File

@@ -1,5 +1,3 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
export type UploadFileChunkResponse = MinimalHttpResponse & {
export type UploadFileChunkResponse = {
success: boolean
}

View File

@@ -0,0 +1,5 @@
export type DeprecatedError = {
message: string
status: number
tag?: string
}

View File

@@ -0,0 +1,13 @@
import { DeprecatedError } from './DeprecatedError'
import { HttpStatusCode } from './HttpStatusCode'
import { DeprecatedResponseMeta } from './DeprecatedResponseMeta'
export type DeprecatedHttpResponse = {
status: HttpStatusCode
error?: DeprecatedError
data?: {
error?: DeprecatedError
}
meta?: DeprecatedResponseMeta
headers?: Map<string, string | null>
}

View File

@@ -0,0 +1,8 @@
import { DeprecatedError } from './DeprecatedError'
import { HttpStatusCode } from './HttpStatusCode'
export type DeprecatedMinimalHttpResponse = {
status: HttpStatusCode
error?: DeprecatedError
headers?: Map<string, string | null>
}

View File

@@ -1,6 +1,6 @@
import { Role } from '@standardnotes/security'
export type ResponseMeta = {
export type DeprecatedResponseMeta = {
auth: {
userUuid?: string
roles?: Role[]

View File

@@ -1,7 +1,6 @@
export enum StatusCode {
export enum DeprecatedStatusCode {
LocalValidationError = 10,
CanceledMfa = 11,
UnknownError = 12,
HttpStatusMinSuccess = 200,
HttpStatusNoContent = 204,

View File

@@ -1,10 +0,0 @@
export type Error = {
message: string
status: number
tag?: string
/** In the case of MFA required responses,
* the required prompt is returned as part of the error */
payload?: {
mfa_key?: string
}
}

View File

@@ -9,4 +9,7 @@ export enum ErrorTag {
RevokedSession = 'revoked-session',
AuthInvalid = 'invalid-auth',
ReadOnlyAccess = 'read-only-access',
ClientValidationError = 'client-validation-error',
ClientCanceledMfa = 'client-canceled-mfa',
}

View File

@@ -1,6 +0,0 @@
import { HttpResponse } from './HttpResponse'
import { StatusCode } from './StatusCode'
export function isErrorResponseExpiredToken(errorResponse: HttpResponse): boolean {
return errorResponse.status === StatusCode.HttpStatusExpiredAccessToken
}

View File

@@ -0,0 +1,6 @@
import { ErrorTag } from './ErrorTag'
export type HttpError = {
message: string
tag?: ErrorTag
}

View File

@@ -0,0 +1,5 @@
import { HttpError } from './HttpError'
export type HttpErrorResponseBody = {
error: HttpError
}

View File

@@ -1,13 +1,26 @@
import { StatusCode } from './StatusCode'
import { Error } from './Error'
import { ResponseMeta } from './ResponseMeta'
import { HttpErrorResponseBody } from './HttpErrorResponseBody'
import { HttpResponseMeta } from './HttpResponseMeta'
import { HttpHeaders } from './HttpHeaders'
import { HttpStatusCode } from './HttpStatusCode'
export type HttpResponse = {
status?: StatusCode
error?: Error
data?: {
error?: Error
}
meta?: ResponseMeta
headers?: Map<string, string | null>
type AnySuccessRecord = Record<string, unknown> & { error?: never }
interface HttpResponseBase {
status: HttpStatusCode
meta?: HttpResponseMeta
headers?: HttpHeaders
}
export interface HttpErrorResponse extends HttpResponseBase {
data: HttpErrorResponseBody
}
export interface HttpSuccessResponse<T = AnySuccessRecord> extends HttpResponseBase {
data: T
}
export type HttpResponse<T = AnySuccessRecord> = HttpErrorResponse | HttpSuccessResponse<T>
export function isErrorResponse<T>(response: HttpResponse<T>): response is HttpErrorResponse {
return (response.data as HttpErrorResponseBody)?.error != undefined
}

View File

@@ -1,8 +0,0 @@
import { StatusCode } from './StatusCode'
import { Error } from './Error'
export type MinimalHttpResponse = {
status?: StatusCode
error?: Error
headers?: Map<string, string | null>
}

View File

@@ -0,0 +1,15 @@
export * from './ErrorTag'
export * from './HttpErrorResponseBody'
export * from './HttpHeaders'
export * from './HttpRequest'
export * from './HttpRequestParams'
export * from './HttpResponse'
export * from './HttpResponseMeta'
export * from './HttpVerb'
export * from './DeprecatedError'
export * from './DeprecatedHttpResponse'
export * from './DeprecatedMinimalHttpResponses'
export * from './DeprecatedResponseMeta'
export * from './DeprecatedStatusCode'
export * from './HttpStatusCode'
export * from './HttpError'

View File

@@ -1,8 +1,5 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
import { IntegrityPayload } from './IntegrityPayload'
export type CheckIntegrityResponse = MinimalHttpResponse & {
data: {
mismatches: IntegrityPayload[]
}
export type CheckIntegrityResponse = {
mismatches: IntegrityPayload[]
}

View File

@@ -1,14 +1,11 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
import { ServerItemResponse } from './ServerItemResponse'
export type GetSingleItemResponse = MinimalHttpResponse & {
data:
| {
success: true
item: ServerItemResponse
}
| {
success: false
message: string
}
}
export type GetSingleItemResponse =
| {
success: true
item: ServerItemResponse
}
| {
success: false
message: string
}

View File

@@ -1,4 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { RawSyncData } from './RawSyncData'
export type RawSyncResponse = HttpResponse & { data: RawSyncData }
export type RawSyncResponse = RawSyncData

View File

@@ -1,8 +1,8 @@
import { AnyKeyParamsContent, ContentType } from '@standardnotes/common'
import { HttpResponse } from '../Http/HttpResponse'
import { DeprecatedHttpResponse } from '../Http/DeprecatedHttpResponse'
import { ServerItemResponse } from '../Item/ServerItemResponse'
export type ActionResponse = HttpResponse & {
export type ActionResponse = DeprecatedHttpResponse & {
description: string
supported_types: ContentType[]
deprecation?: string

View File

@@ -1,6 +1,3 @@
import { HttpResponse } from '../Http/HttpResponse'
import { ListedAccountInfo } from './ListedAccountInfo'
export type ListedAccountInfoResponse = HttpResponse & {
data: ListedAccountInfo
}
export type ListedAccountInfoResponse = ListedAccountInfo

View File

@@ -1,5 +1 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
export type ListedRegistrationResponse = MinimalHttpResponse & {
data?: unknown
}
export type ListedRegistrationResponse = unknown

View File

@@ -1,3 +1,3 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
import { HttpResponse } from '../Http/HttpResponse'
export type DeleteSettingResponse = MinimalHttpResponse
export type DeleteSettingResponse = HttpResponse

View File

@@ -1,6 +1,3 @@
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
import { AvailableSubscriptions } from './AvailableSubscriptions'
export type GetAvailableSubscriptionsResponse = MinimalHttpResponse & {
data?: AvailableSubscriptions
}
export type GetAvailableSubscriptionsResponse = AvailableSubscriptions

View File

@@ -1,9 +1,6 @@
import { FeatureDescription } from '@standardnotes/features'
import { MinimalHttpResponse } from '../Http/MinimalHttpResponses'
export type GetOfflineFeaturesResponse = MinimalHttpResponse & {
data?: {
features: FeatureDescription[]
roles: string[]
}
export type GetOfflineFeaturesResponse = {
features: FeatureDescription[]
roles: string[]
}

Some files were not shown because too many files have changed in this diff Show More