@passlock/client 0.9.0
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/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/authentication/authenticate.d.ts +22 -0
- package/dist/authentication/authenticate.d.ts.map +1 -0
- package/dist/authentication/authenticate.fixture.d.ts +36 -0
- package/dist/authentication/authenticate.fixture.d.ts.map +1 -0
- package/dist/authentication/authenticate.fixture.js +52 -0
- package/dist/authentication/authenticate.fixture.js.map +1 -0
- package/dist/authentication/authenticate.js +69 -0
- package/dist/authentication/authenticate.js.map +1 -0
- package/dist/authentication/authenticate.test.d.ts +2 -0
- package/dist/authentication/authenticate.test.d.ts.map +1 -0
- package/dist/authentication/authenticate.test.js +111 -0
- package/dist/authentication/authenticate.test.js.map +1 -0
- package/dist/capabilities/capabilities.d.ts +18 -0
- package/dist/capabilities/capabilities.d.ts.map +1 -0
- package/dist/capabilities/capabilities.js +35 -0
- package/dist/capabilities/capabilities.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -0
- package/dist/connection/connection.d.ts +9 -0
- package/dist/connection/connection.d.ts.map +1 -0
- package/dist/connection/connection.fixture.d.ts +12 -0
- package/dist/connection/connection.fixture.d.ts.map +1 -0
- package/dist/connection/connection.fixture.js +20 -0
- package/dist/connection/connection.fixture.js.map +1 -0
- package/dist/connection/connection.js +21 -0
- package/dist/connection/connection.js.map +1 -0
- package/dist/connection/connection.test.d.ts +2 -0
- package/dist/connection/connection.test.d.ts.map +1 -0
- package/dist/connection/connection.test.js +34 -0
- package/dist/connection/connection.test.js.map +1 -0
- package/dist/effect.d.ts +33 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +62 -0
- package/dist/effect.js.map +1 -0
- package/dist/email/email.d.ts +37 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.fixture.d.ts +33 -0
- package/dist/email/email.fixture.d.ts.map +1 -0
- package/dist/email/email.fixture.js +30 -0
- package/dist/email/email.fixture.js.map +1 -0
- package/dist/email/email.js +78 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/email.test.d.ts +2 -0
- package/dist/email/email.test.d.ts.map +1 -0
- package/dist/email/email.test.js +101 -0
- package/dist/email/email.test.js.map +1 -0
- package/dist/event/event.d.ts +9 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +23 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/event.node.test.d.ts +2 -0
- package/dist/event/event.node.test.d.ts.map +1 -0
- package/dist/event/event.node.test.js +14 -0
- package/dist/event/event.node.test.js.map +1 -0
- package/dist/event/event.test.d.ts +2 -0
- package/dist/event/event.test.d.ts.map +1 -0
- package/dist/event/event.test.js +30 -0
- package/dist/event/event.test.js.map +1 -0
- package/dist/exit.d.ts +64 -0
- package/dist/exit.d.ts.map +1 -0
- package/dist/exit.js +106 -0
- package/dist/exit.js.map +1 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/eventLogger.d.ts +18 -0
- package/dist/logging/eventLogger.d.ts.map +1 -0
- package/dist/logging/eventLogger.js +32 -0
- package/dist/logging/eventLogger.js.map +1 -0
- package/dist/logging/eventLogger.test.d.ts +2 -0
- package/dist/logging/eventLogger.test.d.ts.map +1 -0
- package/dist/logging/eventLogger.test.js +74 -0
- package/dist/logging/eventLogger.test.js.map +1 -0
- package/dist/registration/register.d.ts +29 -0
- package/dist/registration/register.d.ts.map +1 -0
- package/dist/registration/register.fixture.d.ts +40 -0
- package/dist/registration/register.fixture.d.ts.map +1 -0
- package/dist/registration/register.fixture.js +65 -0
- package/dist/registration/register.fixture.js.map +1 -0
- package/dist/registration/register.js +84 -0
- package/dist/registration/register.js.map +1 -0
- package/dist/registration/register.test.d.ts +2 -0
- package/dist/registration/register.test.d.ts.map +1 -0
- package/dist/registration/register.test.js +122 -0
- package/dist/registration/register.test.js.map +1 -0
- package/dist/storage/storage.d.ts +53 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.fixture.d.ts +6 -0
- package/dist/storage/storage.fixture.d.ts.map +1 -0
- package/dist/storage/storage.fixture.js +26 -0
- package/dist/storage/storage.fixture.js.map +1 -0
- package/dist/storage/storage.js +102 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/storage.test.d.ts +2 -0
- package/dist/storage/storage.test.d.ts.map +1 -0
- package/dist/storage/storage.test.js +122 -0
- package/dist/storage/storage.test.js.map +1 -0
- package/dist/test/fixtures.d.ts +14 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +39 -0
- package/dist/test/fixtures.js.map +1 -0
- package/dist/user/user.d.ts +18 -0
- package/dist/user/user.d.ts.map +1 -0
- package/dist/user/user.fixture.d.ts +8 -0
- package/dist/user/user.fixture.d.ts.map +1 -0
- package/dist/user/user.fixture.js +17 -0
- package/dist/user/user.fixture.js.map +1 -0
- package/dist/user/user.js +23 -0
- package/dist/user/user.js.map +1 -0
- package/dist/user/user.test.d.ts +2 -0
- package/dist/user/user.test.d.ts.map +1 -0
- package/dist/user/user.test.js +37 -0
- package/dist/user/user.test.js.map +1 -0
- package/package.json +87 -0
- package/src/authentication/authenticate.fixture.ts +72 -0
- package/src/authentication/authenticate.test.ts +207 -0
- package/src/authentication/authenticate.ts +147 -0
- package/src/capabilities/capabilities.ts +81 -0
- package/src/config.ts +43 -0
- package/src/connection/connection.fixture.ts +27 -0
- package/src/connection/connection.test.ts +61 -0
- package/src/connection/connection.ts +51 -0
- package/src/effect.ts +278 -0
- package/src/email/email.fixture.ts +49 -0
- package/src/email/email.test.ts +186 -0
- package/src/email/email.ts +139 -0
- package/src/event/event.node.test.ts +20 -0
- package/src/event/event.test.ts +37 -0
- package/src/event/event.ts +25 -0
- package/src/index.ts +275 -0
- package/src/logging/eventLogger.test.ts +102 -0
- package/src/logging/eventLogger.ts +35 -0
- package/src/registration/register.fixture.ts +94 -0
- package/src/registration/register.test.ts +247 -0
- package/src/registration/register.ts +178 -0
- package/src/storage/storage.fixture.ts +33 -0
- package/src/storage/storage.test.ts +196 -0
- package/src/storage/storage.ts +165 -0
- package/src/test/fixtures.ts +51 -0
- package/src/user/user.fixture.ts +23 -0
- package/src/user/user.test.ts +53 -0
- package/src/user/user.ts +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.test.d.ts","sourceRoot":"","sources":["../../src/connection/connection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { RpcClient, RpcConfig, NetworkService } from '@passlock/shared/dist/rpc/rpc';
|
|
2
|
+
import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect';
|
|
3
|
+
import { describe, expect, test } from 'vitest';
|
|
4
|
+
import { mock } from 'vitest-mock-extended';
|
|
5
|
+
import { ConnectionService, ConnectionServiceLive } from './connection';
|
|
6
|
+
import * as Fixture from './connection.fixture';
|
|
7
|
+
describe('preConnect should', () => {
|
|
8
|
+
test('hit the rpc endpoint', async () => {
|
|
9
|
+
const assertions = E.gen(function* (_) {
|
|
10
|
+
const service = yield* _(ConnectionService);
|
|
11
|
+
yield* _(service.preConnect());
|
|
12
|
+
const rpcClient = yield* _(RpcClient);
|
|
13
|
+
expect(rpcClient.preConnect).toBeCalledWith(Fixture.preConnectReq);
|
|
14
|
+
const networkService = yield* _(NetworkService);
|
|
15
|
+
expect(networkService.get).toBeCalledWith(`/token/token?warm=true`);
|
|
16
|
+
});
|
|
17
|
+
const rpcClientTest = Layer.effect(RpcClient, E.sync(() => {
|
|
18
|
+
const rpcMock = mock();
|
|
19
|
+
rpcMock.preConnect.mockReturnValue(E.succeed(Fixture.preConnectRes));
|
|
20
|
+
return rpcMock;
|
|
21
|
+
}));
|
|
22
|
+
const rpcConfigTest = Layer.succeed(RpcConfig, RpcConfig.of(Fixture.rpcConfig));
|
|
23
|
+
const networkServiceTest = Layer.effect(NetworkService, E.sync(() => {
|
|
24
|
+
const networkMock = mock();
|
|
25
|
+
networkMock.get.mockReturnValue(E.succeed({}));
|
|
26
|
+
return networkMock;
|
|
27
|
+
}));
|
|
28
|
+
const service = pipe(ConnectionServiceLive, L.provide(rpcClientTest), L.provide(networkServiceTest), L.provide(rpcConfigTest));
|
|
29
|
+
const layers = L.mergeAll(service, rpcClientTest, networkServiceTest);
|
|
30
|
+
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
31
|
+
return E.runPromise(effect);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=connection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.test.js","sourceRoot":"","sources":["../../src/connection/connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AACpG,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,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAG/C,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,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;YAC/C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAA;QACrE,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,CACjC,SAAS,EACT,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAChC,CAAA;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CACrC,cAAc,EACd,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,MAAM,WAAW,GAAG,IAAI,EAA0B,CAAA;YAElD,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,EAAG,CAAC,CAAC,CAAA;YAE/C,OAAO,WAAW,CAAA;QACpB,CAAC,CAAC,CACH,CAAA;QAED,MAAM,OAAO,GAAG,IAAI,CAClB,qBAAqB,EACrB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EACxB,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAC7B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAA;QACrE,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"}
|
package/dist/effect.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type { BadRequest, Disabled, Duplicate, Forbidden, InternalBrowserError, NotFound, NotSupported, Unauthorized, } from '@passlock/shared/dist/error/error';
|
|
2
|
+
export type { Principal } from '@passlock/shared/dist/schema/schema';
|
|
3
|
+
import { type BadRequest, type Disabled, Duplicate, type Forbidden, type NotFound, type NotSupported, type Unauthorized } from '@passlock/shared/dist/error/error';
|
|
4
|
+
import { RpcConfig } from '@passlock/shared/dist/rpc/rpc';
|
|
5
|
+
import type { Principal } from '@passlock/shared/dist/schema/schema';
|
|
6
|
+
import { Context, Effect as E, Layer as L } from 'effect';
|
|
7
|
+
import type { NoSuchElementException } from 'effect/Cause';
|
|
8
|
+
import { type AuthenticationRequest, AuthenticationService } from './authentication/authenticate';
|
|
9
|
+
import { ConnectionService } from './connection/connection';
|
|
10
|
+
import { EmailService, type VerifyRequest } from './email/email';
|
|
11
|
+
import { type RegistrationRequest, RegistrationService } from './registration/register';
|
|
12
|
+
import { type AuthType, StorageService, type StoredToken } from './storage/storage';
|
|
13
|
+
import { type Email, UserService } from './user/user';
|
|
14
|
+
export declare const allRequirements: L.Layer<import("./capabilities/capabilities").Capabilities | StorageService | AuthenticationService | ConnectionService | EmailService | UserService | RegistrationService, never, Storage | RpcConfig>;
|
|
15
|
+
declare const Config_base: Context.TagClass<Config, "Config", {
|
|
16
|
+
tenancyId: string;
|
|
17
|
+
clientId: string;
|
|
18
|
+
endpoint?: string;
|
|
19
|
+
}>;
|
|
20
|
+
export declare class Config extends Config_base {
|
|
21
|
+
}
|
|
22
|
+
export declare const preConnect: () => E.Effect<void, never, Config>;
|
|
23
|
+
export declare const isRegistered: (email: Email) => E.Effect<boolean, BadRequest, Config>;
|
|
24
|
+
export type RegistrationErrors = NotSupported | BadRequest | Duplicate | Unauthorized | Forbidden;
|
|
25
|
+
export declare const registerPasskey: (request: RegistrationRequest) => E.Effect<Principal, RegistrationErrors, Config>;
|
|
26
|
+
export type AuthenticationErrors = NotSupported | BadRequest | NotFound | Disabled | Unauthorized | Forbidden;
|
|
27
|
+
export declare const authenticatePasskey: (request: AuthenticationRequest) => E.Effect<Principal, AuthenticationErrors, Config>;
|
|
28
|
+
export type VerifyEmailErrors = NotSupported | BadRequest | NotFound | Disabled | Unauthorized | Forbidden;
|
|
29
|
+
export declare const verifyEmailCode: (request: VerifyRequest) => E.Effect<boolean, VerifyEmailErrors, Config>;
|
|
30
|
+
export declare const verifyEmailLink: () => E.Effect<boolean, VerifyEmailErrors, Config>;
|
|
31
|
+
export declare const getSessionToken: (authType: AuthType) => E.Effect<StoredToken, NoSuchElementException>;
|
|
32
|
+
export declare const clearExpiredTokens: () => E.Effect<void>;
|
|
33
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,oBAAoB,EACpB,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,mCAAmC,CAAA;AAE1C,YAAY,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAEpE,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,SAAS,EACT,KAAK,SAAS,EAEd,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAIL,SAAS,EACV,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAyB,MAAM,QAAQ,CAAA;AAChF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAE1D,OAAO,EAEL,KAAK,qBAAqB,EAC1B,qBAAqB,EAEtB,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EAAE,iBAAiB,EAAyB,MAAM,yBAAyB,CAAA;AAClF,OAAO,EAAE,YAAY,EAAoC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAElG,OAAO,EAEL,KAAK,mBAAmB,EACxB,mBAAmB,EAEpB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,KAAK,QAAQ,EAEb,cAAc,EAEd,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,KAAK,KAAK,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AA8FtE,eAAO,MAAM,eAAe,yMAQ3B,CAAA;;eAKc,MAAM;cACP,MAAM;eACL,MAAM;;AALrB,qBAAa,MAAO,SAAQ,WAOzB;CAAG;AAeN,eAAO,MAAM,UAAU,QAAO,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAMvD,CAAA;AAEH,eAAO,MAAM,YAAY,UAAW,KAAK,KAAG,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAM7E,CAAA;AAEH,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAA;AAEjG,eAAO,MAAM,eAAe,YACjB,mBAAmB,KAC3B,EAAE,MAAM,CAAC,SAAS,EAAE,kBAAkB,EAAE,MAAM,CAM9C,CAAA;AAEH,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,SAAS,CAAA;AAEb,eAAO,MAAM,mBAAmB,YACrB,qBAAqB,KAC7B,EAAE,MAAM,CAAC,SAAS,EAAE,oBAAoB,EAAE,MAAM,CAMhD,CAAA;AAEH,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,SAAS,CAAA;AAEb,eAAO,MAAM,eAAe,YACjB,aAAa,KACrB,EAAE,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAM3C,CAAA;AAEH,eAAO,MAAM,eAAe,QAAO,EAAE,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAM3E,CAAA;AAEH,eAAO,MAAM,eAAe,aAChB,QAAQ,KACjB,EAAE,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAM5C,CAAA;AAEH,eAAO,MAAM,kBAAkB,QAAO,EAAE,MAAM,CAAC,IAAI,CAMhD,CAAA"}
|
package/dist/effect.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { create, get as getCredential } from '@github/webauthn-json/browser-ponyfill';
|
|
2
|
+
import { Duplicate, InternalBrowserError, } from '@passlock/shared/dist/error/error';
|
|
3
|
+
import { NetworkServiceLive, RetrySchedule, RpcClientLive, RpcConfig, } from '@passlock/shared/dist/rpc/rpc';
|
|
4
|
+
import { Context, Effect as E, Layer as L, Layer, Schedule, pipe } from 'effect';
|
|
5
|
+
import { AuthenticateServiceLive, AuthenticationService, GetCredential, } from './authentication/authenticate';
|
|
6
|
+
import { capabilitiesLive } from './capabilities/capabilities';
|
|
7
|
+
import { ConnectionService, ConnectionServiceLive } from './connection/connection';
|
|
8
|
+
import { EmailService, EmailServiceLive, LocationSearch } from './email/email';
|
|
9
|
+
import { CreateCredential, RegistrationService, RegistrationServiceLive, } from './registration/register';
|
|
10
|
+
import { Storage, StorageService, StorageServiceLive, } from './storage/storage';
|
|
11
|
+
import { UserService, UserServiceLive } from './user/user';
|
|
12
|
+
/* Layers */
|
|
13
|
+
const createLive = L.succeed(CreateCredential, CreateCredential.of((options) => pipe(E.tryPromise({
|
|
14
|
+
try: () => create(options),
|
|
15
|
+
catch: e => {
|
|
16
|
+
if (e instanceof Error && e.message.includes('excludeCredentials')) {
|
|
17
|
+
return new Duplicate({
|
|
18
|
+
message: 'Passkey already registered on this device or cloud account',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return new InternalBrowserError({
|
|
23
|
+
message: 'Unable to create credential',
|
|
24
|
+
detail: String(e),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
}), E.map(credential => credential.toJSON()))));
|
|
29
|
+
const getLive = L.succeed(GetCredential, GetCredential.of((options) => pipe(E.tryPromise({
|
|
30
|
+
try: () => getCredential(options),
|
|
31
|
+
catch: e => new InternalBrowserError({
|
|
32
|
+
message: 'Unable to get authentication credential',
|
|
33
|
+
detail: String(e),
|
|
34
|
+
}),
|
|
35
|
+
}), E.map(credential => credential.toJSON()))));
|
|
36
|
+
const schedule = Schedule.intersect(Schedule.recurs(3), Schedule.exponential('100 millis'));
|
|
37
|
+
const retryScheduleLive = L.succeed(RetrySchedule, RetrySchedule.of({ schedule }));
|
|
38
|
+
const networkServiceLive = pipe(NetworkServiceLive, L.provide(retryScheduleLive));
|
|
39
|
+
const rpcClientLive = pipe(RpcClientLive, L.provide(networkServiceLive));
|
|
40
|
+
const storageServiceLive = StorageServiceLive;
|
|
41
|
+
const userServiceLive = pipe(UserServiceLive, L.provide(rpcClientLive));
|
|
42
|
+
const registrationServiceLive = pipe(RegistrationServiceLive, L.provide(rpcClientLive), L.provide(userServiceLive), L.provide(capabilitiesLive), L.provide(createLive), L.provide(storageServiceLive));
|
|
43
|
+
const authenticationServiceLive = pipe(AuthenticateServiceLive, L.provide(rpcClientLive), L.provide(capabilitiesLive), L.provide(getLive), L.provide(storageServiceLive));
|
|
44
|
+
const connectionServiceLive = pipe(ConnectionServiceLive, L.provide(rpcClientLive), L.provide(networkServiceLive));
|
|
45
|
+
const locationSearchLive = Layer.succeed(LocationSearch, LocationSearch.of(E.sync(() => globalThis.window.location.search)));
|
|
46
|
+
const emailServiceLive = pipe(EmailServiceLive, L.provide(locationSearchLive), L.provide(rpcClientLive), L.provide(capabilitiesLive), L.provide(authenticationServiceLive), L.provide(storageServiceLive));
|
|
47
|
+
export const allRequirements = Layer.mergeAll(capabilitiesLive, userServiceLive, registrationServiceLive, authenticationServiceLive, connectionServiceLive, emailServiceLive, storageServiceLive);
|
|
48
|
+
export class Config extends Context.Tag('Config')() {
|
|
49
|
+
}
|
|
50
|
+
const storageLive = Layer.effect(Storage, E.sync(() => Storage.of(globalThis.localStorage)));
|
|
51
|
+
const exchangeConfig = (effect) => {
|
|
52
|
+
return pipe(Config, E.flatMap(config => E.provideService(effect, RpcConfig, RpcConfig.of(config))), effect => E.provide(effect, storageLive));
|
|
53
|
+
};
|
|
54
|
+
export const preConnect = () => pipe(ConnectionService, E.flatMap(service => service.preConnect()), E.provide(connectionServiceLive), exchangeConfig);
|
|
55
|
+
export const isRegistered = (email) => pipe(UserService, E.flatMap(service => service.isExistingUser(email)), E.provide(userServiceLive), exchangeConfig);
|
|
56
|
+
export const registerPasskey = (request) => pipe(RegistrationService, E.flatMap(service => service.registerPasskey(request)), E.provide(registrationServiceLive), exchangeConfig);
|
|
57
|
+
export const authenticatePasskey = (request) => pipe(AuthenticationService, E.flatMap(service => service.authenticatePasskey(request)), E.provide(authenticationServiceLive), exchangeConfig);
|
|
58
|
+
export const verifyEmailCode = (request) => pipe(EmailService, E.flatMap(service => service.verifyEmailCode(request)), E.provide(emailServiceLive), exchangeConfig);
|
|
59
|
+
export const verifyEmailLink = () => pipe(EmailService, E.flatMap(service => service.verifyEmailLink()), E.provide(emailServiceLive), exchangeConfig);
|
|
60
|
+
export const getSessionToken = (authType) => pipe(StorageService, E.flatMap(service => service.getToken(authType)), E.provide(storageServiceLive), E.provide(storageLive));
|
|
61
|
+
export const clearExpiredTokens = () => pipe(StorageService, E.flatMap(service => service.clearExpiredTokens), E.provide(storageServiceLive), E.provide(storageLive));
|
|
62
|
+
//# sourceMappingURL=effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { RpcClient } from '@passlock/shared/dist/rpc/rpc';
|
|
2
|
+
import type { VerifyEmailErrors as RpcErrors } from '@passlock/shared/dist/rpc/user';
|
|
3
|
+
import { Context, Effect as E, Layer } from 'effect';
|
|
4
|
+
import { type AuthenticationErrors, AuthenticationService } from '../authentication/authenticate';
|
|
5
|
+
import { StorageService } from '../storage/storage';
|
|
6
|
+
export type VerifyRequest = {
|
|
7
|
+
code: string;
|
|
8
|
+
};
|
|
9
|
+
export type VerifyEmailErrors = RpcErrors | AuthenticationErrors;
|
|
10
|
+
declare const LocationSearch_base: Context.TagClass<LocationSearch, "LocationSearch", E.Effect<string, never, never>>;
|
|
11
|
+
export declare class LocationSearch extends LocationSearch_base {
|
|
12
|
+
}
|
|
13
|
+
export type EmailService = {
|
|
14
|
+
verifyEmailCode: (request: VerifyRequest) => E.Effect<boolean, VerifyEmailErrors>;
|
|
15
|
+
verifyEmailLink: () => E.Effect<boolean, VerifyEmailErrors>;
|
|
16
|
+
};
|
|
17
|
+
export declare const EmailService: Context.Tag<EmailService, EmailService>;
|
|
18
|
+
export type Dependencies = StorageService | AuthenticationService | RpcClient;
|
|
19
|
+
/**
|
|
20
|
+
* Look for ?code=<code> in the url
|
|
21
|
+
* @returns
|
|
22
|
+
*/
|
|
23
|
+
export declare const extractCodeFromHref: () => E.Effect<string, import("effect/Cause").NoSuchElementException, LocationSearch>;
|
|
24
|
+
/**
|
|
25
|
+
* Verify the mailbox using the given code
|
|
26
|
+
* @param verificationRequest
|
|
27
|
+
* @returns
|
|
28
|
+
*/
|
|
29
|
+
export declare const verifyEmail: (verificationRequest: VerifyRequest) => E.Effect<boolean, VerifyEmailErrors, Dependencies>;
|
|
30
|
+
/**
|
|
31
|
+
* Look for a code in the current url and verify it
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
export declare const verifyEmailLink: () => E.Effect<boolean, VerifyEmailErrors, LocationSearch | Dependencies>;
|
|
35
|
+
export declare const EmailServiceLive: Layer.Layer<EmailService, never, StorageService | AuthenticationService | RpcClient | LocationSearch>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/email/email.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,IAAI,SAAS,EAAC,MAAM,gCAAgC,CAAC;AAEpF,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,EAAqC,MAAM,QAAQ,CAAA;AACvF,OAAO,EAAE,KAAK,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAKnD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAID,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,oBAAoB,CAAA;;AAIhE,qBAAa,cAAe,SAAQ,mBAGjC;CAAG;AAIN,MAAM,MAAM,YAAY,GAAG;IACzB,eAAe,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;IACjF,eAAe,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;CAC5D,CAAA;AAED,eAAO,MAAM,YAAY,yCAA6D,CAAA;AAItF,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAmC7E;;;GAGG;AACH,eAAO,MAAM,mBAAmB,uFAO/B,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,WAAW,wBACD,aAAa,KACjC,EAAE,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,YAAY,CAanD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,2EAKzB,CAAA;AAKH,eAAO,MAAM,gBAAgB,uGAW5B,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RpcClient } from '@passlock/shared/dist/rpc/rpc';
|
|
2
|
+
import { VerifyEmailReq, VerifyEmailRes } from '@passlock/shared/dist/rpc/user';
|
|
3
|
+
import { Layer as L } from 'effect';
|
|
4
|
+
import { LocationSearch } from './email';
|
|
5
|
+
import { AuthenticationService } from '../authentication/authenticate';
|
|
6
|
+
export declare const token = "token";
|
|
7
|
+
export declare const code = "code";
|
|
8
|
+
export declare const authType = "passkey";
|
|
9
|
+
export declare const expireAt: number;
|
|
10
|
+
export declare const locationSearchTest: L.Layer<LocationSearch, never, never>;
|
|
11
|
+
export declare const authenticationServiceTest: L.Layer<AuthenticationService, never, never>;
|
|
12
|
+
export declare const rpcClientTest: L.Layer<RpcClient, never, never>;
|
|
13
|
+
export declare const verifyEmailReq: VerifyEmailReq;
|
|
14
|
+
export declare const verifyEmailRes: VerifyEmailRes;
|
|
15
|
+
export declare const principal: {
|
|
16
|
+
readonly token: string;
|
|
17
|
+
readonly subject: {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly email: string;
|
|
20
|
+
readonly firstName: string;
|
|
21
|
+
readonly lastName: string;
|
|
22
|
+
readonly emailVerified: boolean;
|
|
23
|
+
};
|
|
24
|
+
readonly authStatement: {
|
|
25
|
+
readonly authType: "email" | "passkey";
|
|
26
|
+
readonly userVerified: boolean;
|
|
27
|
+
readonly authTimestamp: Date;
|
|
28
|
+
};
|
|
29
|
+
readonly expireAt: Date;
|
|
30
|
+
};
|
|
31
|
+
export declare const storedToken: import("../storage/storage").StoredToken;
|
|
32
|
+
export declare const storageServiceTest: L.Layer<import("../storage/storage").StorageService, never, never>;
|
|
33
|
+
//# sourceMappingURL=email.fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.fixture.d.ts","sourceRoot":"","sources":["../../src/email/email.fixture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,EAAe,KAAK,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAItE,eAAO,MAAM,KAAK,UAAU,CAAA;AAC5B,eAAO,MAAM,IAAI,SAAS,CAAA;AAC1B,eAAO,MAAM,QAAQ,YAAY,CAAA;AACjC,eAAO,MAAM,QAAQ,QAAqB,CAAA;AAE1C,eAAO,MAAM,kBAAkB,uCAG9B,CAAA;AAED,eAAO,MAAM,yBAAyB,8CAKrC,CAAA;AAED,eAAO,MAAM,aAAa,kCAWzB,CAAA;AAED,eAAO,MAAM,cAAc,gBAAsC,CAAA;AAEjE,eAAO,MAAM,cAAc,gBAAyC,CAAA;AAEpE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;CAAqB,CAAA;AAE3C,eAAO,MAAM,WAAW,0CAAuB,CAAA;AAE/C,eAAO,MAAM,kBAAkB,oEAA8B,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BadRequest } from '@passlock/shared/dist/error/error';
|
|
2
|
+
import { RpcClient } from '@passlock/shared/dist/rpc/rpc';
|
|
3
|
+
import { VerifyEmailReq, VerifyEmailRes } from '@passlock/shared/dist/rpc/user';
|
|
4
|
+
import { Effect as E, Layer as L } from 'effect';
|
|
5
|
+
import { LocationSearch } from './email';
|
|
6
|
+
import { AuthenticationService } from '../authentication/authenticate';
|
|
7
|
+
import * as Fixtures from '../test/fixtures';
|
|
8
|
+
export const token = 'token';
|
|
9
|
+
export const code = 'code';
|
|
10
|
+
export const authType = 'passkey';
|
|
11
|
+
export const expireAt = Date.now() + 10000;
|
|
12
|
+
export const locationSearchTest = L.succeed(LocationSearch, LocationSearch.of(E.succeed(`?code=${code}`)));
|
|
13
|
+
export const authenticationServiceTest = L.succeed(AuthenticationService, AuthenticationService.of({
|
|
14
|
+
authenticatePasskey: () => E.succeed(Fixtures.principal),
|
|
15
|
+
}));
|
|
16
|
+
export const rpcClientTest = L.succeed(RpcClient, RpcClient.of({
|
|
17
|
+
preConnect: () => E.succeed({ warmed: true }),
|
|
18
|
+
isExistingUser: () => E.succeed({ existingUser: true }),
|
|
19
|
+
verifyEmail: () => E.succeed({ verified: true }),
|
|
20
|
+
getRegistrationOptions: () => E.fail(new BadRequest({ message: 'Not implemeneted' })),
|
|
21
|
+
verifyRegistrationCredential: () => E.fail(new BadRequest({ message: 'Not implemeneted' })),
|
|
22
|
+
getAuthenticationOptions: () => E.fail(new BadRequest({ message: 'Not implemeneted' })),
|
|
23
|
+
verifyAuthenticationCredential: () => E.fail(new BadRequest({ message: 'Not implemeneted' })),
|
|
24
|
+
}));
|
|
25
|
+
export const verifyEmailReq = new VerifyEmailReq({ token, code });
|
|
26
|
+
export const verifyEmailRes = new VerifyEmailRes({ verified: true });
|
|
27
|
+
export const principal = Fixtures.principal;
|
|
28
|
+
export const storedToken = Fixtures.storedToken;
|
|
29
|
+
export const storageServiceTest = Fixtures.storageServiceTest;
|
|
30
|
+
//# sourceMappingURL=email.fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.fixture.js","sourceRoot":"","sources":["../../src/email/email.fixture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAA;AAG5C,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,aAAa,GAAG,CAAC,CAAC,OAAO,CACpC,SAAS,EACT,SAAS,CAAC,EAAE,CAAC;IACX,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7C,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACvD,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChD,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACrF,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3F,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACvF,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;CAC9F,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AAEpE,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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email verification effects
|
|
3
|
+
*/
|
|
4
|
+
import { BadRequest } from '@passlock/shared/dist/error/error';
|
|
5
|
+
import { RpcClient } from '@passlock/shared/dist/rpc/rpc';
|
|
6
|
+
import { VerifyEmailReq } from '@passlock/shared/dist/rpc/user';
|
|
7
|
+
import { Context, Effect as E, Layer, Option as O, flow, identity, pipe } from 'effect';
|
|
8
|
+
import { AuthenticationService } from '../authentication/authenticate';
|
|
9
|
+
import { StorageService } from '../storage/storage';
|
|
10
|
+
/* Dependencies */
|
|
11
|
+
export class LocationSearch extends Context.Tag('LocationSearch')() {
|
|
12
|
+
}
|
|
13
|
+
export const EmailService = Context.GenericTag('@services/EmailService');
|
|
14
|
+
/**
|
|
15
|
+
* Check for existing token in sessionStorage,
|
|
16
|
+
* otherwise force passkey re-authentication
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
const getToken = () => {
|
|
20
|
+
return E.gen(function* (_) {
|
|
21
|
+
// Check for existing token
|
|
22
|
+
const storageService = yield* _(StorageService);
|
|
23
|
+
const existingTokenE = storageService.getToken('passkey');
|
|
24
|
+
const authenticationService = yield* _(AuthenticationService);
|
|
25
|
+
const tokenE = E.matchEffect(existingTokenE, {
|
|
26
|
+
onSuccess: token => E.succeed(token),
|
|
27
|
+
onFailure: () =>
|
|
28
|
+
// No token, need to authenticate the user
|
|
29
|
+
pipe(authenticationService.authenticatePasskey({ userVerification: 'preferred' }), E.map(principal => ({
|
|
30
|
+
token: principal.token,
|
|
31
|
+
authType: principal.authStatement.authType,
|
|
32
|
+
expiresAt: principal.expireAt.getTime(),
|
|
33
|
+
}))),
|
|
34
|
+
});
|
|
35
|
+
const token = yield* _(tokenE);
|
|
36
|
+
yield* _(storageService.clearToken('passkey'));
|
|
37
|
+
return token;
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Look for ?code=<code> in the url
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
44
|
+
export const extractCodeFromHref = () => {
|
|
45
|
+
return pipe(LocationSearch, E.flatMap(identity), E.map(search => new URLSearchParams(search)), E.flatMap(params => O.fromNullable(params.get('code'))));
|
|
46
|
+
};
|
|
47
|
+
/* Effects */
|
|
48
|
+
/**
|
|
49
|
+
* Verify the mailbox using the given code
|
|
50
|
+
* @param verificationRequest
|
|
51
|
+
* @returns
|
|
52
|
+
*/
|
|
53
|
+
export const verifyEmail = (verificationRequest) => {
|
|
54
|
+
return E.gen(function* (_) {
|
|
55
|
+
// Re-authenticate the user if required
|
|
56
|
+
const { token } = yield* _(getToken());
|
|
57
|
+
yield* _(E.logDebug('Making request'));
|
|
58
|
+
const client = yield* _(RpcClient);
|
|
59
|
+
const { verified } = yield* _(client.verifyEmail(new VerifyEmailReq({ token, code: verificationRequest.code })));
|
|
60
|
+
return verified;
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Look for a code in the current url and verify it
|
|
65
|
+
* @returns
|
|
66
|
+
*/
|
|
67
|
+
export const verifyEmailLink = () => pipe(extractCodeFromHref(), E.mapError(() => new BadRequest({ message: 'Expected ?code=xxx in window.location' })), E.flatMap(code => verifyEmail({ code })));
|
|
68
|
+
/* Live */
|
|
69
|
+
/* v8 ignore start */
|
|
70
|
+
export const EmailServiceLive = Layer.effect(EmailService, E.gen(function* (_) {
|
|
71
|
+
const context = yield* _(E.context());
|
|
72
|
+
return EmailService.of({
|
|
73
|
+
verifyEmailCode: flow(verifyEmail, E.provide(context)),
|
|
74
|
+
verifyEmailLink: flow(verifyEmailLink, E.provide(context)),
|
|
75
|
+
});
|
|
76
|
+
}));
|
|
77
|
+
/* v8 ignore stop */
|
|
78
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/email/email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.test.d.ts","sourceRoot":"","sources":["../../src/email/email.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { RpcClient } from '@passlock/shared/dist/rpc/rpc';
|
|
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 { EmailService, EmailServiceLive } from './email';
|
|
7
|
+
import * as Fixture from './email.fixture';
|
|
8
|
+
import { AuthenticationService } from '../authentication/authenticate';
|
|
9
|
+
import { StorageService } from '../storage/storage';
|
|
10
|
+
describe('verifyEmailCode should', () => {
|
|
11
|
+
test('return true 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).toBe(true);
|
|
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.unit);
|
|
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.unit);
|
|
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.verifyEmailReq);
|
|
68
|
+
});
|
|
69
|
+
const rpcClientTest = L.effect(RpcClient, E.sync(() => {
|
|
70
|
+
const rpcMock = mock();
|
|
71
|
+
rpcMock.verifyEmail.mockReturnValue(E.succeed(Fixture.verifyEmailRes));
|
|
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
|
+
// LocationSearch return ?code=code
|
|
86
|
+
// and we expect rpcClient to be called with code
|
|
87
|
+
const rpcClient = yield* _(RpcClient);
|
|
88
|
+
expect(rpcClient.verifyEmail).toBeCalledWith(Fixture.verifyEmailReq);
|
|
89
|
+
});
|
|
90
|
+
const rpcClientTest = L.effect(RpcClient, E.sync(() => {
|
|
91
|
+
const rpcMock = mock();
|
|
92
|
+
rpcMock.verifyEmail.mockReturnValue(E.succeed(Fixture.verifyEmailRes));
|
|
93
|
+
return rpcMock;
|
|
94
|
+
}));
|
|
95
|
+
const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.storageServiceTest), L.provide(Fixture.authenticationServiceTest), L.provide(rpcClientTest));
|
|
96
|
+
const layers = L.merge(service, rpcClientTest);
|
|
97
|
+
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
98
|
+
return E.runPromise(effect);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=email.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.test.js","sourceRoot":"","sources":["../../src/email/email.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fire DOM events
|
|
3
|
+
*/
|
|
4
|
+
import { InternalBrowserError } from '@passlock/shared/dist/error/error';
|
|
5
|
+
import { Effect } from 'effect';
|
|
6
|
+
export declare const DebugMessage = "PasslogDebugMessage";
|
|
7
|
+
export declare const fireEvent: (message: string) => Effect.Effect<void, InternalBrowserError, never>;
|
|
8
|
+
export declare function isPasslockEvent(event: Event): event is CustomEvent;
|
|
9
|
+
//# sourceMappingURL=event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B,eAAO,MAAM,YAAY,wBAAwB,CAAA;AAEjD,eAAO,MAAM,SAAS,YAAa,MAAM,qDAUxC,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,WAAW,CAGlE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fire DOM events
|
|
3
|
+
*/
|
|
4
|
+
import { InternalBrowserError } from '@passlock/shared/dist/error/error';
|
|
5
|
+
import { Effect } from 'effect';
|
|
6
|
+
export const DebugMessage = 'PasslogDebugMessage';
|
|
7
|
+
export const fireEvent = (message) => {
|
|
8
|
+
return Effect.try({
|
|
9
|
+
try: () => {
|
|
10
|
+
const evt = new CustomEvent(DebugMessage, { detail: message });
|
|
11
|
+
globalThis.dispatchEvent(evt);
|
|
12
|
+
},
|
|
13
|
+
catch: () => {
|
|
14
|
+
return new InternalBrowserError({ message: 'Unable to fire custom event' });
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
export function isPasslockEvent(event) {
|
|
19
|
+
if (event.type !== DebugMessage)
|
|
20
|
+
return false;
|
|
21
|
+
return 'detail' in event;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.node.test.d.ts","sourceRoot":"","sources":["../../src/event/event.node.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Effect, pipe } from 'effect';
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
3
|
+
import { fireEvent } from './event';
|
|
4
|
+
// @vitest-environment node
|
|
5
|
+
describe('isPasslockEvent', () => {
|
|
6
|
+
test("return a Passlock error if custom events aren't supported", async () => {
|
|
7
|
+
const program = pipe(fireEvent('hello world'), Effect.flip, Effect.tap(e => {
|
|
8
|
+
expect(e._tag).toBe('InternalBrowserError');
|
|
9
|
+
expect(e.message).toBe('Unable to fire custom event');
|
|
10
|
+
}));
|
|
11
|
+
await Effect.runPromise(program);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=event.node.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.node.test.js","sourceRoot":"","sources":["../../src/event/event.node.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEnC,2BAA2B;AAE3B,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,OAAO,GAAG,IAAI,CAClB,SAAS,CAAC,aAAa,CAAC,EACxB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACb,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YAC3C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QACvD,CAAC,CAAC,CACH,CAAA;QAED,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.test.d.ts","sourceRoot":"","sources":["../../src/event/event.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
3
|
+
import { DebugMessage, fireEvent, isPasslockEvent } from './event';
|
|
4
|
+
describe('fireEvent', () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.restoreAllMocks();
|
|
7
|
+
});
|
|
8
|
+
test('fire a custom log event', () => {
|
|
9
|
+
const effect = fireEvent('hello world');
|
|
10
|
+
const eventSpy = vi.spyOn(globalThis, 'dispatchEvent');
|
|
11
|
+
Effect.runSync(effect);
|
|
12
|
+
const expectedEvent = new CustomEvent(DebugMessage, {
|
|
13
|
+
detail: 'hello world',
|
|
14
|
+
});
|
|
15
|
+
expect(eventSpy).toHaveBeenCalledWith(expectedEvent);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('isPasslockEvent', () => {
|
|
19
|
+
test('return true for our custom event', () => {
|
|
20
|
+
const passlockEvent = new CustomEvent(DebugMessage, {
|
|
21
|
+
detail: 'hello world',
|
|
22
|
+
});
|
|
23
|
+
expect(isPasslockEvent(passlockEvent)).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
test('return false for other events', () => {
|
|
26
|
+
const otherEvent = new MouseEvent('click');
|
|
27
|
+
expect(isPasslockEvent(otherEvent)).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=event.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.test.js","sourceRoot":"","sources":["../../src/event/event.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAGlE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;QACtD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAEtB,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE;YAClD,MAAM,EAAE,aAAa;SACtB,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE;YAClD,MAAM,EAAE,aAAa;SACtB,CAAC,CAAA;QAEF,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|