@passlock/client 0.9.19 → 0.9.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +30 -21
  2. package/dist/authentication/authenticate.d.ts +5 -4
  3. package/dist/authentication/authenticate.d.ts.map +1 -1
  4. package/dist/authentication/authenticate.fixture.d.ts +3 -4
  5. package/dist/authentication/authenticate.fixture.d.ts.map +1 -1
  6. package/dist/authentication/authenticate.fixture.js +2 -11
  7. package/dist/authentication/authenticate.fixture.js.map +1 -1
  8. package/dist/authentication/authenticate.js +4 -4
  9. package/dist/authentication/authenticate.js.map +1 -1
  10. package/dist/connection/connection.d.ts +4 -3
  11. package/dist/connection/connection.d.ts.map +1 -1
  12. package/dist/connection/connection.fixture.d.ts +3 -5
  13. package/dist/connection/connection.fixture.d.ts.map +1 -1
  14. package/dist/connection/connection.fixture.js +3 -15
  15. package/dist/connection/connection.fixture.js.map +1 -1
  16. package/dist/connection/connection.js +3 -3
  17. package/dist/connection/connection.js.map +1 -1
  18. package/dist/effect.d.ts +1 -1
  19. package/dist/effect.d.ts.map +1 -1
  20. package/dist/effect.js +17 -8
  21. package/dist/effect.js.map +1 -1
  22. package/dist/email/email.d.ts +4 -4
  23. package/dist/email/email.d.ts.map +1 -1
  24. package/dist/email/email.fixture.d.ts +2 -3
  25. package/dist/email/email.fixture.d.ts.map +1 -1
  26. package/dist/email/email.fixture.js +2 -10
  27. package/dist/email/email.fixture.js.map +1 -1
  28. package/dist/email/email.js +2 -3
  29. package/dist/email/email.js.map +1 -1
  30. package/dist/index.d.ts +4 -2
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/logging/eventLogger.d.ts.map +1 -1
  34. package/dist/logging/eventLogger.js +15 -9
  35. package/dist/logging/eventLogger.js.map +1 -1
  36. package/dist/registration/register.d.ts +6 -4
  37. package/dist/registration/register.d.ts.map +1 -1
  38. package/dist/registration/register.fixture.d.ts +3 -4
  39. package/dist/registration/register.fixture.d.ts.map +1 -1
  40. package/dist/registration/register.fixture.js +2 -12
  41. package/dist/registration/register.fixture.js.map +1 -1
  42. package/dist/registration/register.js +5 -4
  43. package/dist/registration/register.js.map +1 -1
  44. package/dist/rpc/authentication.d.ts +9 -0
  45. package/dist/rpc/authentication.d.ts.map +1 -0
  46. package/dist/rpc/authentication.js +15 -0
  47. package/dist/rpc/authentication.js.map +1 -0
  48. package/dist/rpc/client.d.ts +27 -0
  49. package/dist/rpc/client.d.ts.map +1 -0
  50. package/dist/rpc/client.js +92 -0
  51. package/dist/rpc/client.js.map +1 -0
  52. package/dist/rpc/config.d.ts +16 -0
  53. package/dist/rpc/config.d.ts.map +1 -0
  54. package/dist/rpc/config.js +6 -0
  55. package/dist/rpc/config.js.map +1 -0
  56. package/dist/rpc/connection.d.ts +9 -0
  57. package/dist/rpc/connection.d.ts.map +1 -0
  58. package/dist/rpc/connection.js +14 -0
  59. package/dist/rpc/connection.js.map +1 -0
  60. package/dist/rpc/registration.d.ts +9 -0
  61. package/dist/rpc/registration.d.ts.map +1 -0
  62. package/dist/rpc/registration.js +15 -0
  63. package/dist/rpc/registration.js.map +1 -0
  64. package/dist/rpc/social.d.ts +11 -0
  65. package/dist/rpc/social.d.ts.map +1 -0
  66. package/dist/rpc/social.js +17 -0
  67. package/dist/rpc/social.js.map +1 -0
  68. package/dist/rpc/user.d.ts +9 -0
  69. package/dist/rpc/user.d.ts.map +1 -0
  70. package/dist/rpc/user.js +18 -0
  71. package/dist/rpc/user.js.map +1 -0
  72. package/dist/social/social.d.ts +4 -4
  73. package/dist/social/social.d.ts.map +1 -1
  74. package/dist/social/social.fixture.d.ts +1 -2
  75. package/dist/social/social.fixture.d.ts.map +1 -1
  76. package/dist/social/social.fixture.js +5 -14
  77. package/dist/social/social.fixture.js.map +1 -1
  78. package/dist/social/social.js +6 -6
  79. package/dist/social/social.js.map +1 -1
  80. package/dist/storage/storage.d.ts +1 -1
  81. package/dist/storage/storage.d.ts.map +1 -1
  82. package/dist/test/fixtures.d.ts +1 -3
  83. package/dist/test/fixtures.d.ts.map +1 -1
  84. package/dist/test/fixtures.js +0 -2
  85. package/dist/test/fixtures.js.map +1 -1
  86. package/dist/user/user.d.ts +4 -4
  87. package/dist/user/user.d.ts.map +1 -1
  88. package/dist/user/user.fixture.d.ts +2 -3
  89. package/dist/user/user.fixture.d.ts.map +1 -1
  90. package/dist/user/user.fixture.js +2 -10
  91. package/dist/user/user.fixture.js.map +1 -1
  92. package/dist/user/user.js +3 -4
  93. package/dist/user/user.js.map +1 -1
  94. package/dist/version.d.ts +2 -0
  95. package/dist/version.d.ts.map +1 -0
  96. package/dist/version.js +2 -0
  97. package/dist/version.js.map +1 -0
  98. package/package.json +24 -23
  99. package/src/authentication/authenticate.fixture.ts +8 -16
  100. package/src/authentication/authenticate.test.ts +7 -7
  101. package/src/authentication/authenticate.ts +13 -14
  102. package/src/connection/connection.fixture.ts +4 -16
  103. package/src/connection/connection.test.ts +7 -6
  104. package/src/connection/connection.ts +5 -5
  105. package/src/effect.ts +20 -14
  106. package/src/email/email.fixture.ts +3 -11
  107. package/src/email/email.test.ts +7 -7
  108. package/src/email/email.ts +5 -6
  109. package/src/index.ts +5 -2
  110. package/src/logging/eventLogger.test.ts +1 -0
  111. package/src/logging/eventLogger.ts +16 -10
  112. package/src/registration/register.fixture.ts +9 -18
  113. package/src/registration/register.test.ts +9 -9
  114. package/src/registration/register.ts +12 -13
  115. package/src/social/social.fixture.ts +7 -16
  116. package/src/social/social.test.ts +15 -15
  117. package/src/social/social.ts +9 -9
  118. package/src/storage/storage.ts +1 -1
  119. package/src/test/fixtures.ts +1 -3
  120. package/src/user/user.fixture.ts +3 -11
  121. package/src/user/user.test.ts +7 -7
  122. package/src/user/user.ts +6 -7
  123. package/dist/authentication/authenticate.test.d.ts +0 -2
  124. package/dist/authentication/authenticate.test.d.ts.map +0 -1
  125. package/dist/authentication/authenticate.test.js +0 -111
  126. package/dist/authentication/authenticate.test.js.map +0 -1
  127. package/dist/connection/connection.test.d.ts +0 -2
  128. package/dist/connection/connection.test.d.ts.map +0 -1
  129. package/dist/connection/connection.test.js +0 -35
  130. package/dist/connection/connection.test.js.map +0 -1
  131. package/dist/email/email.test.d.ts +0 -2
  132. package/dist/email/email.test.d.ts.map +0 -1
  133. package/dist/email/email.test.js +0 -99
  134. package/dist/email/email.test.js.map +0 -1
  135. package/dist/event/event.node.test.d.ts +0 -2
  136. package/dist/event/event.node.test.d.ts.map +0 -1
  137. package/dist/event/event.node.test.js +0 -13
  138. package/dist/event/event.node.test.js.map +0 -1
  139. package/dist/event/event.test.d.ts +0 -2
  140. package/dist/event/event.test.d.ts.map +0 -1
  141. package/dist/event/event.test.js +0 -30
  142. package/dist/event/event.test.js.map +0 -1
  143. package/dist/logging/eventLogger.test.d.ts +0 -2
  144. package/dist/logging/eventLogger.test.d.ts.map +0 -1
  145. package/dist/logging/eventLogger.test.js +0 -67
  146. package/dist/logging/eventLogger.test.js.map +0 -1
  147. package/dist/registration/register.test.d.ts +0 -2
  148. package/dist/registration/register.test.d.ts.map +0 -1
  149. package/dist/registration/register.test.js +0 -104
  150. package/dist/registration/register.test.js.map +0 -1
  151. package/dist/social/social.test.d.ts +0 -2
  152. package/dist/social/social.test.d.ts.map +0 -1
  153. package/dist/social/social.test.js +0 -110
  154. package/dist/social/social.test.js.map +0 -1
  155. package/dist/storage/storage.test.d.ts +0 -2
  156. package/dist/storage/storage.test.d.ts.map +0 -1
  157. package/dist/storage/storage.test.js +0 -120
  158. package/dist/storage/storage.test.js.map +0 -1
  159. package/dist/user/user.test.d.ts +0 -2
  160. package/dist/user/user.test.d.ts.map +0 -1
  161. package/dist/user/user.test.js +0 -56
  162. package/dist/user/user.test.js.map +0 -1
