@passlock/client 0.9.21 → 0.9.23
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 +125 -0
- package/dist/authentication/authenticate.d.ts +15 -15
- package/dist/authentication/authenticate.fixture.d.ts +20 -6
- package/dist/authentication/authenticate.fixture.js +7 -5
- package/dist/authentication/authenticate.fixture.js.map +1 -1
- package/dist/authentication/authenticate.js +19 -8
- package/dist/authentication/authenticate.js.map +1 -1
- package/dist/capabilities/capabilities.d.ts +8 -4
- package/dist/capabilities/capabilities.js +10 -1
- package/dist/capabilities/capabilities.js.map +1 -1
- package/dist/connection/connection.d.ts +11 -7
- package/dist/connection/connection.fixture.d.ts +2 -2
- package/dist/connection/connection.fixture.js +2 -1
- package/dist/connection/connection.fixture.js.map +1 -1
- package/dist/connection/connection.js +12 -3
- package/dist/connection/connection.js.map +1 -1
- package/dist/effect.d.ts +22 -45
- package/dist/effect.js +55 -51
- package/dist/effect.js.map +1 -1
- package/dist/email/email.d.ts +38 -11
- package/dist/email/email.fixture.d.ts +19 -5
- package/dist/email/email.fixture.js +4 -3
- package/dist/email/email.fixture.js.map +1 -1
- package/dist/email/email.js +43 -7
- package/dist/email/email.js.map +1 -1
- package/dist/event/event.d.ts +3 -1
- package/dist/event/event.js +3 -0
- package/dist/event/event.js.map +1 -1
- package/dist/index.d.ts +105 -27
- package/dist/index.js +101 -50
- package/dist/index.js.map +1 -1
- package/dist/logging/eventLogger.d.ts +13 -1
- package/dist/logging/eventLogger.js +13 -0
- package/dist/logging/eventLogger.js.map +1 -1
- package/dist/registration/register.d.ts +18 -21
- package/dist/registration/register.fixture.d.ts +19 -5
- package/dist/registration/register.fixture.js +14 -7
- package/dist/registration/register.fixture.js.map +1 -1
- package/dist/registration/register.js +18 -9
- package/dist/registration/register.js.map +1 -1
- package/dist/rpc/authentication.d.ts +0 -1
- package/dist/rpc/authentication.js +1 -0
- package/dist/rpc/authentication.js.map +1 -1
- package/dist/rpc/client.d.ts +4 -1
- package/dist/rpc/client.js +12 -2
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/config.d.ts +0 -1
- package/dist/rpc/connection.d.ts +0 -1
- package/dist/rpc/connection.js +1 -0
- package/dist/rpc/connection.js.map +1 -1
- package/dist/rpc/registration.d.ts +0 -1
- package/dist/rpc/registration.js +1 -0
- package/dist/rpc/registration.js.map +1 -1
- package/dist/rpc/social.d.ts +0 -1
- package/dist/rpc/social.js +1 -0
- package/dist/rpc/social.js.map +1 -1
- package/dist/rpc/user.d.ts +0 -1
- package/dist/rpc/user.js +1 -0
- package/dist/rpc/user.js.map +1 -1
- package/dist/social/social.d.ts +16 -23
- package/dist/social/social.fixture.d.ts +21 -9
- package/dist/social/social.fixture.js +8 -14
- package/dist/social/social.fixture.js.map +1 -1
- package/dist/social/social.js +14 -10
- package/dist/social/social.js.map +1 -1
- package/dist/storage/storage.d.ts +40 -12
- package/dist/storage/storage.fixture.d.ts +2 -2
- package/dist/storage/storage.fixture.js +2 -2
- package/dist/storage/storage.fixture.js.map +1 -1
- package/dist/storage/storage.js +48 -15
- package/dist/storage/storage.js.map +1 -1
- package/dist/test/fixtures.d.ts +1 -2
- package/dist/test/fixtures.js +20 -5
- package/dist/test/fixtures.js.map +1 -1
- package/dist/user/user.d.ts +8 -5
- package/dist/user/user.fixture.d.ts +2 -2
- package/dist/user/user.fixture.js +9 -5
- package/dist/user/user.fixture.js.map +1 -1
- package/dist/user/user.js +9 -3
- package/dist/user/user.js.map +1 -1
- package/dist/version.d.ts +1 -2
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +39 -33
- package/src/authentication/authenticate.fixture.ts +8 -7
- package/src/authentication/authenticate.test.ts +59 -17
- package/src/authentication/authenticate.ts +34 -32
- package/src/capabilities/capabilities.ts +9 -8
- package/src/connection/connection.fixture.ts +2 -1
- package/src/connection/connection.test.ts +3 -3
- package/src/connection/connection.ts +9 -8
- package/src/effect.ts +129 -128
- package/src/email/email.fixture.ts +4 -3
- package/src/email/email.test.ts +4 -4
- package/src/email/email.ts +24 -16
- package/src/index.ts +225 -169
- package/src/logging/eventLogger.test.ts +1 -1
- package/src/logging/eventLogger.ts +2 -2
- package/src/registration/register.fixture.ts +14 -8
- package/src/registration/register.test.ts +13 -9
- package/src/registration/register.ts +37 -34
- package/src/rpc/authentication.ts +31 -0
- package/src/rpc/client.ts +173 -0
- package/src/rpc/config.ts +18 -0
- package/src/rpc/connection.ts +24 -0
- package/src/rpc/registration.ts +31 -0
- package/src/rpc/social.ts +36 -0
- package/src/rpc/user.ts +42 -0
- package/src/social/social.fixture.ts +10 -18
- package/src/social/social.test.ts +13 -29
- package/src/social/social.ts +20 -47
- package/src/storage/storage.fixture.ts +3 -4
- package/src/storage/storage.test.ts +28 -19
- package/src/storage/storage.ts +36 -36
- package/src/test/fixtures.ts +21 -6
- package/src/user/user.fixture.ts +17 -7
- package/src/user/user.test.ts +2 -5
- package/src/user/user.ts +13 -9
- package/src/version.ts +1 -0
- package/dist/authentication/authenticate.d.ts.map +0 -1
- package/dist/authentication/authenticate.fixture.d.ts.map +0 -1
- package/dist/authentication/authenticate.test.d.ts +0 -2
- package/dist/authentication/authenticate.test.d.ts.map +0 -1
- package/dist/authentication/authenticate.test.js +0 -111
- package/dist/authentication/authenticate.test.js.map +0 -1
- package/dist/capabilities/capabilities.d.ts.map +0 -1
- package/dist/config.d.ts +0 -18
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -20
- package/dist/config.js.map +0 -1
- package/dist/connection/connection.d.ts.map +0 -1
- package/dist/connection/connection.fixture.d.ts.map +0 -1
- package/dist/connection/connection.test.d.ts +0 -2
- package/dist/connection/connection.test.d.ts.map +0 -1
- package/dist/connection/connection.test.js +0 -36
- package/dist/connection/connection.test.js.map +0 -1
- package/dist/effect.d.ts.map +0 -1
- package/dist/email/email.d.ts.map +0 -1
- package/dist/email/email.fixture.d.ts.map +0 -1
- package/dist/email/email.test.d.ts +0 -2
- package/dist/email/email.test.d.ts.map +0 -1
- package/dist/email/email.test.js +0 -99
- package/dist/email/email.test.js.map +0 -1
- package/dist/event/event.d.ts.map +0 -1
- package/dist/event/event.node.test.d.ts +0 -2
- package/dist/event/event.node.test.d.ts.map +0 -1
- package/dist/event/event.node.test.js +0 -13
- package/dist/event/event.node.test.js.map +0 -1
- package/dist/event/event.test.d.ts +0 -2
- package/dist/event/event.test.d.ts.map +0 -1
- package/dist/event/event.test.js +0 -30
- package/dist/event/event.test.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/logging/eventLogger.d.ts.map +0 -1
- package/dist/logging/eventLogger.test.d.ts +0 -2
- package/dist/logging/eventLogger.test.d.ts.map +0 -1
- package/dist/logging/eventLogger.test.js +0 -67
- package/dist/logging/eventLogger.test.js.map +0 -1
- package/dist/registration/register.d.ts.map +0 -1
- package/dist/registration/register.fixture.d.ts.map +0 -1
- package/dist/registration/register.test.d.ts +0 -2
- package/dist/registration/register.test.d.ts.map +0 -1
- package/dist/registration/register.test.js +0 -104
- package/dist/registration/register.test.js.map +0 -1
- package/dist/rpc/authentication.d.ts.map +0 -1
- package/dist/rpc/client.d.ts.map +0 -1
- package/dist/rpc/config.d.ts.map +0 -1
- package/dist/rpc/connection.d.ts.map +0 -1
- package/dist/rpc/registration.d.ts.map +0 -1
- package/dist/rpc/social.d.ts.map +0 -1
- package/dist/rpc/user.d.ts.map +0 -1
- package/dist/social/social.d.ts.map +0 -1
- package/dist/social/social.fixture.d.ts.map +0 -1
- package/dist/social/social.test.d.ts +0 -2
- package/dist/social/social.test.d.ts.map +0 -1
- package/dist/social/social.test.js +0 -110
- package/dist/social/social.test.js.map +0 -1
- package/dist/storage/storage.d.ts.map +0 -1
- package/dist/storage/storage.fixture.d.ts.map +0 -1
- package/dist/storage/storage.test.d.ts +0 -2
- package/dist/storage/storage.test.d.ts.map +0 -1
- package/dist/storage/storage.test.js +0 -120
- package/dist/storage/storage.test.js.map +0 -1
- package/dist/test/fixtures.d.ts.map +0 -1
- package/dist/user/user.d.ts.map +0 -1
- package/dist/user/user.fixture.d.ts.map +0 -1
- package/dist/user/user.test.d.ts +0 -2
- package/dist/user/user.test.d.ts.map +0 -1
- package/dist/user/user.test.js +0 -56
- package/dist/user/user.test.js.map +0 -1
- package/dist/version.d.ts.map +0 -1
- package/src/config.ts +0 -42
package/dist/effect.js
CHANGED
|
@@ -1,46 +1,52 @@
|
|
|
1
1
|
import { create, get as getCredential } from '@github/webauthn-json/browser-ponyfill';
|
|
2
|
-
import { AuthenticationClientLive } from '@passlock/shared/dist/rpc/authentication.js';
|
|
3
|
-
import { ConnectionClientLive } from '@passlock/shared/dist/rpc/connection.js';
|
|
4
|
-
import { RegistrationClientLive } from '@passlock/shared/dist/rpc/registration.js';
|
|
5
|
-
import { SocialClientLive } from '@passlock/shared/dist/rpc/social.js';
|
|
6
|
-
import { UserClientLive } from '@passlock/shared/dist/rpc/user.js';
|
|
7
2
|
import { Duplicate, InternalBrowserError, } from '@passlock/shared/dist/error/error.js';
|
|
8
|
-
import {
|
|
3
|
+
import { AuthenticationClientLive } from './rpc/authentication.js';
|
|
4
|
+
import { DispatcherLive } from './rpc/client.js';
|
|
5
|
+
import { RetrySchedule } from './rpc/config.js';
|
|
6
|
+
import { ConnectionClientLive } from './rpc/connection.js';
|
|
7
|
+
import { RegistrationClientLive } from './rpc/registration.js';
|
|
8
|
+
import { SocialClientLive } from './rpc/social.js';
|
|
9
|
+
import { UserClientLive } from './rpc/user.js';
|
|
10
|
+
import { Effect as E, Layer as L, Layer, Schedule, pipe } from 'effect';
|
|
9
11
|
import { AuthenticateServiceLive, AuthenticationService, GetCredential, } from './authentication/authenticate.js';
|
|
10
|
-
import { capabilitiesLive } from './capabilities/capabilities.js';
|
|
12
|
+
import { Capabilities, capabilitiesLive } from './capabilities/capabilities.js';
|
|
11
13
|
import { ConnectionService, ConnectionServiceLive } from './connection/connection.js';
|
|
12
|
-
import { EmailService, EmailServiceLive, URLQueryString } from './email/email.js';
|
|
14
|
+
import { EmailService, EmailServiceLive, URLQueryString, } from './email/email.js';
|
|
13
15
|
import { CreateCredential, RegistrationService, RegistrationServiceLive, } from './registration/register.js';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}), E.map(credential => credential.toJSON()))
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
16
|
+
import { SocialService, SocialServiceLive, } from './social/social.js';
|
|
17
|
+
import { BrowserStorage, StorageService, StorageServiceLive, } from './storage/storage.js';
|
|
18
|
+
import { UserService, UserServiceLive, } from './user/user.js';
|
|
19
|
+
/* Layers */
|
|
20
|
+
const createCredentialLive = L.succeed(CreateCredential, CreateCredential.of({
|
|
21
|
+
createCredential: options => pipe(E.tryPromise({
|
|
22
|
+
try: () => create(options),
|
|
23
|
+
catch: e => {
|
|
24
|
+
if (e instanceof Error && e.message.includes('excludeCredentials')) {
|
|
25
|
+
return new Duplicate({
|
|
26
|
+
message: 'Passkey already registered to this device or cloud account',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
return new InternalBrowserError({
|
|
31
|
+
message: 'Unable to create credential',
|
|
32
|
+
detail: String(e),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
}), E.map(credential => credential.toJSON())),
|
|
37
|
+
}));
|
|
38
|
+
const getCredentialLive = L.succeed(GetCredential, GetCredential.of({
|
|
39
|
+
getCredential: (options) => pipe(E.tryPromise({
|
|
40
|
+
try: () => getCredential(options),
|
|
41
|
+
catch: e => new InternalBrowserError({
|
|
42
|
+
message: 'Unable to get authentication credential',
|
|
43
|
+
detail: String(e),
|
|
44
|
+
}),
|
|
45
|
+
}), E.map(credential => credential.toJSON())),
|
|
46
|
+
}));
|
|
42
47
|
const schedule = Schedule.intersect(Schedule.recurs(3), Schedule.exponential('100 millis'));
|
|
43
48
|
const retryScheduleLive = L.succeed(RetrySchedule, RetrySchedule.of({ schedule }));
|
|
49
|
+
/* Services */
|
|
44
50
|
const dispatcherLive = pipe(DispatcherLive, L.provide(retryScheduleLive));
|
|
45
51
|
const connectClientLive = pipe(ConnectionClientLive, L.provide(dispatcherLive));
|
|
46
52
|
const registerClientLive = pipe(RegistrationClientLive, L.provide(dispatcherLive));
|
|
@@ -56,19 +62,17 @@ const urlQueryStringLive = Layer.succeed(URLQueryString, URLQueryString.of(E.syn
|
|
|
56
62
|
const emailServiceLive = pipe(EmailServiceLive, L.provide(urlQueryStringLive), L.provide(userClientLive), L.provide(capabilitiesLive), L.provide(authenticationServiceLive), L.provide(storageServiceLive));
|
|
57
63
|
const socialServiceLive = pipe(SocialServiceLive, L.provide(socialClientLive));
|
|
58
64
|
export const allRequirements = Layer.mergeAll(capabilitiesLive, userServiceLive, registrationServiceLive, authenticationServiceLive, connectionServiceLive, emailServiceLive, storageServiceLive, socialServiceLive);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
export const
|
|
66
|
-
export const
|
|
67
|
-
export const
|
|
68
|
-
export const
|
|
69
|
-
export const
|
|
70
|
-
export const
|
|
71
|
-
export const
|
|
72
|
-
export const clearExpiredTokens = () => pipe(StorageService, E.flatMap(service => service.clearExpiredTokens), E.provide(storageServiceLive), E.provide(storageLive));
|
|
73
|
-
export const authenticateOIDC = (request) => pipe(SocialService, E.flatMap(service => service.registerOidc(request)), E.provide(socialServiceLive));
|
|
65
|
+
const browserStorageLive = Layer.effect(BrowserStorage, E.sync(() => BrowserStorage.of(globalThis.localStorage)));
|
|
66
|
+
export const preConnect = () => pipe(ConnectionService, E.flatMap(service => service.preConnect()), E.provide(connectionServiceLive));
|
|
67
|
+
export const isPasskeySupport = pipe(Capabilities, E.flatMap(service => service.isPasskeySupport), E.provide(capabilitiesLive));
|
|
68
|
+
export const isExistingUser = (request) => pipe(UserService, E.flatMap(service => service.isExistingUser(request)), E.provide(userServiceLive));
|
|
69
|
+
export const registerPasskey = (request) => pipe(RegistrationService, E.flatMap(service => service.registerPasskey(request)), E.provide(registrationServiceLive), E.provide(browserStorageLive));
|
|
70
|
+
export const authenticatePasskey = (request) => pipe(AuthenticationService, E.flatMap(service => service.authenticatePasskey(request)), E.provide(authenticationServiceLive), E.provide(browserStorageLive));
|
|
71
|
+
export const verifyEmailCode = (request) => pipe(EmailService, E.flatMap(service => service.verifyEmailCode(request)), E.provide(emailServiceLive), E.provide(browserStorageLive));
|
|
72
|
+
export const verifyEmailLink = pipe(EmailService, E.flatMap(service => service.verifyEmailLink()), E.provide(emailServiceLive), E.provide(browserStorageLive));
|
|
73
|
+
export const resendVerificationEmail = (request) => pipe(UserService, E.flatMap(service => service.resendVerificationEmail(request)), E.provide(userServiceLive), E.provide(browserStorageLive));
|
|
74
|
+
export const getSessionToken = (authType) => pipe(StorageService, E.flatMap(service => service.getToken(authType)), E.provide(storageServiceLive), E.provide(browserStorageLive));
|
|
75
|
+
export const clearExpiredTokens = pipe(StorageService, E.flatMap(service => service.clearExpiredTokens), E.provide(storageServiceLive), E.provide(browserStorageLive));
|
|
76
|
+
export const registerOidc = (request) => pipe(SocialService, E.flatMap(service => service.registerOidc(request)), E.provide(socialServiceLive));
|
|
77
|
+
export const authenticateOidc = (request) => pipe(SocialService, E.flatMap(service => service.authenticateOidc(request)), E.provide(socialServiceLive));
|
|
74
78
|
//# sourceMappingURL=effect.js.map
|
package/dist/effect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAErF,OAAO,EAAE,wBAAwB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"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"}
|
package/dist/email/email.d.ts
CHANGED
|
@@ -1,40 +1,67 @@
|
|
|
1
1
|
import type { VerifyEmailErrors as RpcErrors } from '@passlock/shared/dist/rpc/user.js';
|
|
2
|
-
import { UserClient } from '@passlock/shared/dist/rpc/user.js';
|
|
3
2
|
import type { Principal } from '@passlock/shared/dist/schema/principal.js';
|
|
4
3
|
import { Context, Effect as E, Layer } from 'effect';
|
|
5
|
-
import {
|
|
4
|
+
import { type AuthenticationErrors, AuthenticationService } from '../authentication/authenticate.js';
|
|
5
|
+
import { UserClient } from '../rpc/user.js';
|
|
6
6
|
import { StorageService } from '../storage/storage.js';
|
|
7
7
|
export type VerifyRequest = {
|
|
8
8
|
code: string;
|
|
9
9
|
};
|
|
10
10
|
export type VerifyEmailErrors = RpcErrors | AuthenticationErrors;
|
|
11
|
-
declare const URLQueryString_base: Context.TagClass<URLQueryString, "URLQueryString", E.Effect<string, never, never>>;
|
|
11
|
+
declare const URLQueryString_base: Context.TagClass<URLQueryString, "@utils/URLQueryString", E.Effect<string, never, never>>;
|
|
12
12
|
export declare class URLQueryString extends URLQueryString_base {
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
declare const EmailService_base: Context.TagClass<EmailService, "@services/EmailService", {
|
|
15
15
|
verifyEmailCode: (request: VerifyRequest) => E.Effect<Principal, VerifyEmailErrors>;
|
|
16
16
|
verifyEmailLink: () => E.Effect<Principal, VerifyEmailErrors>;
|
|
17
|
-
}
|
|
18
|
-
export declare
|
|
17
|
+
}>;
|
|
18
|
+
export declare class EmailService extends EmailService_base {
|
|
19
|
+
}
|
|
19
20
|
export type Dependencies = StorageService | AuthenticationService | UserClient;
|
|
21
|
+
/**
|
|
22
|
+
* Look for ?code=<code> in the url
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
20
25
|
export declare const extractCodeFromHref: () => E.Effect<string, import("effect/Cause").NoSuchElementException, URLQueryString>;
|
|
26
|
+
/**
|
|
27
|
+
* Verify the mailbox using the given code
|
|
28
|
+
* @param request
|
|
29
|
+
* @returns
|
|
30
|
+
*/
|
|
21
31
|
export declare const verifyEmail: (request: VerifyRequest) => E.Effect<Principal, VerifyEmailErrors, Dependencies>;
|
|
32
|
+
/**
|
|
33
|
+
* Look for a code in the current url and verify it
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
22
36
|
export declare const verifyEmailLink: () => E.Effect<{
|
|
37
|
+
readonly email?: string;
|
|
38
|
+
readonly givenName?: string;
|
|
39
|
+
readonly familyName?: string;
|
|
40
|
+
readonly emailVerified?: boolean;
|
|
41
|
+
readonly iss: string;
|
|
42
|
+
readonly aud: string;
|
|
43
|
+
readonly sub: string;
|
|
44
|
+
readonly iat: Date;
|
|
45
|
+
readonly nbf: Date;
|
|
46
|
+
readonly exp: Date;
|
|
47
|
+
readonly jti: string;
|
|
23
48
|
readonly token: string;
|
|
24
|
-
readonly
|
|
25
|
-
|
|
49
|
+
readonly userVerified: boolean;
|
|
50
|
+
readonly authType: "email" | "apple" | "google" | "passkey";
|
|
51
|
+
readonly authId: string;
|
|
52
|
+
readonly user?: {
|
|
26
53
|
readonly id: string;
|
|
54
|
+
readonly email: string;
|
|
27
55
|
readonly givenName: string;
|
|
28
56
|
readonly familyName: string;
|
|
29
57
|
readonly emailVerified: boolean;
|
|
30
58
|
};
|
|
31
59
|
readonly authStatement: {
|
|
32
|
-
readonly authType: "email" | "passkey" | "apple" | "google";
|
|
33
60
|
readonly userVerified: boolean;
|
|
61
|
+
readonly authType: "email" | "apple" | "google" | "passkey";
|
|
34
62
|
readonly authTimestamp: Date;
|
|
35
63
|
};
|
|
36
64
|
readonly expireAt: Date;
|
|
37
65
|
}, VerifyEmailErrors, URLQueryString | Dependencies>;
|
|
38
|
-
export declare const EmailServiceLive: Layer.Layer<EmailService, never, StorageService | AuthenticationService | URLQueryString
|
|
66
|
+
export declare const EmailServiceLive: Layer.Layer<EmailService, never, UserClient | StorageService | AuthenticationService | URLQueryString>;
|
|
39
67
|
export {};
|
|
40
|
-
//# sourceMappingURL=email.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { VerifyEmailReq, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js';
|
|
2
2
|
import { Layer as L } from 'effect';
|
|
3
3
|
import { AuthenticationService } from '../authentication/authenticate.js';
|
|
4
|
+
import { UserClient } from '../rpc/user.js';
|
|
4
5
|
import { URLQueryString } from './email.js';
|
|
5
6
|
export declare const token = "token";
|
|
6
7
|
export declare const code = "code";
|
|
@@ -12,21 +13,34 @@ export declare const rpcVerifyEmailReq: VerifyEmailReq;
|
|
|
12
13
|
export declare const rpcVerifyEmailRes: VerifyEmailRes;
|
|
13
14
|
export declare const rpcClientTest: L.Layer<UserClient, never, never>;
|
|
14
15
|
export declare const principal: {
|
|
16
|
+
readonly email?: string;
|
|
17
|
+
readonly givenName?: string;
|
|
18
|
+
readonly familyName?: string;
|
|
19
|
+
readonly emailVerified?: boolean;
|
|
20
|
+
readonly iss: string;
|
|
21
|
+
readonly aud: string;
|
|
22
|
+
readonly sub: string;
|
|
23
|
+
readonly iat: Date;
|
|
24
|
+
readonly nbf: Date;
|
|
25
|
+
readonly exp: Date;
|
|
26
|
+
readonly jti: string;
|
|
15
27
|
readonly token: string;
|
|
16
|
-
readonly
|
|
17
|
-
|
|
28
|
+
readonly userVerified: boolean;
|
|
29
|
+
readonly authType: "email" | "apple" | "google" | "passkey";
|
|
30
|
+
readonly authId: string;
|
|
31
|
+
readonly user?: {
|
|
18
32
|
readonly id: string;
|
|
33
|
+
readonly email: string;
|
|
19
34
|
readonly givenName: string;
|
|
20
35
|
readonly familyName: string;
|
|
21
36
|
readonly emailVerified: boolean;
|
|
22
37
|
};
|
|
23
38
|
readonly authStatement: {
|
|
24
|
-
readonly authType: "email" | "passkey" | "apple" | "google";
|
|
25
39
|
readonly userVerified: boolean;
|
|
40
|
+
readonly authType: "email" | "apple" | "google" | "passkey";
|
|
26
41
|
readonly authTimestamp: Date;
|
|
27
42
|
};
|
|
28
43
|
readonly expireAt: Date;
|
|
29
44
|
};
|
|
30
45
|
export declare const storedToken: import("../index.js").StoredToken;
|
|
31
46
|
export declare const storageServiceTest: L.Layer<import("../storage/storage.js").StorageService, never, never>;
|
|
32
|
-
//# sourceMappingURL=email.fixture.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Effect as E, Layer as L } from 'effect';
|
|
1
|
+
import { VerifyEmailReq, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js';
|
|
2
|
+
import { Effect as E, Layer as L, Option as O } from 'effect';
|
|
3
3
|
import { AuthenticationService } from '../authentication/authenticate.js';
|
|
4
|
+
import { UserClient } from '../rpc/user.js';
|
|
4
5
|
import * as Fixtures from '../test/fixtures.js';
|
|
5
6
|
import { URLQueryString } from './email.js';
|
|
6
7
|
export const token = 'token';
|
|
@@ -14,7 +15,7 @@ export const authenticationServiceTest = L.succeed(AuthenticationService, Authen
|
|
|
14
15
|
export const rpcVerifyEmailReq = new VerifyEmailReq({ token, code });
|
|
15
16
|
export const rpcVerifyEmailRes = new VerifyEmailRes({ principal: Fixtures.principal });
|
|
16
17
|
export const rpcClientTest = L.succeed(UserClient, UserClient.of({
|
|
17
|
-
isExistingUser: () => E.succeed({ existingUser: true }),
|
|
18
|
+
isExistingUser: () => E.succeed({ existingUser: true, detail: O.none() }),
|
|
18
19
|
verifyEmail: () => E.succeed(rpcVerifyEmailRes),
|
|
19
20
|
resendVerificationEmail: () => E.fail(Fixtures.notImplemented),
|
|
20
21
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.fixture.js","sourceRoot":"","sources":["../../src/email/email.fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"email.fixture.js","sourceRoot":"","sources":["../../src/email/email.fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAA;AAC5B,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAA;AAC1B,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,CAAA;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;AAE1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,OAAO,CACzC,cAAc,EACd,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAC9C,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,OAAO,CAChD,qBAAqB,EACrB,qBAAqB,CAAC,EAAE,CAAC;IACvB,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;CACzD,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;AAEtF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CACpC,UAAU,EACV,UAAU,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAC/C,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;CAC/D,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAA;AAE/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAA"}
|
package/dist/email/email.js
CHANGED
|
@@ -1,22 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email verification effects
|
|
3
|
+
*/
|
|
1
4
|
import { BadRequest } from '@passlock/shared/dist/error/error.js';
|
|
2
|
-
import {
|
|
5
|
+
import { VerifyEmailReq } from '@passlock/shared/dist/rpc/user.js';
|
|
3
6
|
import { Context, Effect as E, Layer, Option as O, flow, identity, pipe } from 'effect';
|
|
4
7
|
import { AuthenticationService } from '../authentication/authenticate.js';
|
|
8
|
+
import { UserClient } from '../rpc/user.js';
|
|
5
9
|
import { StorageService } from '../storage/storage.js';
|
|
6
|
-
|
|
10
|
+
/* Dependencies */
|
|
11
|
+
export class URLQueryString extends Context.Tag('@utils/URLQueryString')() {
|
|
7
12
|
}
|
|
8
|
-
|
|
13
|
+
/* Service */
|
|
14
|
+
export class EmailService extends Context.Tag('@services/EmailService')() {
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check for existing token in sessionStorage,
|
|
18
|
+
* otherwise force passkey re-authentication
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
9
21
|
const getToken = () => {
|
|
10
22
|
return E.gen(function* (_) {
|
|
23
|
+
// Check for existing token
|
|
11
24
|
const storageService = yield* _(StorageService);
|
|
12
25
|
const existingTokenE = storageService.getToken('passkey');
|
|
13
26
|
const authenticationService = yield* _(AuthenticationService);
|
|
14
27
|
const tokenE = E.matchEffect(existingTokenE, {
|
|
15
28
|
onSuccess: token => E.succeed(token),
|
|
16
|
-
onFailure: () =>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
29
|
+
onFailure: () =>
|
|
30
|
+
// No token, need to authenticate the user
|
|
31
|
+
pipe(authenticationService.authenticatePasskey({
|
|
32
|
+
userVerification: O.some('preferred'),
|
|
33
|
+
email: O.none(),
|
|
34
|
+
}), E.map(principal => ({
|
|
35
|
+
token: principal.jti,
|
|
36
|
+
authType: principal.authType,
|
|
37
|
+
expiry: principal.exp.getTime(),
|
|
20
38
|
}))),
|
|
21
39
|
});
|
|
22
40
|
const token = yield* _(tokenE);
|
|
@@ -24,11 +42,22 @@ const getToken = () => {
|
|
|
24
42
|
return token;
|
|
25
43
|
});
|
|
26
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Look for ?code=<code> in the url
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
27
49
|
export const extractCodeFromHref = () => {
|
|
28
50
|
return pipe(URLQueryString, E.flatMap(identity), E.map(search => new URLSearchParams(search)), E.flatMap(params => O.fromNullable(params.get('code'))));
|
|
29
51
|
};
|
|
52
|
+
/* Effects */
|
|
53
|
+
/**
|
|
54
|
+
* Verify the mailbox using the given code
|
|
55
|
+
* @param request
|
|
56
|
+
* @returns
|
|
57
|
+
*/
|
|
30
58
|
export const verifyEmail = (request) => {
|
|
31
59
|
return E.gen(function* (_) {
|
|
60
|
+
// Re-authenticate the user if required
|
|
32
61
|
const { token } = yield* _(getToken());
|
|
33
62
|
yield* _(E.logDebug('Making request'));
|
|
34
63
|
const client = yield* _(UserClient);
|
|
@@ -36,7 +65,13 @@ export const verifyEmail = (request) => {
|
|
|
36
65
|
return principal;
|
|
37
66
|
});
|
|
38
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* Look for a code in the current url and verify it
|
|
70
|
+
* @returns
|
|
71
|
+
*/
|
|
39
72
|
export const verifyEmailLink = () => pipe(extractCodeFromHref(), E.mapError(() => new BadRequest({ message: 'Expected ?code=xxx in window.location' })), E.flatMap(code => verifyEmail({ code })));
|
|
73
|
+
/* Live */
|
|
74
|
+
/* v8 ignore start */
|
|
40
75
|
export const EmailServiceLive = Layer.effect(EmailService, E.gen(function* (_) {
|
|
41
76
|
const context = yield* _(E.context());
|
|
42
77
|
return EmailService.of({
|
|
@@ -44,4 +79,5 @@ export const EmailServiceLive = Layer.effect(EmailService, E.gen(function* (_) {
|
|
|
44
79
|
verifyEmailLink: flow(verifyEmailLink, E.provide(context)),
|
|
45
80
|
});
|
|
46
81
|
}));
|
|
82
|
+
/* v8 ignore stop */
|
|
47
83
|
//# sourceMappingURL=email.js.map
|
package/dist/email/email.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/email/email.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/email/email.ts"],"names":[],"mappings":"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"}
|
package/dist/event/event.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fire DOM events
|
|
3
|
+
*/
|
|
1
4
|
import { InternalBrowserError } from '@passlock/shared/dist/error/error.js';
|
|
2
5
|
import { Effect } from 'effect';
|
|
3
6
|
export declare const DebugMessage = "PasslogDebugMessage";
|
|
4
7
|
export declare const fireEvent: (message: string) => Effect.Effect<void, InternalBrowserError, never>;
|
|
5
8
|
export declare function isPasslockEvent(event: Event): event is CustomEvent;
|
|
6
|
-
//# sourceMappingURL=event.d.ts.map
|
package/dist/event/event.js
CHANGED
package/dist/event/event.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAA;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAE;IAC3C,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;YAC9D,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,OAAO,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAA;QAC7E,CAAC;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,KAAK,CAAA;IAC7C,OAAO,QAAQ,IAAI,KAAK,CAAA;AAC1B,CAAC"}
|