@passlock/client 0.9.22 → 0.9.24
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 +10 -5
- package/README.template.md +130 -0
- package/dist/authentication/authenticate.d.ts +16 -16
- package/dist/authentication/authenticate.fixture.d.ts +21 -7
- 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 +9 -5
- package/dist/capabilities/capabilities.js +11 -2
- 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 +23 -46
- package/dist/effect.js +55 -51
- package/dist/effect.js.map +1 -1
- package/dist/email/email.d.ts +42 -12
- package/dist/email/email.fixture.d.ts +19 -5
- package/dist/email/email.fixture.js +5 -4
- package/dist/email/email.fixture.js.map +1 -1
- package/dist/email/email.js +44 -8
- package/dist/email/email.js.map +1 -1
- package/dist/event/event.d.ts +4 -2
- package/dist/event/event.js +4 -1
- 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 +14 -1
- package/dist/logging/eventLogger.js.map +1 -1
- package/dist/registration/register.d.ts +19 -22
- package/dist/registration/register.fixture.d.ts +20 -6
- 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 +1 -2
- package/dist/rpc/authentication.js +2 -1
- package/dist/rpc/authentication.js.map +1 -1
- package/dist/rpc/client.d.ts +5 -2
- package/dist/rpc/client.js +12 -3
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/config.d.ts +0 -1
- package/dist/rpc/connection.d.ts +1 -2
- package/dist/rpc/connection.js +2 -1
- package/dist/rpc/connection.js.map +1 -1
- package/dist/rpc/registration.d.ts +1 -2
- package/dist/rpc/registration.js +2 -1
- package/dist/rpc/registration.js.map +1 -1
- package/dist/rpc/social.d.ts +1 -2
- package/dist/rpc/social.js +2 -1
- package/dist/rpc/social.js.map +1 -1
- package/dist/rpc/user.d.ts +1 -2
- package/dist/rpc/user.js +2 -1
- package/dist/rpc/user.js.map +1 -1
- package/dist/social/social.d.ts +17 -24
- package/dist/social/social.fixture.d.ts +22 -10
- package/dist/social/social.fixture.js +8 -14
- package/dist/social/social.fixture.js.map +1 -1
- package/dist/social/social.js +15 -11
- package/dist/social/social.js.map +1 -1
- package/dist/storage/storage.d.ts +41 -13
- 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 +52 -15
- package/dist/storage/storage.js.map +1 -1
- package/dist/test/fixtures.d.ts +2 -3
- package/dist/test/fixtures.js +20 -5
- package/dist/test/fixtures.js.map +1 -1
- package/dist/user/user.d.ts +9 -6
- 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 +12 -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 +38 -30
- package/src/authentication/authenticate.fixture.ts +10 -7
- package/src/authentication/authenticate.test.ts +61 -18
- package/src/authentication/authenticate.ts +37 -33
- package/src/capabilities/capabilities.ts +11 -9
- package/src/connection/connection.fixture.ts +4 -1
- package/src/connection/connection.test.ts +4 -3
- package/src/connection/connection.ts +10 -8
- package/src/effect.ts +129 -134
- package/src/email/email.fixture.ts +7 -4
- package/src/email/email.test.ts +6 -5
- package/src/email/email.ts +27 -17
- package/src/event/event.node.test.ts +1 -0
- package/src/event/event.test.ts +1 -0
- package/src/event/event.ts +2 -1
- package/src/index.ts +235 -173
- package/src/logging/eventLogger.test.ts +2 -1
- package/src/logging/eventLogger.ts +3 -3
- package/src/registration/register.fixture.ts +16 -8
- package/src/registration/register.test.ts +16 -10
- package/src/registration/register.ts +37 -35
- package/src/rpc/authentication.ts +43 -0
- package/src/rpc/client.ts +174 -0
- package/src/rpc/config.ts +18 -0
- package/src/rpc/connection.ts +30 -0
- package/src/rpc/registration.ts +41 -0
- package/src/rpc/social.ts +45 -0
- package/src/rpc/user.ts +57 -0
- package/src/social/social.fixture.ts +12 -18
- package/src/social/social.test.ts +16 -30
- package/src/social/social.ts +22 -47
- package/src/storage/storage.fixture.ts +4 -4
- package/src/storage/storage.test.ts +29 -19
- package/src/storage/storage.ts +37 -36
- package/src/test/fixtures.ts +23 -6
- package/src/user/user.fixture.ts +19 -7
- package/src/user/user.test.ts +3 -5
- package/src/user/user.ts +16 -10
- 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/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/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/event/event.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/logging/eventLogger.d.ts.map +0 -1
- package/dist/registration/register.d.ts.map +0 -1
- package/dist/registration/register.fixture.d.ts.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/storage/storage.d.ts.map +0 -1
- package/dist/storage/storage.fixture.d.ts.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/version.d.ts.map +0 -1
- package/src/config.ts +0 -42
package/dist/social/social.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Passkey authentication effects
|
|
3
|
+
*/
|
|
4
4
|
import { Context, Effect as E, Layer, flow } from 'effect';
|
|
5
|
-
|
|
5
|
+
import * as RPC from '@passlock/shared/dist/rpc/social.js';
|
|
6
|
+
import {} from '@passlock/shared/dist/error/error.js';
|
|
7
|
+
import { SocialClient } from '../rpc/social.js';
|
|
8
|
+
/* Service */
|
|
9
|
+
export class SocialService extends Context.Tag('@services/SocialService')() {
|
|
10
|
+
}
|
|
6
11
|
export const registerOidc = (request) => {
|
|
7
12
|
return E.gen(function* (_) {
|
|
8
13
|
yield* _(E.logInfo('Registering social account'));
|
|
9
14
|
const rpcClient = yield* _(SocialClient);
|
|
10
|
-
const rpcRequest = new
|
|
11
|
-
...request,
|
|
12
|
-
...(request.givenName ? { givenName: request.givenName } : {}),
|
|
13
|
-
...(request.familyName ? { familyName: request.familyName } : {})
|
|
14
|
-
});
|
|
15
|
+
const rpcRequest = new RPC.RegisterOidcReq(request);
|
|
15
16
|
const { principal } = yield* _(rpcClient.registerOidc(rpcRequest));
|
|
16
17
|
return principal;
|
|
17
18
|
});
|
|
@@ -20,16 +21,19 @@ export const authenticateOidc = (request) => {
|
|
|
20
21
|
return E.gen(function* (_) {
|
|
21
22
|
yield* _(E.logInfo('Authenticating with social account'));
|
|
22
23
|
const rpcClient = yield* _(SocialClient);
|
|
23
|
-
const rpcRequest = new
|
|
24
|
+
const rpcRequest = new RPC.AuthOidcReq(request);
|
|
24
25
|
const { principal } = yield* _(rpcClient.authenticateOidc(rpcRequest));
|
|
25
26
|
return principal;
|
|
26
27
|
});
|
|
27
28
|
};
|
|
29
|
+
/* Live */
|
|
30
|
+
/* v8 ignore start */
|
|
28
31
|
export const SocialServiceLive = Layer.effect(SocialService, E.gen(function* (_) {
|
|
29
32
|
const context = yield* _(E.context());
|
|
30
33
|
return SocialService.of({
|
|
31
34
|
registerOidc: flow(registerOidc, E.provide(context)),
|
|
32
|
-
authenticateOidc: flow(authenticateOidc, E.provide(context))
|
|
35
|
+
authenticateOidc: flow(authenticateOidc, E.provide(context)),
|
|
33
36
|
});
|
|
34
37
|
}));
|
|
38
|
+
/* v8 ignore stop */
|
|
35
39
|
//# sourceMappingURL=social.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social.js","sourceRoot":"","sources":["../../src/social/social.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"social.js","sourceRoot":"","sources":["../../src/social/social.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE1D,OAAO,KAAK,GAAG,MAAM,qCAAqC,CAAA;AAC1D,OAAO,EAAsC,MAAM,sCAAsC,CAAA;AAGzF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAgB/C,aAAa;AAEb,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAMtE;CAAG;AAMN,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAwB,EAC+B,EAAE;IACzD,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAA;QAEjD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAA;QAElE,OAAO,SAAS,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAA4B,EAC6B,EAAE;IAC3D,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAA;QAEzD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAA;QAEtE,OAAO,SAAS,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,UAAU;AAEV,qBAAqB;AACrB,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAC3C,aAAa,EACb,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAgB,CAAC,CAAA;IAEnD,OAAO,aAAa,CAAC,EAAE,CAAC;QACtB,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;KAC7D,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA;AACD,oBAAoB"}
|
|
@@ -1,28 +1,56 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Wrapper around local storage that allows us to store
|
|
3
|
+
* authentication tokens in local storage for a short period.
|
|
4
|
+
*/
|
|
2
5
|
import { Context, Effect as E, Layer, Option as O } from 'effect';
|
|
3
6
|
import type { NoSuchElementException } from 'effect/Cause';
|
|
7
|
+
import type { Principal } from '@passlock/shared/dist/schema/principal.js';
|
|
4
8
|
export type AuthType = 'email' | 'passkey' | 'apple' | 'google';
|
|
5
9
|
export type StoredToken = {
|
|
6
10
|
token: string;
|
|
7
11
|
authType: AuthType;
|
|
8
|
-
|
|
12
|
+
expiry: number;
|
|
9
13
|
};
|
|
10
|
-
|
|
14
|
+
declare const StorageService_base: Context.TagClass<StorageService, "@services/StorageService", {
|
|
11
15
|
storeToken: (principal: Principal) => E.Effect<void>;
|
|
12
16
|
getToken: (authType: AuthType) => E.Effect<StoredToken, NoSuchElementException>;
|
|
13
17
|
clearToken: (authType: AuthType) => E.Effect<void>;
|
|
14
18
|
clearExpiredToken: (authType: AuthType) => E.Effect<void>;
|
|
15
19
|
clearExpiredTokens: E.Effect<void>;
|
|
16
|
-
}
|
|
17
|
-
export declare
|
|
18
|
-
|
|
20
|
+
}>;
|
|
21
|
+
export declare class StorageService extends StorageService_base {
|
|
22
|
+
}
|
|
23
|
+
declare const BrowserStorage_base: Context.TagClass<BrowserStorage, "@services/Storage", Storage>;
|
|
24
|
+
export declare class BrowserStorage extends BrowserStorage_base {
|
|
25
|
+
}
|
|
19
26
|
export declare const buildKey: (authType: AuthType) => string;
|
|
20
27
|
export declare const compressToken: (principal: Principal) => string;
|
|
21
28
|
export declare const expandToken: (authType: AuthType) => (s: string) => O.Option<StoredToken>;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
export declare const
|
|
28
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Store compressed token in local storage
|
|
31
|
+
* @param principal
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
export declare const storeToken: (principal: Principal) => E.Effect<void, never, BrowserStorage>;
|
|
35
|
+
/**
|
|
36
|
+
* Get stored token from local storage
|
|
37
|
+
* @param authenticator
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
export declare const getToken: (authenticator: AuthType) => E.Effect<StoredToken, NoSuchElementException, BrowserStorage>;
|
|
41
|
+
/**
|
|
42
|
+
* Remove token from local storage
|
|
43
|
+
* @param authType
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
export declare const clearToken: (authType: AuthType) => E.Effect<void, never, BrowserStorage>;
|
|
47
|
+
/**
|
|
48
|
+
* Only clear if now > token.expireAt
|
|
49
|
+
* @param authType
|
|
50
|
+
* @param defer
|
|
51
|
+
* @returns
|
|
52
|
+
*/
|
|
53
|
+
export declare const clearExpiredToken: (authType: AuthType) => E.Effect<void, never, BrowserStorage>;
|
|
54
|
+
export declare const clearExpiredTokens: E.Effect<void, never, BrowserStorage>;
|
|
55
|
+
export declare const StorageServiceLive: Layer.Layer<StorageService, never, BrowserStorage>;
|
|
56
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Layer } from 'effect';
|
|
2
|
-
|
|
2
|
+
import { BrowserStorage } from './storage.js';
|
|
3
|
+
export declare const testLayers: (storage?: Layer.Layer<BrowserStorage>) => Layer.Layer<import("./storage.js").StorageService | BrowserStorage, never, never>;
|
|
3
4
|
export { principal } from '../test/fixtures.js';
|
|
4
|
-
//# sourceMappingURL=storage.fixture.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect as E, Layer, pipe } from 'effect';
|
|
2
2
|
import { mock } from 'vitest-mock-extended';
|
|
3
|
-
import {
|
|
4
|
-
const storageTest = Layer.effect(
|
|
3
|
+
import { BrowserStorage, StorageServiceLive } from './storage.js';
|
|
4
|
+
const storageTest = Layer.effect(BrowserStorage, E.sync(() => mock()));
|
|
5
5
|
export const testLayers = (storage = storageTest) => {
|
|
6
6
|
const storageService = pipe(StorageServiceLive, Layer.provide(storage));
|
|
7
7
|
return Layer.merge(storage, storageService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.fixture.js","sourceRoot":"","sources":["../../src/storage/storage.fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"storage.fixture.js","sourceRoot":"","sources":["../../src/storage/storage.fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAC9B,cAAc,EACd,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAW,CAAC,CAC9B,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAuC,WAAW,EAAE,EAAE;IAC/E,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IACvE,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;AAC7C,CAAC,CAAA;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA"}
|
package/dist/storage/storage.js
CHANGED
|
@@ -1,55 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrapper around local storage that allows us to store
|
|
3
|
+
* authentication tokens in local storage for a short period.
|
|
4
|
+
*/
|
|
1
5
|
import { Context, Effect as E, Layer, Option as O, flow, pipe } from 'effect';
|
|
2
|
-
|
|
3
|
-
export
|
|
6
|
+
/* Service */
|
|
7
|
+
export class StorageService extends Context.Tag('@services/StorageService')() {
|
|
8
|
+
}
|
|
9
|
+
export class BrowserStorage extends Context.Tag('@services/Storage')() {
|
|
10
|
+
}
|
|
4
11
|
export const buildKey = (authType) => `passlock:${authType}:token`;
|
|
12
|
+
// principal => token:expireAt
|
|
5
13
|
export const compressToken = (principal) => {
|
|
6
|
-
const expireAt = principal.
|
|
7
|
-
const token = principal.
|
|
8
|
-
return `${token}:${expireAt}`;
|
|
14
|
+
const expireAt = principal.exp.getTime();
|
|
15
|
+
const token = principal.jti;
|
|
16
|
+
return `${token}:${expireAt.toFixed(0)}`;
|
|
9
17
|
};
|
|
18
|
+
// token:expireAt => { authType, token, expireAt }
|
|
10
19
|
export const expandToken = (authType) => (s) => {
|
|
11
20
|
const tokens = s.split(':');
|
|
12
21
|
if (tokens.length !== 2)
|
|
13
22
|
return O.none();
|
|
14
23
|
const [token, expireAtString] = tokens;
|
|
24
|
+
if (token === undefined || expireAtString === undefined)
|
|
25
|
+
return O.none();
|
|
15
26
|
const parse = O.liftThrowable(Number.parseInt);
|
|
16
27
|
const expireAt = parse(expireAtString);
|
|
17
|
-
return O.map(expireAt,
|
|
28
|
+
return O.map(expireAt, expiry => ({ authType, token, expiry }));
|
|
18
29
|
};
|
|
30
|
+
/* Effects */
|
|
31
|
+
/**
|
|
32
|
+
* Store compressed token in local storage
|
|
33
|
+
* @param principal
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
19
36
|
export const storeToken = (principal) => {
|
|
20
37
|
return E.gen(function* (_) {
|
|
21
|
-
const localStorage = yield* _(
|
|
38
|
+
const localStorage = yield* _(BrowserStorage);
|
|
22
39
|
const storeEffect = E.try(() => {
|
|
23
40
|
const compressed = compressToken(principal);
|
|
24
|
-
const key = buildKey(principal.
|
|
41
|
+
const key = buildKey(principal.authType);
|
|
25
42
|
localStorage.setItem(key, compressed);
|
|
26
|
-
}).pipe(E.orElse(() => E.void));
|
|
43
|
+
}).pipe(E.orElse(() => E.void)); // We dont care if it fails
|
|
27
44
|
return yield* _(storeEffect);
|
|
28
45
|
});
|
|
29
46
|
};
|
|
30
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Get stored token from local storage
|
|
49
|
+
* @param authenticator
|
|
50
|
+
* @returns
|
|
51
|
+
*/
|
|
52
|
+
export const getToken = (authenticator) => {
|
|
31
53
|
return E.gen(function* (_) {
|
|
32
|
-
const localStorage = yield* _(
|
|
33
|
-
const getEffect = pipe(O.some(buildKey(
|
|
54
|
+
const localStorage = yield* _(BrowserStorage);
|
|
55
|
+
const getEffect = pipe(O.some(buildKey(authenticator)), O.flatMap(key => pipe(localStorage.getItem(key), O.fromNullable)), O.flatMap(expandToken(authenticator)), O.filter(({ expiry }) => expiry > Date.now()));
|
|
34
56
|
return yield* _(getEffect);
|
|
35
57
|
});
|
|
36
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* Remove token from local storage
|
|
61
|
+
* @param authType
|
|
62
|
+
* @returns
|
|
63
|
+
*/
|
|
37
64
|
export const clearToken = (authType) => {
|
|
38
65
|
return E.gen(function* (_) {
|
|
39
|
-
const localStorage = yield* _(
|
|
66
|
+
const localStorage = yield* _(BrowserStorage);
|
|
40
67
|
localStorage.removeItem(buildKey(authType));
|
|
41
68
|
});
|
|
42
69
|
};
|
|
70
|
+
/**
|
|
71
|
+
* Only clear if now > token.expireAt
|
|
72
|
+
* @param authType
|
|
73
|
+
* @param defer
|
|
74
|
+
* @returns
|
|
75
|
+
*/
|
|
43
76
|
export const clearExpiredToken = (authType) => {
|
|
44
77
|
const key = buildKey(authType);
|
|
45
78
|
const effect = E.gen(function* (_) {
|
|
46
|
-
const storage = yield* _(
|
|
79
|
+
const storage = yield* _(BrowserStorage);
|
|
47
80
|
const item = yield* _(O.fromNullable(storage.getItem(key)));
|
|
48
81
|
const token = yield* _(expandToken(authType)(item));
|
|
49
|
-
if (token.
|
|
82
|
+
if (token.expiry < Date.now()) {
|
|
50
83
|
storage.removeItem(key);
|
|
51
84
|
}
|
|
52
85
|
});
|
|
86
|
+
// we don't care if it fails
|
|
53
87
|
return pipe(effect, E.match({
|
|
54
88
|
onSuccess: () => E.void,
|
|
55
89
|
onFailure: () => E.void,
|
|
@@ -61,6 +95,8 @@ export const clearExpiredTokens = E.all([
|
|
|
61
95
|
clearExpiredToken('google'),
|
|
62
96
|
clearExpiredToken('apple'),
|
|
63
97
|
]);
|
|
98
|
+
/* Live */
|
|
99
|
+
/* v8 ignore start */
|
|
64
100
|
export const StorageServiceLive = Layer.effect(StorageService, E.gen(function* (_) {
|
|
65
101
|
const context = yield* _(E.context());
|
|
66
102
|
return {
|
|
@@ -71,4 +107,5 @@ export const StorageServiceLive = Layer.effect(StorageService, E.gen(function* (
|
|
|
71
107
|
clearExpiredTokens: pipe(clearExpiredTokens, E.provide(context)),
|
|
72
108
|
};
|
|
73
109
|
}));
|
|
110
|
+
/* v8 ignore stop */
|
|
74
111
|
//# sourceMappingURL=storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAe7E,aAAa;AAEb,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,EASxE;CAAG;AAEN,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAA2B;CAAG;AAElG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAkB,EAAE,EAAE,CAAC,YAAY,QAAQ,QAAQ,CAAA;AAE5E,8BAA8B;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAAU,EAAE;IAC5D,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAA;IAC3B,OAAO,GAAG,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;AAC1C,CAAC,CAAA;AAED,kDAAkD;AAClD,MAAM,CAAC,MAAM,WAAW,GACtB,CAAC,QAAkB,EAAE,EAAE,CACvB,CAAC,CAAS,EAAyB,EAAE;IACnC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAExC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,MAAM,CAAA;IACtC,IAAI,KAAK,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAExE,MAAM,KAAK,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,CAAA;IAEtC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AACjE,CAAC,CAAA;AAEH,aAAa;AAEb;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAoB,EAAyC,EAAE;IACxF,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;QAE7C,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;YAC7B,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;YAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YACxC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACvC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,CAAC,2BAA2B;QAE3D,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,aAAuB,EACwC,EAAE;IACjE,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;QAE7C,MAAM,SAAS,GAAG,IAAI,CACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAC/B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EACjE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EACrC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAC9C,CAAA;QAED,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAkB,EAAyC,EAAE;IACtF,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;QAC7C,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAkB,EAAyC,EAAE;IAC7F,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE9B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEnD,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC9B,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,4BAA4B;IAC5B,OAAO,IAAI,CACT,MAAM,EACN,CAAC,CAAC,KAAK,CAAC;QACN,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;QACvB,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;KACxB,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAA0C,CAAC,CAAC,GAAG,CAAC;IAC7E,iBAAiB,CAAC,SAAS,CAAC;IAC5B,iBAAiB,CAAC,OAAO,CAAC;IAC1B,iBAAiB,CAAC,QAAQ,CAAC;IAC3B,iBAAiB,CAAC,OAAO,CAAC;CAC3B,CAAC,CAAA;AAEF,UAAU;AAEV,qBAAqB;AACrB,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAC5C,cAAc,EACd,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAkB,CAAC,CAAA;IAErD,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;KACjE,CAAA;AACH,CAAC,CAAC,CACH,CAAA;AACD,oBAAoB"}
|
package/dist/test/fixtures.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
+
import { Layer as L } from 'effect';
|
|
1
2
|
import { BadRequest } from '@passlock/shared/dist/error/error.js';
|
|
2
3
|
import type { Principal } from '@passlock/shared/dist/schema/principal.js';
|
|
3
|
-
import { Layer as L } from 'effect';
|
|
4
4
|
import { Capabilities } from '../capabilities/capabilities.js';
|
|
5
5
|
import { StorageService, type StoredToken } from '../storage/storage.js';
|
|
6
6
|
export declare const session = "session";
|
|
7
7
|
export declare const token = "token";
|
|
8
8
|
export declare const code = "code";
|
|
9
9
|
export declare const authType = "passkey";
|
|
10
|
-
export declare const
|
|
10
|
+
export declare const expiry: number;
|
|
11
11
|
export declare const principal: Principal;
|
|
12
12
|
export declare const capabilitiesTest: L.Layer<Capabilities, never, never>;
|
|
13
13
|
export declare const storedToken: StoredToken;
|
|
14
14
|
export declare const storageServiceTest: L.Layer<StorageService, never, never>;
|
|
15
15
|
export declare const notImplemented: BadRequest;
|
|
16
|
-
//# sourceMappingURL=fixtures.d.ts.map
|
package/dist/test/fixtures.js
CHANGED
|
@@ -1,19 +1,34 @@
|
|
|
1
|
-
import { BadRequest } from '@passlock/shared/dist/error/error.js';
|
|
2
1
|
import { Effect as E, Layer as L } from 'effect';
|
|
2
|
+
import { BadRequest } from '@passlock/shared/dist/error/error.js';
|
|
3
3
|
import { Capabilities } from '../capabilities/capabilities.js';
|
|
4
4
|
import { StorageService } from '../storage/storage.js';
|
|
5
5
|
export const session = 'session';
|
|
6
6
|
export const token = 'token';
|
|
7
7
|
export const code = 'code';
|
|
8
8
|
export const authType = 'passkey';
|
|
9
|
-
export const
|
|
9
|
+
export const expiry = Date.now() + 10000;
|
|
10
10
|
export const principal = {
|
|
11
|
+
jti: 'token',
|
|
11
12
|
token: 'token',
|
|
13
|
+
sub: 'user-1',
|
|
14
|
+
iss: 'idp.passlock.dev',
|
|
15
|
+
aud: 'tenancy_id',
|
|
16
|
+
iat: new Date(),
|
|
17
|
+
nbf: new Date(),
|
|
18
|
+
exp: new Date(Date.now() + 5 * 60 * 1000),
|
|
19
|
+
email: 'john.doe@gmail.com',
|
|
20
|
+
givenName: 'john',
|
|
21
|
+
familyName: 'doe',
|
|
22
|
+
emailVerified: false,
|
|
23
|
+
authType: 'passkey',
|
|
24
|
+
authId: 'auth-1',
|
|
25
|
+
userVerified: true,
|
|
26
|
+
// legacy
|
|
12
27
|
user: {
|
|
13
|
-
id: '1',
|
|
14
|
-
email: 'john.doe@gmail.com',
|
|
28
|
+
id: 'user-1',
|
|
15
29
|
givenName: 'john',
|
|
16
30
|
familyName: 'doe',
|
|
31
|
+
email: 'john.doe@gmail.com',
|
|
17
32
|
emailVerified: false,
|
|
18
33
|
},
|
|
19
34
|
authStatement: {
|
|
@@ -29,7 +44,7 @@ export const capabilitiesTest = L.succeed(Capabilities, Capabilities.of({
|
|
|
29
44
|
autofillSupport: E.void,
|
|
30
45
|
isAutofillSupport: E.succeed(true),
|
|
31
46
|
}));
|
|
32
|
-
export const storedToken = { token, authType,
|
|
47
|
+
export const storedToken = { token, authType, expiry };
|
|
33
48
|
export const storageServiceTest = L.succeed(StorageService, StorageService.of({
|
|
34
49
|
storeToken: () => E.void,
|
|
35
50
|
getToken: () => E.succeed(storedToken),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/test/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/test/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAoB,MAAM,uBAAuB,CAAA;AAExE,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAA;AAChC,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,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;AAExC,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,GAAG,EAAE,OAAO;IACZ,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,IAAI,IAAI,EAAE;IACf,GAAG,EAAE,IAAI,IAAI,EAAE;IACf,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACzC,KAAK,EAAE,oBAAoB;IAC3B,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,KAAK;IACpB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,IAAI;IAClB,SAAS;IACT,IAAI,EAAE;QACJ,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE,MAAM;QACjB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,oBAAoB;QAC3B,aAAa,EAAE,KAAK;KACrB;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,SAAS;QACnB,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;KAC3B;IACD,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,OAAO,CACvC,YAAY,EACZ,YAAY,CAAC,EAAE,CAAC;IACd,cAAc,EAAE,CAAC,CAAC,IAAI;IACtB,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACjC,eAAe,EAAE,CAAC,CAAC,IAAI;IACvB,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;CACnC,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;AAEnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,OAAO,CACzC,cAAc,EACd,cAAc,CAAC,EAAE,CAAC;IAChB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;IACxB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;IACxB,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;IAC/B,kBAAkB,EAAE,CAAC,CAAC,IAAI;CAC3B,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA"}
|
package/dist/user/user.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for an existing user
|
|
3
|
+
*/
|
|
4
|
+
import { Context, Effect as E, Layer } from 'effect';
|
|
1
5
|
import type { BadRequest, Disabled, NotFound } from '@passlock/shared/dist/error/error.js';
|
|
2
|
-
import { UserClient } from '@passlock/shared/dist/rpc/user.js';
|
|
3
6
|
import type { VerifyEmail } from '@passlock/shared/dist/schema/email.js';
|
|
4
|
-
import {
|
|
7
|
+
import { UserClient } from '../rpc/user.js';
|
|
5
8
|
export type Email = {
|
|
6
9
|
email: string;
|
|
7
10
|
};
|
|
@@ -9,14 +12,14 @@ export type ResendEmail = VerifyEmail & {
|
|
|
9
12
|
userId: string;
|
|
10
13
|
};
|
|
11
14
|
export type ResendEmailErrors = BadRequest | NotFound | Disabled;
|
|
12
|
-
|
|
15
|
+
declare const UserService_base: Context.TagClass<UserService, "@services/UserService", {
|
|
13
16
|
isExistingUser: (request: Email) => E.Effect<boolean, BadRequest>;
|
|
14
17
|
resendVerificationEmail: (request: ResendEmail) => E.Effect<void, ResendEmailErrors>;
|
|
15
|
-
}
|
|
16
|
-
export declare
|
|
18
|
+
}>;
|
|
19
|
+
export declare class UserService extends UserService_base {
|
|
20
|
+
}
|
|
17
21
|
type Dependencies = UserClient;
|
|
18
22
|
export declare const isExistingUser: (request: Email) => E.Effect<boolean, BadRequest, Dependencies>;
|
|
19
23
|
export declare const resendVerificationEmail: (request: ResendEmail) => E.Effect<void, ResendEmailErrors, Dependencies>;
|
|
20
24
|
export declare const UserServiceLive: Layer.Layer<UserService, never, UserClient>;
|
|
21
25
|
export {};
|
|
22
|
-
//# sourceMappingURL=user.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { IsExistingUserReq, IsExistingUserRes, ResendEmailReq, ResendEmailRes, UserClient, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js';
|
|
2
1
|
import { Layer as L } from 'effect';
|
|
2
|
+
import { IsExistingUserReq, IsExistingUserRes, ResendEmailReq, ResendEmailRes, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js';
|
|
3
|
+
import { UserClient } from '../rpc/user.js';
|
|
3
4
|
import type { ResendEmail } from './user.js';
|
|
4
5
|
export declare const email = "jdoe@gmail.com";
|
|
5
6
|
export declare const isRegisteredReq: IsExistingUserReq;
|
|
@@ -9,4 +10,3 @@ export declare const resendEmailReq: ResendEmail;
|
|
|
9
10
|
export declare const rpcResendEmailReq: ResendEmailReq;
|
|
10
11
|
export declare const rpcResendEmailRes: ResendEmailRes;
|
|
11
12
|
export declare const rpcClientTest: L.Layer<UserClient, never, never>;
|
|
12
|
-
//# sourceMappingURL=user.fixture.d.ts.map
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Effect as E, Layer as L, Option as O } from 'effect';
|
|
2
|
+
import { IsExistingUserReq, IsExistingUserRes, ResendEmailReq, ResendEmailRes, VerifyEmailRes, } from '@passlock/shared/dist/rpc/user.js';
|
|
3
3
|
import * as Fixtures from '../test/fixtures.js';
|
|
4
|
+
import { UserClient } from '../rpc/user.js';
|
|
4
5
|
export const email = 'jdoe@gmail.com';
|
|
5
6
|
export const isRegisteredReq = new IsExistingUserReq({ email });
|
|
6
|
-
export const isRegisteredRes = new IsExistingUserRes({ existingUser: false });
|
|
7
|
+
export const isRegisteredRes = new IsExistingUserRes({ existingUser: false, detail: O.none() });
|
|
7
8
|
export const verifyEmailRes = new VerifyEmailRes({ principal: Fixtures.principal });
|
|
8
9
|
export const resendEmailReq = { userId: '123', method: 'code' };
|
|
9
|
-
export const rpcResendEmailReq = new ResendEmailReq({
|
|
10
|
+
export const rpcResendEmailReq = new ResendEmailReq({
|
|
11
|
+
userId: '123',
|
|
12
|
+
verifyEmail: { method: 'code' },
|
|
13
|
+
});
|
|
10
14
|
export const rpcResendEmailRes = new ResendEmailRes({});
|
|
11
15
|
export const rpcClientTest = L.succeed(UserClient, UserClient.of({
|
|
12
|
-
isExistingUser: () => E.succeed({ existingUser: true }),
|
|
16
|
+
isExistingUser: () => E.succeed({ existingUser: true, detail: O.none() }),
|
|
13
17
|
verifyEmail: () => E.succeed(verifyEmailRes),
|
|
14
18
|
resendVerificationEmail: () => E.fail(Fixtures.notImplemented),
|
|
15
19
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.fixture.js","sourceRoot":"","sources":["../../src/user/user.fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"user.fixture.js","sourceRoot":"","sources":["../../src/user/user.fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE7D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,mCAAmC,CAAA;AAE1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAG3C,MAAM,CAAC,MAAM,KAAK,GAAG,gBAAgB,CAAA;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,iBAAiB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC/F,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;AACnF,MAAM,CAAC,MAAM,cAAc,GAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,cAAc,CAAC;IAClD,MAAM,EAAE,KAAK;IACb,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;CAChC,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAA;AAEvD,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,cAAc,CAAC;IAC5C,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;CAC/D,CAAC,CACH,CAAA"}
|
package/dist/user/user.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Check for an existing user
|
|
3
|
+
*/
|
|
2
4
|
import { Context, Effect as E, Layer, flow } from 'effect';
|
|
3
|
-
|
|
5
|
+
import { IsExistingUserReq, ResendEmailReq } from '@passlock/shared/dist/rpc/user.js';
|
|
6
|
+
import { UserClient } from '../rpc/user.js';
|
|
7
|
+
/* Service */
|
|
8
|
+
export class UserService extends Context.Tag('@services/UserService')() {
|
|
9
|
+
}
|
|
4
10
|
export const isExistingUser = (request) => {
|
|
5
11
|
return E.gen(function* (_) {
|
|
6
12
|
yield* _(E.logInfo('Checking registration status'));
|
|
@@ -19,11 +25,14 @@ export const resendVerificationEmail = (request) => {
|
|
|
19
25
|
yield* _(rpcClient.resendVerificationEmail(new ResendEmailReq({ userId, verifyEmail })));
|
|
20
26
|
});
|
|
21
27
|
};
|
|
28
|
+
/* Live */
|
|
29
|
+
/* v8 ignore start */
|
|
22
30
|
export const UserServiceLive = Layer.effect(UserService, E.gen(function* (_) {
|
|
23
31
|
const context = yield* _(E.context());
|
|
24
32
|
return UserService.of({
|
|
25
33
|
isExistingUser: flow(isExistingUser, E.provide(context)),
|
|
26
|
-
resendVerificationEmail: flow(resendVerificationEmail, E.provide(context))
|
|
34
|
+
resendVerificationEmail: flow(resendVerificationEmail, E.provide(context)),
|
|
27
35
|
});
|
|
28
36
|
}));
|
|
37
|
+
/* v8 ignore stop */
|
|
29
38
|
//# sourceMappingURL=user.js.map
|
package/dist/user/user.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/user/user.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/user/user.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAG1D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAGrF,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAW3C,aAAa;AAEb,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAMlE;CAAG;AAMN,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAc,EAA+C,EAAE;IAC5F,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;QAEtC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAA;QAC1C,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAE3F,OAAO,YAAY,CAAA;IACrB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAoB,EAC6B,EAAE;IACnD,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;QAEtC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAA;QAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAA;QAC1C,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,UAAU;AAEV,qBAAqB;AACrB,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CACzC,WAAW,EACX,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAc,CAAC,CAAA;IACjD,OAAO,WAAW,CAAC,EAAE,CAAC;QACpB,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;KAC3E,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA;AACD,oBAAoB"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
//# sourceMappingURL=version.d.ts.map
|
|
1
|
+
export declare const PASSLOCK_CLIENT_VERSION = "0.9.24";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const
|
|
1
|
+
export const PASSLOCK_CLIENT_VERSION = '0.9.24';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAA"}
|