@@ -1,7 +1,6 @@
1
- import { PreConnectRes } from '@passlock/shared/dist/rpc/connection.js'
2
- import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js'
3
1
  import * as Shared from '@passlock/shared/dist/rpc/social.js'
4
- import { Effect as E, Layer as L, Option as O } from 'effect'
2
+ import { SocialClient } from '@passlock/shared/dist/rpc/social.js'
3
+ import { Effect as E, Layer as L } from 'effect'
5
4
  import * as Fixtures from '../test/fixtures.js'
6
5
  import type { AuthenticateOidcReq, RegisterOidcReq } from './social.js'
7
6
 
@@ -27,8 +26,8 @@ export const authOidcReq: AuthenticateOidcReq = {
27
26
 
28
27
  export const rpcRegisterReq = new Shared.RegisterOidcReq({
29
28
  ...registerOidcReq,
30
- givenName: O.fromNullable(registerOidcReq.givenName),
31
- familyName: O.fromNullable(registerOidcReq.familyName)
29
+ ...(registerOidcReq.givenName ? { givenName: registerOidcReq.givenName } : {}),
30
+ ...(registerOidcReq.familyName ? { familyName: registerOidcReq.familyName } : {})
32
31
  })
33
32
 
34
33
  export const rpcRegisterRes = new Shared.PrincipalRes({ principal: Fixtures.principal })
@@ -38,19 +37,11 @@ export const rpcAuthenticateReq = new Shared.AuthOidcReq({ ...authOidcReq })
38
37
  export const rpcAuthenticateRes = new Shared.PrincipalRes({ principal: Fixtures.principal })
39
38
 
40
39
  export const rpcClientTest = L.succeed(
41
- RpcClient,
42
- RpcClient.of({
43
- preConnect: () => E.succeed(new PreConnectRes({ warmed: true })),
44
- isExistingUser: () => E.fail(Fixtures.notImplemented),
45
- verifyEmail: () => E.fail(Fixtures.notImplemented),
46
- getRegistrationOptions: () => E.fail(Fixtures.notImplemented),
47
- verifyRegistrationCredential: () => E.fail(Fixtures.notImplemented),
48
- getAuthenticationOptions: () => E.fail(Fixtures.notImplemented),
49
- verifyAuthenticationCredential: () => E.fail(Fixtures.notImplemented),
40
+ SocialClient,
41
+ SocialClient.of({
50
42
  registerOidc: () => E.fail(Fixtures.notImplemented),
51
43
  authenticateOidc: () => E.fail(Fixtures.notImplemented),
52
- resendVerificationEmail: () => E.fail(Fixtures.notImplemented),
53
- }),
44
+ })
54
45
  )
55
46
 
56
47
  export const principal = Fixtures.principal
@@ -1,5 +1,5 @@
1
1
  import { Duplicate, NotFound } from '@passlock/shared/dist/error/error.js'
2
- import { RpcClient, type RouterOps } from '@passlock/shared/dist/rpc/rpc.js'
2
+ import { SocialClient } from '@passlock/shared/dist/rpc/social.js'
3
3
  import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect'
4
4
  import { describe, expect, test } from 'vitest'
5
5
  import { mock } from 'vitest-mock-extended'
@@ -15,9 +15,9 @@ describe('registerOidc should', () => {
15
15
  })
16
16
 
17
17
  const rpcClientTest = L.effect(
18
- RpcClient,
18
+ SocialClient,
19
19
  E.sync(() => {
20
- const rpcMock = mock<RouterOps>()
20
+ const rpcMock = mock<SocialClient['Type']>()
21
21
 
22
22
  rpcMock.registerOidc.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
23
23
 
@@ -41,14 +41,14 @@ describe('registerOidc should', () => {
41
41
  const service = yield* _(SocialService)
42
42
  yield* _(service.registerOidc(Fixture.registerOidcReq))
43
43
 
44
- const rpcClient = yield* _(RpcClient)
44
+ const rpcClient = yield* _(SocialClient)
45
45
  expect(rpcClient.registerOidc).toHaveBeenCalledWith(Fixture.rpcRegisterReq)
46
46
  })
47
47
 
48
48
  const rpcClientTest = L.effect(
49
- RpcClient,
49
+ SocialClient,
50
50
  E.sync(() => {
51
- const rpcMock = mock<RouterOps>()
51
+ const rpcMock = mock<SocialClient['Type']>()
52
52
 
53
53
  rpcMock.registerOidc.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
54
54
 
@@ -77,9 +77,9 @@ describe('registerOidc should', () => {
77
77
  })
78
78
 
79
79
  const rpcClientTest = L.effect(
80
- RpcClient,
80
+ SocialClient,
81
81
  E.sync(() => {
82
- const rpcMock = mock<RouterOps>()
82
+ const rpcMock = mock<SocialClient['Type']>()
83
83
 
84
84
  rpcMock.registerOidc.mockReturnValue(E.fail(new Duplicate({ message: "Duplicate user" })))
85
85
 
@@ -108,9 +108,9 @@ describe('authenticateIodc should', () => {
108
108
  })
109
109
 
110
110
  const rpcClientTest = L.effect(
111
- RpcClient,
111
+ SocialClient,
112
112
  E.sync(() => {
113
- const rpcMock = mock<RouterOps>()
113
+ const rpcMock = mock<SocialClient['Type']>()
114
114
 
115
115
  rpcMock.authenticateOidc.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
116
116
 
@@ -134,14 +134,14 @@ describe('authenticateIodc should', () => {
134
134
  const service = yield* _(SocialService)
135
135
  yield* _(service.authenticateOidc(Fixture.authOidcReq))
136
136
 
137
- const rpcClient = yield* _(RpcClient)
137
+ const rpcClient = yield* _(SocialClient)
138
138
  expect(rpcClient.authenticateOidc).toHaveBeenCalledWith(Fixture.rpcAuthenticateReq)
139
139
  })
140
140
 
141
141
  const rpcClientTest = L.effect(
142
- RpcClient,
142
+ SocialClient,
143
143
  E.sync(() => {
144
- const rpcMock = mock<RouterOps>()
144
+ const rpcMock = mock<SocialClient['Type']>()
145
145
 
146
146
  rpcMock.authenticateOidc.mockReturnValue(E.succeed(Fixture.rpcAuthenticateRes))
147
147
 
@@ -170,9 +170,9 @@ describe('authenticateIodc should', () => {
170
170
  })
171
171
 
172
172
  const rpcClientTest = L.effect(
173
- RpcClient,
173
+ SocialClient,
174
174
  E.sync(() => {
175
- const rpcMock = mock<RouterOps>()
175
+ const rpcMock = mock<SocialClient['Type']>()
176
176
 
177
177
  rpcMock.authenticateOidc.mockReturnValue(E.fail(new NotFound({ message: "User not found" })))
178
178
 
@@ -5,12 +5,12 @@ import {
5
5
  type BadRequest,
6
6
  type NotSupported
7
7
  } from '@passlock/shared/dist/error/error.js'
8
- import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js'
9
8
  import * as Shared from '@passlock/shared/dist/rpc/social.js'
9
+ import { SocialClient } from '@passlock/shared/dist/rpc/social.js'
10
10
  import type {
11
11
  Principal
12
- } from '@passlock/shared/dist/schema/schema.js'
13
- import { Context, Effect as E, Layer, Option as O, flow } from 'effect'
12
+ } from '@passlock/shared/dist/schema/principal.js'
13
+ import { Context, Effect as E, Layer, flow } from 'effect'
14
14
 
15
15
  /* Requests */
16
16
 
@@ -49,7 +49,7 @@ export const SocialService = Context.GenericTag<SocialService>(
49
49
 
50
50
  /* Effects */
51
51
 
52
- type Dependencies = RpcClient
52
+ type Dependencies = SocialClient
53
53
 
54
54
  export const registerOidc = (
55
55
  request: RegisterOidcReq,
@@ -57,12 +57,12 @@ export const registerOidc = (
57
57
  return E.gen(function* (_) {
58
58
  yield* _(E.logInfo('Registering social account'))
59
59
 
60
- const rpcClient = yield* _(RpcClient)
60
+ const rpcClient = yield* _(SocialClient)
61
61
 
62
62
  const rpcRequest = new Shared.RegisterOidcReq({
63
63
  ...request,
64
- givenName: O.fromNullable(request.givenName),
65
- familyName: O.fromNullable(request.familyName),
64
+ ...(request.givenName ? { givenName: request.givenName } : {}),
65
+ ...(request.familyName ? { familyName: request.familyName } : {})
66
66
  })
67
67
 
68
68
  const { principal } = yield* _(
@@ -79,7 +79,7 @@ export const authenticateOidc = (
79
79
  return E.gen(function* (_) {
80
80
  yield* _(E.logInfo('Authenticating with social account'))
81
81
 
82
- const rpcClient = yield* _(RpcClient)
82
+ const rpcClient = yield* _(SocialClient)
83
83
  const rpcRequest = new Shared.AuthOidcReq(request)
84
84
 
85
85
  const { principal } = yield* _(
@@ -96,7 +96,7 @@ export const authenticateOidc = (
96
96
  export const SocialServiceLive = Layer.effect(
97
97
  SocialService,
98
98
  E.gen(function* (_) {
99
- const context = yield* _(E.context<RpcClient>())
99
+ const context = yield* _(E.context<SocialClient>())
100
100
 
101
101
  return SocialService.of({
102
102
  registerOidc: flow(registerOidc, E.provide(context)),
@@ -2,7 +2,7 @@
2
2
  * Wrapper around local storage that allows us to store
3
3
  * authentication tokens in local storage for a short period.
4
4
  */
5
- import type { Principal } from '@passlock/shared/dist/schema/schema.js'
5
+ import type { Principal } from '@passlock/shared/dist/schema/principal.js'
6
6
  import { Context, Effect as E, Layer, Option as O, flow, pipe } from 'effect'
7
7
  import type { NoSuchElementException } from 'effect/Cause'
8
8
 
@@ -1,6 +1,5 @@
1
1
  import { BadRequest } from '@passlock/shared/dist/error/error.js'
2
- import { PreConnectRes } from '@passlock/shared/dist/rpc/connection.js'
3
- import type { Principal } from '@passlock/shared/dist/schema/schema.js'
2
+ import type { Principal } from '@passlock/shared/dist/schema/principal.js'
4
3
  import { Effect as E, Layer as L } from 'effect'
5
4
  import { Capabilities } from '../capabilities/capabilities.js'
6
5
  import { StorageService, type StoredToken } from '../storage/storage.js'
@@ -51,5 +50,4 @@ export const storageServiceTest = L.succeed(
51
50
  }),
52
51
  )
53
52
 
54
- export const preConnectRes = new PreConnectRes({ warmed: true })
55
53
  export const notImplemented = new BadRequest({ message: 'Not implemented' })
@@ -1,5 +1,4 @@
1
- import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js'
2
- import { IsExistingUserReq, IsExistingUserRes, ResendEmailReq, ResendEmailRes, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js'
1
+ import { IsExistingUserReq, IsExistingUserRes, ResendEmailReq, ResendEmailRes, UserClient, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js'
3
2
  import { Effect as E, Layer as L } from 'effect'
4
3
  import * as Fixtures from '../test/fixtures.js'
5
4
  import type { ResendEmail } from './user.js'
@@ -13,17 +12,10 @@ export const rpcResendEmailReq = new ResendEmailReq({ userId: '123', verifyEmail
13
12
  export const rpcResendEmailRes = new ResendEmailRes({ })
14
13
 
15
14
  export const rpcClientTest = L.succeed(
16
- RpcClient,
17
- RpcClient.of({
18
- preConnect: () => E.succeed({ warmed: true }),
15
+ UserClient,
16
+ UserClient.of({
19
17
  isExistingUser: () => E.succeed({ existingUser: true }),
20
18
  verifyEmail: () => E.succeed(verifyEmailRes),
21
- getRegistrationOptions: () => E.fail(Fixtures.notImplemented),
22
- verifyRegistrationCredential: () => E.fail(Fixtures.notImplemented),
23
- getAuthenticationOptions: () => E.fail(Fixtures.notImplemented),
24
- verifyAuthenticationCredential: () => E.fail(Fixtures.notImplemented),
25
- registerOidc: () => E.fail(Fixtures.notImplemented),
26
- authenticateOidc: () => E.fail(Fixtures.notImplemented),
27
19
  resendVerificationEmail: () => E.fail(Fixtures.notImplemented),
28
20
  }),
29
21
  )
@@ -1,4 +1,4 @@
1
- import { RpcClient, type RouterOps } from '@passlock/shared/dist/rpc/rpc.js'
1
+ import { UserClient } from '@passlock/shared/dist/rpc/user.js'
2
2
  import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect'
3
3
  import { describe, expect, test } from 'vitest'
4
4
  import { mock } from 'vitest-mock-extended'
@@ -27,14 +27,14 @@ describe('isExistingUser should', () => {
27
27
  const result = yield* _(service.isExistingUser({ email: Fixture.email }))
28
28
 
29
29
  expect(result).toBe(false)
30
- const rpcClient = yield* _(RpcClient)
30
+ const rpcClient = yield* _(UserClient)
31
31
  expect(rpcClient.isExistingUser).toBeCalledWith(Fixture.isRegisteredReq)
32
32
  })
33
33
 
34
34
  const rpcClientTest = Layer.effect(
35
- RpcClient,
35
+ UserClient,
36
36
  E.sync(() => {
37
- const rpcMock = mock<RouterOps>()
37
+ const rpcMock = mock<UserClient['Type']>()
38
38
 
39
39
  rpcMock.isExistingUser.mockReturnValue(E.succeed(Fixture.isRegisteredRes))
40
40
 
@@ -57,14 +57,14 @@ describe('resendVerificationEmail should', () => {
57
57
  const service = yield* _(UserService)
58
58
  yield* _(service.resendVerificationEmail(Fixture.resendEmailReq))
59
59
 
60
- const rpcClient = yield* _(RpcClient)
60
+ const rpcClient = yield* _(UserClient)
61
61
  expect(rpcClient.resendVerificationEmail).toBeCalledWith(Fixture.rpcResendEmailReq)
62
62
  })
63
63
 
64
64
  const rpcClientTest = Layer.effect(
65
- RpcClient,
65
+ UserClient,
66
66
  E.sync(() => {
67
- const rpcMock = mock<RouterOps>()
67
+ const rpcMock = mock<UserClient['Type']>()
68
68
 
69
69
  rpcMock.resendVerificationEmail.mockReturnValue(E.succeed(Fixture.rpcResendEmailRes))
70
70
 
package/src/user/user.ts CHANGED
@@ -2,9 +2,8 @@
2
2
  * Check for an existing user
3
3
  */
4
4
  import type { BadRequest, Disabled, NotFound } from '@passlock/shared/dist/error/error.js'
5
- import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js'
6
- import { IsExistingUserReq, ResendEmailReq } from '@passlock/shared/dist/rpc/user.js'
7
- import type { VerifyEmail } from '@passlock/shared/dist/schema/schema.js'
5
+ import { IsExistingUserReq, ResendEmailReq, UserClient } from '@passlock/shared/dist/rpc/user.js'
6
+ import type { VerifyEmail } from '@passlock/shared/dist/schema/email.js'
8
7
  import { Context, Effect as E, Layer, flow } from 'effect'
9
8
 
10
9
  /* Requests */
@@ -27,12 +26,12 @@ export const UserService = Context.GenericTag<UserService>('@services/UserServic
27
26
 
28
27
  /* Effects */
29
28
 
30
- type Dependencies = RpcClient
29
+ type Dependencies = UserClient
31
30
 
32
31
  export const isExistingUser = (request: Email): E.Effect<boolean, BadRequest, Dependencies> => {
33
32
  return E.gen(function* (_) {
34
33
  yield* _(E.logInfo('Checking registration status'))
35
- const rpcClient = yield* _(RpcClient)
34
+ const rpcClient = yield* _(UserClient)
36
35
 
37
36
  yield* _(E.logDebug('Making RPC request'))
38
37
  const { existingUser } = yield* _(rpcClient.isExistingUser(new IsExistingUserReq(request)))
@@ -44,7 +43,7 @@ export const isExistingUser = (request: Email): E.Effect<boolean, BadRequest, De
44
43
  export const resendVerificationEmail = (request: ResendEmail): E.Effect<void, ResendEmailErrors, Dependencies> => {
45
44
  return E.gen(function* (_) {
46
45
  yield* _(E.logInfo('Resending verification email'))
47
- const rpcClient = yield* _(RpcClient)
46
+ const rpcClient = yield* _(UserClient)
48
47
 
49
48
  yield* _(E.logDebug('Making RPC request'))
50
49
  const { userId, ...verifyEmail } = request
@@ -58,7 +57,7 @@ export const resendVerificationEmail = (request: ResendEmail): E.Effect<void, Re
58
57
  export const UserServiceLive = Layer.effect(
59
58
  UserService,
60
59
  E.gen(function* (_) {
61
- const context = yield* _(E.context<RpcClient>())
60
+ const context = yield* _(E.context<UserClient>())
62
61
  return UserService.of({
63
62
  isExistingUser: flow(isExistingUser, E.provide(context)),
64
63
  resendVerificationEmail: flow(resendVerificationEmail, E.provide(context))
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=authenticate.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authenticate.test.d.ts","sourceRoot":"","sources":["../../src/authentication/authenticate.test.ts"],"names":[],"mappings":""}
@@ -1,111 +0,0 @@
1
- import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js';
2
- import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect';
3
- import { describe, expect, test, vi } from 'vitest';
4
- import { mock } from 'vitest-mock-extended';
5
- import { StorageService } from '../storage/storage.js';
6
- import * as Fixture from './authenticate.fixture.js';
7
- import { AuthenticateServiceLive, AuthenticationService, GetCredential } from './authenticate.js';
8
- describe('authenticate should', () => {
9
- test('return a valid principal', async () => {
10
- const assertions = E.gen(function* (_) {
11
- const service = yield* _(AuthenticationService);
12
- const result = yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
13
- expect(result).toEqual(Fixture.principal);
14
- });
15
- const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.storageServiceTest), L.provide(Fixture.rpcClientTest));
16
- const effect = pipe(E.provide(assertions, service), Logger.withMinimumLogLevel(LogLevel.None));
17
- return E.runPromise(effect);
18
- });
19
- test('pass the authentication request to the backend', async () => {
20
- const assertions = E.gen(function* (_) {
21
- const service = yield* _(AuthenticationService);
22
- yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
23
- const rpcClient = yield* _(RpcClient);
24
- expect(rpcClient.getAuthenticationOptions).toHaveBeenCalledOnce();
25
- expect(rpcClient.verifyAuthenticationCredential).toHaveBeenCalledOnce();
26
- });
27
- const rpcClientTest = L.effect(RpcClient, E.sync(() => {
28
- const rpcMock = mock();
29
- rpcMock.getAuthenticationOptions.mockReturnValue(E.succeed(Fixture.rpcOptionsRes));
30
- rpcMock.verifyAuthenticationCredential.mockReturnValue(E.succeed(Fixture.rpcVerificationRes));
31
- return rpcMock;
32
- }));
33
- const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.storageServiceTest), L.provide(rpcClientTest));
34
- const layers = Layer.merge(service, rpcClientTest);
35
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
36
- return E.runPromise(effect);
37
- });
38
- test('send the credential to the backend', async () => {
39
- const assertions = E.gen(function* (_) {
40
- const service = yield* _(AuthenticationService);
41
- yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
42
- const rpcClient = yield* _(RpcClient);
43
- expect(rpcClient.getAuthenticationOptions).toHaveBeenCalledOnce();
44
- expect(rpcClient.verifyAuthenticationCredential).toHaveBeenCalledWith(Fixture.rpcVerificationReq);
45
- });
46
- const rpcClientTest = L.effect(RpcClient, E.sync(() => {
47
- const rpcMock = mock();
48
- rpcMock.getAuthenticationOptions.mockReturnValue(E.succeed(Fixture.rpcOptionsRes));
49
- rpcMock.verifyAuthenticationCredential.mockReturnValue(E.succeed(Fixture.rpcVerificationRes));
50
- return rpcMock;
51
- }));
52
- const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.storageServiceTest), L.provide(rpcClientTest));
53
- const layers = Layer.merge(service, rpcClientTest);
54
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
55
- return E.runPromise(effect);
56
- });
57
- test('store the credential in local storage', async () => {
58
- const assertions = E.gen(function* (_) {
59
- const service = yield* _(AuthenticationService);
60
- yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
61
- const storageService = yield* _(StorageService);
62
- expect(storageService.storeToken).toHaveBeenCalledWith(Fixture.principal);
63
- });
64
- const storageServiceTest = L.effect(StorageService, E.sync(() => {
65
- const storageMock = mock();
66
- storageMock.storeToken.mockReturnValue(E.void);
67
- storageMock.clearExpiredToken.mockReturnValue(E.void);
68
- return storageMock;
69
- }));
70
- const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.rpcClientTest), L.provide(storageServiceTest));
71
- const layers = Layer.merge(service, storageServiceTest);
72
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
73
- return E.runPromise(effect);
74
- });
75
- test('schedule deletion of the local token', async () => {
76
- const assertions = E.gen(function* (_) {
77
- const service = yield* _(AuthenticationService);
78
- yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
79
- const storageService = yield* _(StorageService);
80
- expect(storageService.clearExpiredToken).toHaveBeenCalledWith('passkey');
81
- });
82
- const storageServiceTest = L.effect(StorageService, E.sync(() => {
83
- const storageMock = mock();
84
- storageMock.storeToken.mockReturnValue(E.void);
85
- storageMock.clearExpiredToken.mockReturnValue(E.void);
86
- return storageMock;
87
- }));
88
- const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.rpcClientTest), L.provide(storageServiceTest));
89
- const layers = Layer.merge(service, storageServiceTest);
90
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
91
- return E.runPromise(effect);
92
- });
93
- test("return an error if the browser can't create a credential", async () => {
94
- const assertions = E.gen(function* (_) {
95
- const service = yield* _(AuthenticationService);
96
- yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
97
- const getCredential = yield* _(GetCredential);
98
- expect(getCredential).toHaveBeenCalledOnce();
99
- });
100
- const getCredentialTest = L.effect(GetCredential, E.sync(() => {
101
- const getCredentialMock = vi.fn();
102
- getCredentialMock.mockReturnValue(E.succeed(Fixture.credential));
103
- return getCredentialMock;
104
- }));
105
- const service = pipe(AuthenticateServiceLive, L.provide(Fixture.storageServiceTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.rpcClientTest), L.provide(getCredentialTest));
106
- const layers = Layer.merge(service, getCredentialTest);
107
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
108
- return E.runPromise(effect);
109
- });
110
- });
111
- //# sourceMappingURL=authenticate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authenticate.test.js","sourceRoot":"","sources":["../../src/authentication/authenticate.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=connection.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection.test.d.ts","sourceRoot":"","sources":["../../src/connection/connection.test.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- import { RpcConfig } from '@passlock/shared/dist/rpc/config.js';
2
- import { Dispatcher, RpcClient } from '@passlock/shared/dist/rpc/rpc.js';
3
- import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect';
4
- import { describe, expect, test } from 'vitest';
5
- import { mock } from 'vitest-mock-extended';
6
- import * as Fixture from './connection.fixture.js';
7
- import { ConnectionService, ConnectionServiceLive } from './connection.js';
8
- describe('preConnect should', () => {
9
- test('hit the rpc endpoint', async () => {
10
- const assertions = E.gen(function* (_) {
11
- const service = yield* _(ConnectionService);
12
- yield* _(service.preConnect());
13
- const rpcClient = yield* _(RpcClient);
14
- expect(rpcClient.preConnect).toBeCalledWith(Fixture.preConnectReq);
15
- const dispatcher = yield* _(Dispatcher);
16
- expect(dispatcher.get).toBeCalledWith(`/token/token?warm=true`);
17
- });
18
- const rpcClientTest = Layer.effect(RpcClient, E.sync(() => {
19
- const rpcMock = mock();
20
- rpcMock.preConnect.mockReturnValue(E.succeed(Fixture.preConnectRes));
21
- return rpcMock;
22
- }));
23
- const rpcConfigTest = Layer.succeed(RpcConfig, RpcConfig.of(Fixture.rpcConfig));
24
- const dispatcherTest = Layer.effect(Dispatcher, E.sync(() => {
25
- const dispatcherMock = mock();
26
- dispatcherMock.get.mockReturnValue(E.succeed({}));
27
- return dispatcherMock;
28
- }));
29
- const service = pipe(ConnectionServiceLive, L.provide(rpcClientTest), L.provide(dispatcherTest), L.provide(rpcConfigTest));
30
- const layers = L.mergeAll(service, rpcClientTest, dispatcherTest);
31
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
32
- return E.runPromise(effect);
33
- });
34
- });
35
- //# sourceMappingURL=connection.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection.test.js","sourceRoot":"","sources":["../../src/connection/connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAkB,MAAM,kCAAkC,CAAA;AACxF,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAE1E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;YAC3C,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;YAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACrC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;YAElE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;YACvC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAChC,SAAS,EACT,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,EAAa,CAAA;YAEjC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;YAEpE,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC,CACH,CAAA;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;QAE/E,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CACjC,UAAU,EACV,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,MAAM,cAAc,GAAG,IAAI,EAAsB,CAAA;YAEjD,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;YAEjD,OAAO,cAAc,CAAA;QACvB,CAAC,CAAC,CACH,CAAA;QAED,MAAM,OAAO,GAAG,IAAI,CAClB,qBAAqB,EACrB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EACxB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAE7F,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=email.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email.test.d.ts","sourceRoot":"","sources":["../../src/email/email.test.ts"],"names":[],"mappings":""}
@@ -1,99 +0,0 @@
1
- import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js';
2
- import { Effect as E, Layer as L, LogLevel, Logger, pipe } from 'effect';
3
- import { NoSuchElementException } from 'effect/Cause';
4
- import { describe, expect, test } from 'vitest';
5
- import { mock } from 'vitest-mock-extended';
6
- import { AuthenticationService } from '../authentication/authenticate.js';
7
- import { StorageService } from '../storage/storage.js';
8
- import * as Fixture from './email.fixture.js';
9
- import { EmailService, EmailServiceLive } from './email.js';
10
- describe('verifyEmailCode should', () => {
11
- test('return a principal when the verification is successful', async () => {
12
- const assertions = E.gen(function* (_) {
13
- const service = yield* _(EmailService);
14
- const result = yield* _(service.verifyEmailCode({ code: '123' }));
15
- expect(result).toEqual(Fixture.principal);
16
- });
17
- const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.authenticationServiceTest), L.provide(Fixture.storageServiceTest), L.provide(Fixture.rpcClientTest));
18
- const effect = pipe(E.provide(assertions, service), Logger.withMinimumLogLevel(LogLevel.None));
19
- return E.runPromise(effect);
20
- });
21
- test('check for a token in local storage', async () => {
22
- const assertions = E.gen(function* (_) {
23
- const service = yield* _(EmailService);
24
- yield* _(service.verifyEmailCode({ code: '123' }));
25
- const storageService = yield* _(StorageService);
26
- expect(storageService.getToken).toHaveBeenCalledWith('passkey');
27
- });
28
- const storageServiceTest = L.effect(StorageService, E.sync(() => {
29
- const storageServiceMock = mock();
30
- storageServiceMock.getToken.mockReturnValue(E.succeed(Fixture.storedToken));
31
- storageServiceMock.clearToken.mockReturnValue(E.void);
32
- return storageServiceMock;
33
- }));
34
- const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.authenticationServiceTest), L.provide(storageServiceTest), L.provide(Fixture.rpcClientTest));
35
- const layers = L.merge(service, storageServiceTest);
36
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
37
- return E.runPromise(effect);
38
- });
39
- test('re-authenticate the user if no local token', async () => {
40
- const assertions = E.gen(function* (_) {
41
- const service = yield* _(EmailService);
42
- yield* _(service.verifyEmailCode({ code: '123' }));
43
- const authService = yield* _(AuthenticationService);
44
- expect(authService.authenticatePasskey).toHaveBeenCalled();
45
- });
46
- const storageServiceTest = L.effect(StorageService, E.sync(() => {
47
- const storageServiceMock = mock();
48
- storageServiceMock.getToken.mockReturnValue(E.fail(new NoSuchElementException()));
49
- storageServiceMock.clearToken.mockReturnValue(E.void);
50
- return storageServiceMock;
51
- }));
52
- const authServiceTest = L.effect(AuthenticationService, E.sync(() => {
53
- const authServiceMock = mock();
54
- authServiceMock.authenticatePasskey.mockReturnValue(E.succeed(Fixture.principal));
55
- return authServiceMock;
56
- }));
57
- const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(authServiceTest), L.provide(storageServiceTest), L.provide(Fixture.rpcClientTest));
58
- const layers = L.mergeAll(service, storageServiceTest, authServiceTest);
59
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
60
- return E.runPromise(effect);
61
- });
62
- test('call the backend', async () => {
63
- const assertions = E.gen(function* (_) {
64
- const service = yield* _(EmailService);
65
- yield* _(service.verifyEmailCode({ code: Fixture.code }));
66
- const rpcClient = yield* _(RpcClient);
67
- expect(rpcClient.verifyEmail).toHaveBeenCalledWith(Fixture.rpcVerifyEmailReq);
68
- });
69
- const rpcClientTest = L.effect(RpcClient, E.sync(() => {
70
- const rpcMock = mock();
71
- rpcMock.verifyEmail.mockReturnValue(E.succeed(Fixture.rpcVerifyEmailRes));
72
- return rpcMock;
73
- }));
74
- const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.authenticationServiceTest), L.provide(Fixture.storageServiceTest), L.provide(rpcClientTest));
75
- const layers = L.merge(service, rpcClientTest);
76
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
77
- return E.runPromise(effect);
78
- });
79
- });
80
- describe('verifyEmailLink should', () => {
81
- test('extract the code from the current url', async () => {
82
- const assertions = E.gen(function* (_) {
83
- const service = yield* _(EmailService);
84
- yield* _(service.verifyEmailLink());
85
- const rpcClient = yield* _(RpcClient);
86
- expect(rpcClient.verifyEmail).toBeCalledWith(Fixture.rpcVerifyEmailReq);
87
- });
88
- const rpcClientTest = L.effect(RpcClient, E.sync(() => {
89
- const rpcMock = mock();
90
- rpcMock.verifyEmail.mockReturnValue(E.succeed(Fixture.rpcVerifyEmailRes));
91
- return rpcMock;
92
- }));
93
- const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.storageServiceTest), L.provide(Fixture.authenticationServiceTest), L.provide(rpcClientTest));
94
- const layers = L.merge(service, rpcClientTest);
95
- const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
96
- return E.runPromise(effect);
97
- });
98
- });
99
- //# sourceMappingURL=email.test.js.map