account.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. export * as AccountV2 from "./account"
  2. import { Schema } from "effect"
  3. import type * as HttpClientError from "effect/unstable/http/HttpClientError"
  4. export const ID = Schema.String.pipe(Schema.brand("AccountID"))
  5. export type ID = Schema.Schema.Type<typeof ID>
  6. export const OrgID = Schema.String.pipe(Schema.brand("OrgID"))
  7. export type OrgID = Schema.Schema.Type<typeof OrgID>
  8. export const AccessToken = Schema.String.pipe(Schema.brand("AccessToken"))
  9. export type AccessToken = Schema.Schema.Type<typeof AccessToken>
  10. export const RefreshToken = Schema.String.pipe(Schema.brand("RefreshToken"))
  11. export type RefreshToken = Schema.Schema.Type<typeof RefreshToken>
  12. export const DeviceCode = Schema.String.pipe(Schema.brand("DeviceCode"))
  13. export type DeviceCode = Schema.Schema.Type<typeof DeviceCode>
  14. export const UserCode = Schema.String.pipe(Schema.brand("UserCode"))
  15. export type UserCode = Schema.Schema.Type<typeof UserCode>
  16. export class Info extends Schema.Class<Info>("Account")({
  17. id: ID,
  18. email: Schema.String,
  19. url: Schema.String,
  20. active_org_id: Schema.NullOr(OrgID),
  21. }) {}
  22. export class Org extends Schema.Class<Org>("Org")({
  23. id: OrgID,
  24. name: Schema.String,
  25. }) {}
  26. export class AccountRepoError extends Schema.TaggedErrorClass<AccountRepoError>()("AccountRepoError", {
  27. message: Schema.String,
  28. cause: Schema.optional(Schema.Defect),
  29. }) {}
  30. export class AccountServiceError extends Schema.TaggedErrorClass<AccountServiceError>()("AccountServiceError", {
  31. message: Schema.String,
  32. cause: Schema.optional(Schema.Defect),
  33. }) {}
  34. export class AccountTransportError extends Schema.TaggedErrorClass<AccountTransportError>()("AccountTransportError", {
  35. method: Schema.String,
  36. url: Schema.String,
  37. description: Schema.optional(Schema.String),
  38. cause: Schema.optional(Schema.Defect),
  39. }) {
  40. static fromHttpClientError(error: HttpClientError.TransportError): AccountTransportError {
  41. return new AccountTransportError({
  42. method: error.request.method,
  43. url: error.request.url,
  44. description: error.description,
  45. cause: error.cause,
  46. })
  47. }
  48. override get message(): string {
  49. return [
  50. `Could not reach ${this.method} ${this.url}.`,
  51. `This failed before the server returned an HTTP response.`,
  52. this.description,
  53. `Check your network, proxy, or VPN configuration and try again.`,
  54. ]
  55. .filter(Boolean)
  56. .join("\n")
  57. }
  58. }
  59. export type AccountError = AccountRepoError | AccountServiceError | AccountTransportError
  60. export class Login extends Schema.Class<Login>("Login")({
  61. code: DeviceCode,
  62. user: UserCode,
  63. url: Schema.String,
  64. server: Schema.String,
  65. expiry: Schema.Duration,
  66. interval: Schema.Duration,
  67. }) {}
  68. export class PollSuccess extends Schema.TaggedClass<PollSuccess>()("PollSuccess", {
  69. email: Schema.String,
  70. }) {}
  71. export class PollPending extends Schema.TaggedClass<PollPending>()("PollPending", {}) {}
  72. export class PollSlow extends Schema.TaggedClass<PollSlow>()("PollSlow", {}) {}
  73. export class PollExpired extends Schema.TaggedClass<PollExpired>()("PollExpired", {}) {}
  74. export class PollDenied extends Schema.TaggedClass<PollDenied>()("PollDenied", {}) {}
  75. export class PollError extends Schema.TaggedClass<PollError>()("PollError", {
  76. cause: Schema.Defect,
  77. }) {}
  78. export const PollResult = Schema.Union([PollSuccess, PollPending, PollSlow, PollExpired, PollDenied, PollError])
  79. export type PollResult = Schema.Schema.Type<typeof PollResult>