@passlock/client 0.9.29 → 0.9.32
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.
- package/README.md +1 -1
- package/README.template.md +1 -1
- package/dist/authentication/authenticate.d.ts +5 -6
- package/dist/authentication/authenticate.fixture.d.ts +15 -15
- package/dist/authentication/authenticate.fixture.js +8 -8
- package/dist/authentication/authenticate.fixture.js.map +1 -1
- package/dist/authentication/authenticate.js +4 -5
- package/dist/authentication/authenticate.js.map +1 -1
- package/dist/connection/connection.d.ts +3 -3
- package/dist/connection/connection.fixture.d.ts +2 -2
- package/dist/connection/connection.fixture.js +2 -2
- package/dist/connection/connection.fixture.js.map +1 -1
- package/dist/connection/connection.js +2 -2
- package/dist/connection/connection.js.map +1 -1
- package/dist/effect.js +2 -2
- package/dist/effect.js.map +1 -1
- package/dist/email/email.d.ts +7 -7
- package/dist/email/email.fixture.d.ts +10 -10
- package/dist/email/email.fixture.js +3 -3
- package/dist/email/email.fixture.js.map +1 -1
- package/dist/email/email.js +2 -2
- package/dist/email/email.js.map +1 -1
- package/dist/index.d.ts +33 -31
- package/dist/index.js +5 -12
- package/dist/index.js.map +1 -1
- package/dist/registration/register.d.ts +5 -7
- package/dist/registration/register.fixture.d.ts +14 -14
- package/dist/registration/register.fixture.js +6 -6
- package/dist/registration/register.fixture.js.map +1 -1
- package/dist/registration/register.js +5 -6
- package/dist/registration/register.js.map +1 -1
- package/dist/rpc/client.js +1 -1
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/connection.d.ts +1 -1
- package/dist/rpc/connection.js +3 -2
- package/dist/rpc/connection.js.map +1 -1
- package/dist/rpc/{authentication.d.ts → passkey/authentication.d.ts} +4 -4
- package/dist/rpc/passkey/authentication.js +17 -0
- package/dist/rpc/passkey/authentication.js.map +1 -0
- package/dist/rpc/{registration.d.ts → passkey/registration.d.ts} +3 -3
- package/dist/rpc/passkey/registration.js +17 -0
- package/dist/rpc/passkey/registration.js.map +1 -0
- package/dist/rpc/social.d.ts +1 -1
- package/dist/rpc/social.js +6 -5
- package/dist/rpc/social.js.map +1 -1
- package/dist/rpc/user.d.ts +1 -1
- package/dist/rpc/user.js +5 -4
- package/dist/rpc/user.js.map +1 -1
- package/dist/social/social.d.ts +7 -8
- package/dist/social/social.fixture.d.ts +11 -11
- package/dist/social/social.fixture.js +7 -7
- package/dist/social/social.fixture.js.map +1 -1
- package/dist/social/social.js +7 -8
- package/dist/social/social.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/user/user.d.ts +3 -3
- package/dist/user/user.fixture.d.ts +6 -6
- package/dist/user/user.fixture.js +6 -6
- package/dist/user/user.fixture.js.map +1 -1
- package/dist/user/user.js +5 -6
- package/dist/user/user.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +14 -14
- package/src/authentication/authenticate.fixture.ts +11 -11
- package/src/authentication/authenticate.test.ts +1 -1
- package/src/authentication/authenticate.ts +10 -16
- package/src/connection/connection.fixture.ts +2 -2
- package/src/connection/connection.ts +3 -3
- package/src/effect.ts +2 -2
- package/src/email/email.fixture.ts +3 -3
- package/src/email/email.ts +2 -2
- package/src/index.ts +10 -17
- package/src/registration/register.fixture.ts +11 -11
- package/src/registration/register.test.ts +1 -1
- package/src/registration/register.ts +11 -13
- package/src/rpc/client.ts +1 -1
- package/src/rpc/connection.ts +4 -2
- package/src/rpc/{authentication.ts → passkey/authentication.ts} +22 -13
- package/src/rpc/passkey/registration.ts +52 -0
- package/src/rpc/social.ts +24 -14
- package/src/rpc/user.ts +23 -12
- package/src/social/social.fixture.ts +7 -8
- package/src/social/social.test.ts +8 -8
- package/src/social/social.ts +13 -16
- package/src/user/user.fixture.ts +10 -10
- package/src/user/user.ts +7 -9
- package/dist/rpc/authentication.js +0 -16
- package/dist/rpc/authentication.js.map +0 -1
- package/dist/rpc/registration.js +0 -16
- package/dist/rpc/registration.js.map +0 -1
- package/src/rpc/registration.ts +0 -41
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { Effect as E, Layer as L, Option as O } from 'effect'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from '@passlock/shared/dist/rpc/registration.js'
|
|
4
|
+
OptionsRequest,
|
|
5
|
+
OptionsResponse,
|
|
6
|
+
VerificationRequest,
|
|
7
|
+
VerificationResponse,
|
|
8
|
+
} from '@passlock/shared/dist/rpc/passkey/registration.js'
|
|
9
9
|
import type { RegistrationCredential } from '@passlock/shared/dist/schema/passkey.js'
|
|
10
10
|
|
|
11
11
|
import * as Fixtures from '../test/fixtures.js'
|
|
12
|
-
import { RegistrationClient } from '../rpc/registration.js'
|
|
12
|
+
import { RegistrationClient } from '../rpc/passkey/registration.js'
|
|
13
13
|
import { UserService } from '../user/user.js'
|
|
14
14
|
import { CreateCredential, type RegistrationRequest } from './register.js'
|
|
15
15
|
|
|
@@ -27,9 +27,9 @@ export const registrationRequest: RegistrationRequest = {
|
|
|
27
27
|
verifyEmail: O.none(),
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
export const rpcOptionsReq = new
|
|
30
|
+
export const rpcOptionsReq = new OptionsRequest(registrationRequest)
|
|
31
31
|
|
|
32
|
-
export const registrationOptions:
|
|
32
|
+
export const registrationOptions: OptionsResponse = {
|
|
33
33
|
session,
|
|
34
34
|
publicKey: {
|
|
35
35
|
rp: {
|
|
@@ -46,7 +46,7 @@ export const registrationOptions: OptionsRes = {
|
|
|
46
46
|
},
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
export const rpcOptionsRes = new
|
|
49
|
+
export const rpcOptionsRes = new OptionsResponse(registrationOptions)
|
|
50
50
|
|
|
51
51
|
export const credential: RegistrationCredential = {
|
|
52
52
|
type: 'public-key',
|
|
@@ -60,13 +60,13 @@ export const credential: RegistrationCredential = {
|
|
|
60
60
|
clientExtensionResults: {},
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
export const rpcVerificationReq = new
|
|
63
|
+
export const rpcVerificationReq = new VerificationRequest({
|
|
64
64
|
session,
|
|
65
65
|
credential,
|
|
66
66
|
verifyEmail: O.none(),
|
|
67
67
|
})
|
|
68
68
|
|
|
69
|
-
export const rpcVerificationRes = new
|
|
69
|
+
export const rpcVerificationRes = new VerificationResponse({ principal: Fixtures.principal })
|
|
70
70
|
|
|
71
71
|
export const createCredentialTest = L.succeed(
|
|
72
72
|
CreateCredential,
|
|
@@ -5,7 +5,7 @@ import { mock } from 'vitest-mock-extended'
|
|
|
5
5
|
import { Duplicate, InternalBrowserError } from '@passlock/shared/dist/error/error.js'
|
|
6
6
|
|
|
7
7
|
import * as Fixture from './register.fixture.js'
|
|
8
|
-
import { RegistrationClient } from '../rpc/registration.js'
|
|
8
|
+
import { RegistrationClient } from '../rpc/passkey/registration.js'
|
|
9
9
|
import { CreateCredential, RegistrationService, RegistrationServiceLive } from './register.js'
|
|
10
10
|
|
|
11
11
|
describe('register should', () => {
|
|
@@ -9,19 +9,17 @@ import { Context, Effect as E, Layer, flow, pipe } from 'effect'
|
|
|
9
9
|
|
|
10
10
|
import type { Duplicate, NotSupported } from '@passlock/shared/dist/error/error.js'
|
|
11
11
|
import { InternalBrowserError } from '@passlock/shared/dist/error/error.js'
|
|
12
|
-
import
|
|
13
|
-
import { OptionsReq, VerificationReq } from '@passlock/shared/dist/rpc/registration.js'
|
|
12
|
+
import * as RPC from '../rpc/passkey/registration.js'
|
|
14
13
|
import type { RegistrationCredential } from '@passlock/shared/dist/schema/passkey.js'
|
|
15
14
|
import type { Principal } from '@passlock/shared/dist/schema/principal.js'
|
|
16
15
|
|
|
17
16
|
import { Capabilities } from '../capabilities/capabilities.js'
|
|
18
|
-
import { RegistrationClient } from '../rpc/registration.js'
|
|
19
17
|
import { StorageService } from '../storage/storage.js'
|
|
20
18
|
import type { UserService } from '../user/user.js'
|
|
21
19
|
|
|
22
20
|
/* Requests */
|
|
23
21
|
|
|
24
|
-
export type RegistrationRequest =
|
|
22
|
+
export type RegistrationRequest = RPC.OptionsRequest
|
|
25
23
|
|
|
26
24
|
/* Dependencies */
|
|
27
25
|
|
|
@@ -36,7 +34,7 @@ export class CreateCredential extends Context.Tag('@services/CreateCredential')<
|
|
|
36
34
|
|
|
37
35
|
/* Errors */
|
|
38
36
|
|
|
39
|
-
export type RegistrationErrors = NotSupported | OptionsErrors | VerificationErrors
|
|
37
|
+
export type RegistrationErrors = NotSupported | RPC.OptionsErrors | RPC.VerificationErrors
|
|
40
38
|
|
|
41
39
|
/* Service */
|
|
42
40
|
|
|
@@ -49,11 +47,11 @@ export class RegistrationService extends Context.Tag('@services/RegistrationServ
|
|
|
49
47
|
|
|
50
48
|
/* Utilities */
|
|
51
49
|
|
|
52
|
-
const fetchOptions = (request:
|
|
50
|
+
const fetchOptions = (request: RPC.OptionsRequest) => {
|
|
53
51
|
return E.gen(function* (_) {
|
|
54
52
|
yield* _(E.logDebug('Making request'))
|
|
55
53
|
|
|
56
|
-
const rpcClient = yield* _(RegistrationClient)
|
|
54
|
+
const rpcClient = yield* _(RPC.RegistrationClient)
|
|
57
55
|
const { publicKey, session } = yield* _(rpcClient.getRegistrationOptions(request))
|
|
58
56
|
|
|
59
57
|
yield* _(E.logDebug('Converting Passlock options to CredentialCreationOptions'))
|
|
@@ -76,11 +74,11 @@ const toCreationOptions = (jsonOptions: CredentialCreationOptionsJSON) => {
|
|
|
76
74
|
)
|
|
77
75
|
}
|
|
78
76
|
|
|
79
|
-
const verifyCredential = (request:
|
|
77
|
+
const verifyCredential = (request: RPC.VerificationRequest) => {
|
|
80
78
|
return E.gen(function* (_) {
|
|
81
79
|
yield* _(E.logDebug('Making request'))
|
|
82
80
|
|
|
83
|
-
const rpcClient = yield* _(RegistrationClient)
|
|
81
|
+
const rpcClient = yield* _(RPC.RegistrationClient)
|
|
84
82
|
const { principal } = yield* _(rpcClient.verifyRegistrationCredential(request))
|
|
85
83
|
|
|
86
84
|
return principal
|
|
@@ -94,7 +92,7 @@ type Dependencies =
|
|
|
94
92
|
| CreateCredential
|
|
95
93
|
| StorageService
|
|
96
94
|
| UserService
|
|
97
|
-
| RegistrationClient
|
|
95
|
+
| RPC.RegistrationClient
|
|
98
96
|
|
|
99
97
|
export const registerPasskey = (
|
|
100
98
|
request: RegistrationRequest,
|
|
@@ -105,14 +103,14 @@ export const registerPasskey = (
|
|
|
105
103
|
yield* _(capabilities.passkeySupport)
|
|
106
104
|
|
|
107
105
|
yield* _(E.logInfo('Fetching registration options from Passlock'))
|
|
108
|
-
const { options, session } = yield* fetchOptions(new
|
|
106
|
+
const { options, session } = yield* fetchOptions(new RPC.OptionsRequest(request))
|
|
109
107
|
|
|
110
108
|
yield* _(E.logInfo('Building new credential'))
|
|
111
109
|
const { createCredential } = yield* _(CreateCredential)
|
|
112
110
|
const credential = yield* _(createCredential(options))
|
|
113
111
|
|
|
114
112
|
yield* _(E.logInfo('Storing credential public key in Passlock'))
|
|
115
|
-
const verificationRequest = new
|
|
113
|
+
const verificationRequest = new RPC.VerificationRequest({
|
|
116
114
|
...request,
|
|
117
115
|
credential,
|
|
118
116
|
session,
|
|
@@ -146,7 +144,7 @@ export const RegistrationServiceLive = Layer.effect(
|
|
|
146
144
|
E.gen(function* (_) {
|
|
147
145
|
const context = yield* _(
|
|
148
146
|
E.context<
|
|
149
|
-
CreateCredential | RegistrationClient | Capabilities | StorageService | UserService
|
|
147
|
+
CreateCredential | RPC.RegistrationClient | Capabilities | StorageService | UserService
|
|
150
148
|
>(),
|
|
151
149
|
)
|
|
152
150
|
|
package/src/rpc/client.ts
CHANGED
|
@@ -62,7 +62,7 @@ export const DispatcherLive = Layer.effect(
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
const buildUrl = (_path: string) => {
|
|
65
|
-
const endpoint = maybeEndpoint || 'https://api.passlock.dev'
|
|
65
|
+
const endpoint = maybeEndpoint || 'https://api.v1.passlock.dev'
|
|
66
66
|
// drop leading /
|
|
67
67
|
const path = _path.replace(/^\//, '')
|
|
68
68
|
return `${endpoint}/${tenancyId}/${path}`
|
package/src/rpc/connection.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Context, Effect as E, Layer } from 'effect'
|
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
CONNECT_ENDPOINT,
|
|
6
|
-
|
|
6
|
+
ConnectResponse,
|
|
7
7
|
type ConnectionService,
|
|
8
8
|
} from '@passlock/shared/dist/rpc/connection.js'
|
|
9
9
|
|
|
@@ -21,10 +21,12 @@ export const ConnectionClientLive = Layer.effect(
|
|
|
21
21
|
E.gen(function* (_) {
|
|
22
22
|
const dispatcher = yield* _(Dispatcher)
|
|
23
23
|
|
|
24
|
-
const preConnectResolver = makeGetRequest(
|
|
24
|
+
const preConnectResolver = makeGetRequest(ConnectResponse, S.Never, dispatcher)
|
|
25
25
|
|
|
26
26
|
return {
|
|
27
27
|
preConnect: () => preConnectResolver(CONNECT_ENDPOINT),
|
|
28
28
|
}
|
|
29
29
|
}),
|
|
30
30
|
)
|
|
31
|
+
|
|
32
|
+
export { ConnectResponse } from '@passlock/shared/dist/rpc/connection.js'
|
|
@@ -4,40 +4,49 @@ import {
|
|
|
4
4
|
type AuthenticationService,
|
|
5
5
|
OPTIONS_ENDPOINT,
|
|
6
6
|
OptionsErrors,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
OptionsRequest,
|
|
8
|
+
OptionsResponse,
|
|
9
|
+
VERIFICATION_ENDPOINT,
|
|
10
10
|
VerificationErrors,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
} from '@passlock/shared/dist/rpc/authentication.js'
|
|
11
|
+
VerificationRequest,
|
|
12
|
+
VerificationResponse,
|
|
13
|
+
} from '@passlock/shared/dist/rpc/passkey/authentication.js'
|
|
14
14
|
|
|
15
|
-
import { Dispatcher, makePostRequest } from '
|
|
15
|
+
import { Dispatcher, makePostRequest } from '../client.js'
|
|
16
16
|
|
|
17
17
|
/* Client */
|
|
18
18
|
|
|
19
|
-
export class AuthenticationClient extends Context.Tag('@passkey/
|
|
19
|
+
export class AuthenticationClient extends Context.Tag('@passkey/authentication/client')<
|
|
20
20
|
AuthenticationClient,
|
|
21
21
|
AuthenticationService
|
|
22
|
-
>() {}
|
|
22
|
+
>() { }
|
|
23
23
|
|
|
24
24
|
export const AuthenticationClientLive = Layer.effect(
|
|
25
25
|
AuthenticationClient,
|
|
26
26
|
E.gen(function* (_) {
|
|
27
27
|
const dispatcher = yield* _(Dispatcher)
|
|
28
28
|
|
|
29
|
-
const optionsResolver = makePostRequest(
|
|
29
|
+
const optionsResolver = makePostRequest(OptionsRequest, OptionsResponse, OptionsErrors, dispatcher)
|
|
30
30
|
|
|
31
31
|
const verifyResolver = makePostRequest(
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
VerificationRequest,
|
|
33
|
+
VerificationResponse,
|
|
34
34
|
VerificationErrors,
|
|
35
35
|
dispatcher,
|
|
36
36
|
)
|
|
37
37
|
|
|
38
38
|
return {
|
|
39
39
|
getAuthenticationOptions: req => optionsResolver(OPTIONS_ENDPOINT, req),
|
|
40
|
-
verifyAuthenticationCredential: req => verifyResolver(
|
|
40
|
+
verifyAuthenticationCredential: req => verifyResolver(VERIFICATION_ENDPOINT, req),
|
|
41
41
|
}
|
|
42
42
|
}),
|
|
43
43
|
)
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
OptionsErrors,
|
|
47
|
+
OptionsRequest,
|
|
48
|
+
OptionsResponse,
|
|
49
|
+
VerificationErrors,
|
|
50
|
+
VerificationRequest,
|
|
51
|
+
VerificationResponse,
|
|
52
|
+
} from '@passlock/shared/dist/rpc/passkey/authentication.js'
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Context, Effect as E, Layer } from 'effect'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
OptionsErrors,
|
|
5
|
+
OptionsRequest,
|
|
6
|
+
OptionsResponse,
|
|
7
|
+
type RegistrationService,
|
|
8
|
+
VerificationErrors,
|
|
9
|
+
VerificationRequest,
|
|
10
|
+
VerificationResponse,
|
|
11
|
+
OPTIONS_ENDPOINT,
|
|
12
|
+
VERIFICATION_ENDPOINT
|
|
13
|
+
} from '@passlock/shared/dist/rpc/passkey/registration.js'
|
|
14
|
+
|
|
15
|
+
import { Dispatcher, makePostRequest } from '../client.js'
|
|
16
|
+
|
|
17
|
+
/* Client */
|
|
18
|
+
|
|
19
|
+
export class RegistrationClient extends Context.Tag('@passkey/register/client')<
|
|
20
|
+
RegistrationClient,
|
|
21
|
+
RegistrationService
|
|
22
|
+
>() {}
|
|
23
|
+
|
|
24
|
+
export const RegistrationClientLive = Layer.effect(
|
|
25
|
+
RegistrationClient,
|
|
26
|
+
E.gen(function* (_) {
|
|
27
|
+
const dispatcher = yield* _(Dispatcher)
|
|
28
|
+
|
|
29
|
+
const optionsResolver = makePostRequest(OptionsRequest, OptionsResponse, OptionsErrors, dispatcher)
|
|
30
|
+
|
|
31
|
+
const verifyResolver = makePostRequest(
|
|
32
|
+
VerificationRequest,
|
|
33
|
+
VerificationResponse,
|
|
34
|
+
VerificationErrors,
|
|
35
|
+
dispatcher,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
getRegistrationOptions: req => optionsResolver(OPTIONS_ENDPOINT, req),
|
|
40
|
+
verifyRegistrationCredential: req => verifyResolver(VERIFICATION_ENDPOINT, req),
|
|
41
|
+
}
|
|
42
|
+
}),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
OptionsErrors,
|
|
47
|
+
OptionsRequest,
|
|
48
|
+
OptionsResponse,
|
|
49
|
+
VerificationErrors,
|
|
50
|
+
VerificationRequest,
|
|
51
|
+
VerificationResponse,
|
|
52
|
+
} from '@passlock/shared/dist/rpc/passkey/registration.js'
|
package/src/rpc/social.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Context, Effect as E, Layer } from 'effect'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
OIDCRegistrationRequest,
|
|
5
|
+
OIDCRegistrationErrors,
|
|
6
|
+
OIDCAuthenticationRequest,
|
|
7
|
+
OIDCAuthenticationErrors,
|
|
8
|
+
OIDC_REGISTRATION_ENDPOINT,
|
|
9
|
+
OIDC_AUTHENTICATION_ENDPOINT,
|
|
10
|
+
PrincipalResponse,
|
|
11
|
+
type SocialService
|
|
10
12
|
} from '@passlock/shared/dist/rpc/social.js'
|
|
11
13
|
|
|
12
14
|
import { Dispatcher, makePostRequest } from './client.js'
|
|
@@ -24,22 +26,30 @@ export const SocialClientLive = Layer.effect(
|
|
|
24
26
|
const dispatcher = yield* _(Dispatcher)
|
|
25
27
|
|
|
26
28
|
const registerResolver = makePostRequest(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
OIDCRegistrationRequest,
|
|
30
|
+
PrincipalResponse,
|
|
31
|
+
OIDCRegistrationErrors,
|
|
30
32
|
dispatcher,
|
|
31
33
|
)
|
|
32
34
|
|
|
33
35
|
const authenticateResolver = makePostRequest(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
OIDCAuthenticationRequest,
|
|
37
|
+
PrincipalResponse,
|
|
38
|
+
OIDCAuthenticationErrors,
|
|
37
39
|
dispatcher,
|
|
38
40
|
)
|
|
39
41
|
|
|
40
42
|
return {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
oidcRegistration: req => registerResolver(OIDC_REGISTRATION_ENDPOINT, req),
|
|
44
|
+
oidcAuthentication: req => authenticateResolver(OIDC_AUTHENTICATION_ENDPOINT, req),
|
|
43
45
|
}
|
|
44
46
|
}),
|
|
45
47
|
)
|
|
48
|
+
|
|
49
|
+
export {
|
|
50
|
+
OIDCRegistrationRequest,
|
|
51
|
+
OIDCRegistrationErrors,
|
|
52
|
+
OIDCAuthenticationRequest,
|
|
53
|
+
OIDCAuthenticationErrors,
|
|
54
|
+
PrincipalResponse,
|
|
55
|
+
} from '@passlock/shared/dist/rpc/social.js'
|
package/src/rpc/user.ts
CHANGED
|
@@ -2,18 +2,18 @@ import * as S from '@effect/schema/Schema'
|
|
|
2
2
|
import { Context, Effect as E, Layer } from 'effect'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
IsExistingUserRequest,
|
|
6
|
+
IsExistingUserResponse,
|
|
7
7
|
RESEND_EMAIL_ENDPOINT,
|
|
8
8
|
ResendEmailErrors,
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
ResendEmailRequest,
|
|
10
|
+
ResendEmailResponse,
|
|
11
11
|
USER_STATUS_ENDPOINT,
|
|
12
12
|
type UserService,
|
|
13
13
|
VERIFY_EMAIL_ENDPOINT,
|
|
14
14
|
VerifyEmailErrors,
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
VerifyEmailRequest,
|
|
16
|
+
VerifyEmailResponse,
|
|
17
17
|
} from '@passlock/shared/dist/rpc/user.js'
|
|
18
18
|
|
|
19
19
|
import { Dispatcher, makePostRequest } from './client.js'
|
|
@@ -28,22 +28,22 @@ export const UserClientLive = Layer.effect(
|
|
|
28
28
|
const dispatcher = yield* _(Dispatcher)
|
|
29
29
|
|
|
30
30
|
const isExistingUserResolver = makePostRequest(
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
IsExistingUserRequest,
|
|
32
|
+
IsExistingUserResponse,
|
|
33
33
|
S.Never,
|
|
34
34
|
dispatcher,
|
|
35
35
|
)
|
|
36
36
|
|
|
37
37
|
const verifyEmailResolver = makePostRequest(
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
VerifyEmailRequest,
|
|
39
|
+
VerifyEmailResponse,
|
|
40
40
|
VerifyEmailErrors,
|
|
41
41
|
dispatcher,
|
|
42
42
|
)
|
|
43
43
|
|
|
44
44
|
const resendEmailResolver = makePostRequest(
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
ResendEmailRequest,
|
|
46
|
+
ResendEmailResponse,
|
|
47
47
|
ResendEmailErrors,
|
|
48
48
|
dispatcher,
|
|
49
49
|
)
|
|
@@ -55,3 +55,14 @@ export const UserClientLive = Layer.effect(
|
|
|
55
55
|
}
|
|
56
56
|
}),
|
|
57
57
|
)
|
|
58
|
+
|
|
59
|
+
export {
|
|
60
|
+
IsExistingUserRequest,
|
|
61
|
+
IsExistingUserResponse,
|
|
62
|
+
ResendEmailErrors,
|
|
63
|
+
ResendEmailRequest,
|
|
64
|
+
ResendEmailResponse,
|
|
65
|
+
VerifyEmailErrors,
|
|
66
|
+
VerifyEmailRequest,
|
|
67
|
+
VerifyEmailResponse,
|
|
68
|
+
} from '@passlock/shared/dist/rpc/user.js'
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { Effect as E, Layer as L, Option as O } from 'effect'
|
|
2
2
|
|
|
3
|
-
import * as Shared from '@passlock/shared/dist/rpc/social.js'
|
|
4
|
-
|
|
5
3
|
import * as Fixtures from '../test/fixtures.js'
|
|
6
4
|
import { SocialClient } from '../rpc/social.js'
|
|
7
5
|
import type { AuthenticateOidcReq } from './social.js'
|
|
6
|
+
import { OIDCAuthenticationRequest, OIDCRegistrationRequest, PrincipalResponse } from '@passlock/shared/dist/rpc/social.js'
|
|
8
7
|
|
|
9
8
|
export const session = 'session'
|
|
10
9
|
export const token = 'token'
|
|
@@ -12,7 +11,7 @@ export const code = 'code'
|
|
|
12
11
|
export const authType = 'passkey'
|
|
13
12
|
export const expireAt = Date.now() + 10000
|
|
14
13
|
|
|
15
|
-
export const registerOidcReq = new
|
|
14
|
+
export const registerOidcReq = new OIDCRegistrationRequest({
|
|
16
15
|
provider: 'google',
|
|
17
16
|
idToken: 'google-token',
|
|
18
17
|
nonce: 'nonce',
|
|
@@ -20,21 +19,21 @@ export const registerOidcReq = new Shared.RegisterOidcReq({
|
|
|
20
19
|
familyName: O.some('doe'),
|
|
21
20
|
})
|
|
22
21
|
|
|
23
|
-
export const authOidcReq: AuthenticateOidcReq = new
|
|
22
|
+
export const authOidcReq: AuthenticateOidcReq = new OIDCAuthenticationRequest({
|
|
24
23
|
provider: 'google',
|
|
25
24
|
idToken: 'google-token',
|
|
26
25
|
nonce: 'nonce',
|
|
27
26
|
})
|
|
28
27
|
|
|
29
|
-
export const rpcRegisterRes = new
|
|
28
|
+
export const rpcRegisterRes = new PrincipalResponse({ principal: Fixtures.principal })
|
|
30
29
|
|
|
31
|
-
export const rpcAuthenticateRes = new
|
|
30
|
+
export const rpcAuthenticateRes = new PrincipalResponse({ principal: Fixtures.principal })
|
|
32
31
|
|
|
33
32
|
export const rpcClientTest = L.succeed(
|
|
34
33
|
SocialClient,
|
|
35
34
|
SocialClient.of({
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
oidcRegistration: () => E.fail(Fixtures.notImplemented),
|
|
36
|
+
oidcAuthentication: () => E.fail(Fixtures.notImplemented),
|
|
38
37
|
}),
|
|
39
38
|
)
|
|
40
39
|
|
|
@@ -21,7 +21,7 @@ describe('registerOidc should', () => {
|
|
|
21
21
|
E.sync(() => {
|
|
22
22
|
const rpcMock = mock<SocialClient['Type']>()
|
|
23
23
|
|
|
24
|
-
rpcMock.
|
|
24
|
+
rpcMock.oidcRegistration.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
|
|
25
25
|
|
|
26
26
|
return rpcMock
|
|
27
27
|
}),
|
|
@@ -41,7 +41,7 @@ describe('registerOidc should', () => {
|
|
|
41
41
|
yield* _(service.registerOidc(Fixture.registerOidcReq))
|
|
42
42
|
|
|
43
43
|
const rpcClient = yield* _(SocialClient)
|
|
44
|
-
expect(rpcClient.
|
|
44
|
+
expect(rpcClient.oidcRegistration).toHaveBeenCalledWith(Fixture.registerOidcReq)
|
|
45
45
|
})
|
|
46
46
|
|
|
47
47
|
const rpcClientTest = L.effect(
|
|
@@ -49,7 +49,7 @@ describe('registerOidc should', () => {
|
|
|
49
49
|
E.sync(() => {
|
|
50
50
|
const rpcMock = mock<SocialClient['Type']>()
|
|
51
51
|
|
|
52
|
-
rpcMock.
|
|
52
|
+
rpcMock.oidcRegistration.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
|
|
53
53
|
|
|
54
54
|
return rpcMock
|
|
55
55
|
}),
|
|
@@ -77,7 +77,7 @@ describe('registerOidc should', () => {
|
|
|
77
77
|
E.sync(() => {
|
|
78
78
|
const rpcMock = mock<SocialClient['Type']>()
|
|
79
79
|
|
|
80
|
-
rpcMock.
|
|
80
|
+
rpcMock.oidcRegistration.mockReturnValue(E.fail(new Duplicate({ message: 'Duplicate user' })))
|
|
81
81
|
|
|
82
82
|
return rpcMock
|
|
83
83
|
}),
|
|
@@ -105,7 +105,7 @@ describe('authenticateIodc should', () => {
|
|
|
105
105
|
E.sync(() => {
|
|
106
106
|
const rpcMock = mock<SocialClient['Type']>()
|
|
107
107
|
|
|
108
|
-
rpcMock.
|
|
108
|
+
rpcMock.oidcAuthentication.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
|
|
109
109
|
|
|
110
110
|
return rpcMock
|
|
111
111
|
}),
|
|
@@ -125,7 +125,7 @@ describe('authenticateIodc should', () => {
|
|
|
125
125
|
yield* _(service.authenticateOidc(Fixture.authOidcReq))
|
|
126
126
|
|
|
127
127
|
const rpcClient = yield* _(SocialClient)
|
|
128
|
-
expect(rpcClient.
|
|
128
|
+
expect(rpcClient.oidcAuthentication).toHaveBeenCalledWith(Fixture.authOidcReq)
|
|
129
129
|
})
|
|
130
130
|
|
|
131
131
|
const rpcClientTest = L.effect(
|
|
@@ -133,7 +133,7 @@ describe('authenticateIodc should', () => {
|
|
|
133
133
|
E.sync(() => {
|
|
134
134
|
const rpcMock = mock<SocialClient['Type']>()
|
|
135
135
|
|
|
136
|
-
rpcMock.
|
|
136
|
+
rpcMock.oidcAuthentication.mockReturnValue(E.succeed(Fixture.rpcAuthenticateRes))
|
|
137
137
|
|
|
138
138
|
return rpcMock
|
|
139
139
|
}),
|
|
@@ -161,7 +161,7 @@ describe('authenticateIodc should', () => {
|
|
|
161
161
|
E.sync(() => {
|
|
162
162
|
const rpcMock = mock<SocialClient['Type']>()
|
|
163
163
|
|
|
164
|
-
rpcMock.
|
|
164
|
+
rpcMock.oidcAuthentication.mockReturnValue(
|
|
165
165
|
E.fail(new NotFound({ message: 'User not found' })),
|
|
166
166
|
)
|
|
167
167
|
|
package/src/social/social.ts
CHANGED
|
@@ -2,26 +2,23 @@
|
|
|
2
2
|
* Passkey authentication effects
|
|
3
3
|
*/
|
|
4
4
|
import { Context, Effect as E, Layer, flow } from 'effect'
|
|
5
|
-
|
|
6
|
-
import * as RPC from '@passlock/shared/dist/rpc/social.js'
|
|
5
|
+
import * as RPC from '../rpc/social.js'
|
|
7
6
|
import { type BadRequest, type NotSupported } from '@passlock/shared/dist/error/error.js'
|
|
8
7
|
import type { Principal } from '@passlock/shared/dist/schema/principal.js'
|
|
9
8
|
|
|
10
|
-
import { SocialClient } from '../rpc/social.js'
|
|
11
|
-
|
|
12
9
|
/* Requests */
|
|
13
10
|
|
|
14
11
|
export type Provider = 'apple' | 'google'
|
|
15
12
|
|
|
16
|
-
export type RegisterOidcReq = RPC.
|
|
13
|
+
export type RegisterOidcReq = RPC.OIDCRegistrationRequest
|
|
17
14
|
|
|
18
|
-
export type AuthenticateOidcReq = RPC.
|
|
15
|
+
export type AuthenticateOidcReq = RPC.OIDCAuthenticationRequest
|
|
19
16
|
|
|
20
17
|
/* Errors */
|
|
21
18
|
|
|
22
|
-
export type RegistrationErrors = NotSupported | BadRequest | RPC.
|
|
19
|
+
export type RegistrationErrors = NotSupported | BadRequest | RPC.OIDCRegistrationErrors
|
|
23
20
|
|
|
24
|
-
export type AuthenticationErrors = NotSupported | BadRequest | RPC.
|
|
21
|
+
export type AuthenticationErrors = NotSupported | BadRequest | RPC.OIDCAuthenticationErrors
|
|
25
22
|
|
|
26
23
|
/* Service */
|
|
27
24
|
|
|
@@ -35,7 +32,7 @@ export class SocialService extends Context.Tag('@services/SocialService')<
|
|
|
35
32
|
|
|
36
33
|
/* Effects */
|
|
37
34
|
|
|
38
|
-
type Dependencies = SocialClient
|
|
35
|
+
type Dependencies = RPC.SocialClient
|
|
39
36
|
|
|
40
37
|
export const registerOidc = (
|
|
41
38
|
request: RegisterOidcReq,
|
|
@@ -43,9 +40,9 @@ export const registerOidc = (
|
|
|
43
40
|
return E.gen(function* (_) {
|
|
44
41
|
yield* _(E.logInfo('Registering social account'))
|
|
45
42
|
|
|
46
|
-
const rpcClient = yield* _(SocialClient)
|
|
47
|
-
const rpcRequest = new RPC.
|
|
48
|
-
const { principal } = yield* _(rpcClient.
|
|
43
|
+
const rpcClient = yield* _(RPC.SocialClient)
|
|
44
|
+
const rpcRequest = new RPC.OIDCRegistrationRequest(request)
|
|
45
|
+
const { principal } = yield* _(rpcClient.oidcRegistration(rpcRequest))
|
|
49
46
|
|
|
50
47
|
return principal
|
|
51
48
|
})
|
|
@@ -57,9 +54,9 @@ export const authenticateOidc = (
|
|
|
57
54
|
return E.gen(function* (_) {
|
|
58
55
|
yield* _(E.logInfo('Authenticating with social account'))
|
|
59
56
|
|
|
60
|
-
const rpcClient = yield* _(SocialClient)
|
|
61
|
-
const rpcRequest = new RPC.
|
|
62
|
-
const { principal } = yield* _(rpcClient.
|
|
57
|
+
const rpcClient = yield* _(RPC.SocialClient)
|
|
58
|
+
const rpcRequest = new RPC.OIDCAuthenticationRequest(request)
|
|
59
|
+
const { principal } = yield* _(rpcClient.oidcAuthentication(rpcRequest))
|
|
63
60
|
|
|
64
61
|
return principal
|
|
65
62
|
})
|
|
@@ -71,7 +68,7 @@ export const authenticateOidc = (
|
|
|
71
68
|
export const SocialServiceLive = Layer.effect(
|
|
72
69
|
SocialService,
|
|
73
70
|
E.gen(function* (_) {
|
|
74
|
-
const context = yield* _(E.context<SocialClient>())
|
|
71
|
+
const context = yield* _(E.context<RPC.SocialClient>())
|
|
75
72
|
|
|
76
73
|
return SocialService.of({
|
|
77
74
|
registerOidc: flow(registerOidc, E.provide(context)),
|
package/src/user/user.fixture.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Effect as E, Layer as L, Option as O } from 'effect'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
IsExistingUserRequest,
|
|
5
|
+
IsExistingUserResponse,
|
|
6
|
+
ResendEmailRequest,
|
|
7
|
+
ResendEmailResponse,
|
|
8
|
+
VerifyEmailResponse,
|
|
9
9
|
} from '@passlock/shared/dist/rpc/user.js'
|
|
10
10
|
|
|
11
11
|
import * as Fixtures from '../test/fixtures.js'
|
|
@@ -13,15 +13,15 @@ import { UserClient } from '../rpc/user.js'
|
|
|
13
13
|
import type { ResendEmail } from './user.js'
|
|
14
14
|
|
|
15
15
|
export const email = 'jdoe@gmail.com'
|
|
16
|
-
export const isRegisteredReq = new
|
|
17
|
-
export const isRegisteredRes = new
|
|
18
|
-
export const verifyEmailRes = new
|
|
16
|
+
export const isRegisteredReq = new IsExistingUserRequest({ email })
|
|
17
|
+
export const isRegisteredRes = new IsExistingUserResponse({ existingUser: false, detail: O.none() })
|
|
18
|
+
export const verifyEmailRes = new VerifyEmailResponse({ principal: Fixtures.principal })
|
|
19
19
|
export const resendEmailReq: ResendEmail = { userId: '123', method: 'code' }
|
|
20
|
-
export const rpcResendEmailReq = new
|
|
20
|
+
export const rpcResendEmailReq = new ResendEmailRequest({
|
|
21
21
|
userId: '123',
|
|
22
22
|
verifyEmail: { method: 'code' },
|
|
23
23
|
})
|
|
24
|
-
export const rpcResendEmailRes = new
|
|
24
|
+
export const rpcResendEmailRes = new ResendEmailResponse({})
|
|
25
25
|
|
|
26
26
|
export const rpcClientTest = L.succeed(
|
|
27
27
|
UserClient,
|