@voidhash/mimic-effect 0.0.9 → 1.0.0-beta.2
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/.turbo/turbo-build.log +136 -90
- package/README.md +385 -0
- package/dist/ColdStorage.cjs +60 -0
- package/dist/ColdStorage.d.cts +53 -0
- package/dist/ColdStorage.d.cts.map +1 -0
- package/dist/ColdStorage.d.mts +53 -0
- package/dist/ColdStorage.d.mts.map +1 -0
- package/dist/ColdStorage.mjs +60 -0
- package/dist/ColdStorage.mjs.map +1 -0
- package/dist/DocumentManager.cjs +263 -82
- package/dist/DocumentManager.d.cts +44 -22
- package/dist/DocumentManager.d.cts.map +1 -1
- package/dist/DocumentManager.d.mts +44 -22
- package/dist/DocumentManager.d.mts.map +1 -1
- package/dist/DocumentManager.mjs +259 -67
- package/dist/DocumentManager.mjs.map +1 -1
- package/dist/Errors.cjs +54 -0
- package/dist/Errors.d.cts +96 -0
- package/dist/Errors.d.cts.map +1 -0
- package/dist/Errors.d.mts +96 -0
- package/dist/Errors.d.mts.map +1 -0
- package/dist/Errors.mjs +48 -0
- package/dist/Errors.mjs.map +1 -0
- package/dist/HotStorage.cjs +100 -0
- package/dist/HotStorage.d.cts +70 -0
- package/dist/HotStorage.d.cts.map +1 -0
- package/dist/HotStorage.d.mts +70 -0
- package/dist/HotStorage.d.mts.map +1 -0
- package/dist/HotStorage.mjs +100 -0
- package/dist/HotStorage.mjs.map +1 -0
- package/dist/Metrics.cjs +143 -0
- package/dist/Metrics.d.cts +31 -0
- package/dist/Metrics.d.cts.map +1 -0
- package/dist/Metrics.d.mts +31 -0
- package/dist/Metrics.d.mts.map +1 -0
- package/dist/Metrics.mjs +126 -0
- package/dist/Metrics.mjs.map +1 -0
- package/dist/MimicAuthService.cjs +61 -45
- package/dist/MimicAuthService.d.cts +61 -48
- package/dist/MimicAuthService.d.cts.map +1 -1
- package/dist/MimicAuthService.d.mts +61 -48
- package/dist/MimicAuthService.d.mts.map +1 -1
- package/dist/MimicAuthService.mjs +60 -36
- package/dist/MimicAuthService.mjs.map +1 -1
- package/dist/MimicClusterServerEngine.cjs +521 -0
- package/dist/MimicClusterServerEngine.d.cts +17 -0
- package/dist/MimicClusterServerEngine.d.cts.map +1 -0
- package/dist/MimicClusterServerEngine.d.mts +17 -0
- package/dist/MimicClusterServerEngine.d.mts.map +1 -0
- package/dist/MimicClusterServerEngine.mjs +523 -0
- package/dist/MimicClusterServerEngine.mjs.map +1 -0
- package/dist/MimicServer.cjs +205 -96
- package/dist/MimicServer.d.cts +9 -110
- package/dist/MimicServer.d.cts.map +1 -1
- package/dist/MimicServer.d.mts +9 -110
- package/dist/MimicServer.d.mts.map +1 -1
- package/dist/MimicServer.mjs +206 -90
- package/dist/MimicServer.mjs.map +1 -1
- package/dist/MimicServerEngine.cjs +97 -0
- package/dist/MimicServerEngine.d.cts +78 -0
- package/dist/MimicServerEngine.d.cts.map +1 -0
- package/dist/MimicServerEngine.d.mts +78 -0
- package/dist/MimicServerEngine.d.mts.map +1 -0
- package/dist/MimicServerEngine.mjs +97 -0
- package/dist/MimicServerEngine.mjs.map +1 -0
- package/dist/PresenceManager.cjs +75 -91
- package/dist/PresenceManager.d.cts +17 -66
- package/dist/PresenceManager.d.cts.map +1 -1
- package/dist/PresenceManager.d.mts +17 -66
- package/dist/PresenceManager.d.mts.map +1 -1
- package/dist/PresenceManager.mjs +74 -78
- package/dist/PresenceManager.mjs.map +1 -1
- package/dist/Protocol.cjs +146 -0
- package/dist/Protocol.d.cts +203 -0
- package/dist/Protocol.d.cts.map +1 -0
- package/dist/Protocol.d.mts +203 -0
- package/dist/Protocol.d.mts.map +1 -0
- package/dist/Protocol.mjs +132 -0
- package/dist/Protocol.mjs.map +1 -0
- package/dist/Types.d.cts +172 -0
- package/dist/Types.d.cts.map +1 -0
- package/dist/Types.d.mts +172 -0
- package/dist/Types.d.mts.map +1 -0
- package/dist/_virtual/rolldown_runtime.cjs +1 -25
- package/dist/_virtual/rolldown_runtime.mjs +4 -1
- package/dist/index.cjs +37 -75
- package/dist/index.d.cts +13 -12
- package/dist/index.d.mts +13 -12
- package/dist/index.mjs +12 -12
- package/dist/testing/ColdStorageTestSuite.cjs +508 -0
- package/dist/testing/ColdStorageTestSuite.d.cts +36 -0
- package/dist/testing/ColdStorageTestSuite.d.cts.map +1 -0
- package/dist/testing/ColdStorageTestSuite.d.mts +36 -0
- package/dist/testing/ColdStorageTestSuite.d.mts.map +1 -0
- package/dist/testing/ColdStorageTestSuite.mjs +508 -0
- package/dist/testing/ColdStorageTestSuite.mjs.map +1 -0
- package/dist/testing/FailingStorage.cjs +135 -0
- package/dist/testing/FailingStorage.d.cts +43 -0
- package/dist/testing/FailingStorage.d.cts.map +1 -0
- package/dist/testing/FailingStorage.d.mts +43 -0
- package/dist/testing/FailingStorage.d.mts.map +1 -0
- package/dist/testing/FailingStorage.mjs +136 -0
- package/dist/testing/FailingStorage.mjs.map +1 -0
- package/dist/testing/HotStorageTestSuite.cjs +585 -0
- package/dist/testing/HotStorageTestSuite.d.cts +40 -0
- package/dist/testing/HotStorageTestSuite.d.cts.map +1 -0
- package/dist/testing/HotStorageTestSuite.d.mts +40 -0
- package/dist/testing/HotStorageTestSuite.d.mts.map +1 -0
- package/dist/testing/HotStorageTestSuite.mjs +585 -0
- package/dist/testing/HotStorageTestSuite.mjs.map +1 -0
- package/dist/testing/StorageIntegrationTestSuite.cjs +349 -0
- package/dist/testing/StorageIntegrationTestSuite.d.cts +35 -0
- package/dist/testing/StorageIntegrationTestSuite.d.cts.map +1 -0
- package/dist/testing/StorageIntegrationTestSuite.d.mts +35 -0
- package/dist/testing/StorageIntegrationTestSuite.d.mts.map +1 -0
- package/dist/testing/StorageIntegrationTestSuite.mjs +349 -0
- package/dist/testing/StorageIntegrationTestSuite.mjs.map +1 -0
- package/dist/testing/assertions.cjs +114 -0
- package/dist/testing/assertions.mjs +109 -0
- package/dist/testing/assertions.mjs.map +1 -0
- package/dist/testing/index.cjs +14 -0
- package/dist/testing/index.d.cts +6 -0
- package/dist/testing/index.d.mts +6 -0
- package/dist/testing/index.mjs +7 -0
- package/dist/testing/types.cjs +15 -0
- package/dist/testing/types.d.cts +90 -0
- package/dist/testing/types.d.cts.map +1 -0
- package/dist/testing/types.d.mts +90 -0
- package/dist/testing/types.d.mts.map +1 -0
- package/dist/testing/types.mjs +16 -0
- package/dist/testing/types.mjs.map +1 -0
- package/package.json +18 -3
- package/src/ColdStorage.ts +136 -0
- package/src/DocumentManager.ts +550 -190
- package/src/Errors.ts +114 -0
- package/src/HotStorage.ts +239 -0
- package/src/Metrics.ts +187 -0
- package/src/MimicAuthService.ts +126 -64
- package/src/MimicClusterServerEngine.ts +946 -0
- package/src/MimicServer.ts +448 -195
- package/src/MimicServerEngine.ts +276 -0
- package/src/PresenceManager.ts +169 -240
- package/src/Protocol.ts +350 -0
- package/src/Types.ts +231 -0
- package/src/index.ts +57 -23
- package/src/testing/ColdStorageTestSuite.ts +589 -0
- package/src/testing/FailingStorage.ts +286 -0
- package/src/testing/HotStorageTestSuite.ts +762 -0
- package/src/testing/StorageIntegrationTestSuite.ts +504 -0
- package/src/testing/assertions.ts +181 -0
- package/src/testing/index.ts +83 -0
- package/src/testing/types.ts +100 -0
- package/tests/ColdStorage.test.ts +24 -0
- package/tests/DocumentManager.test.ts +158 -287
- package/tests/HotStorage.test.ts +24 -0
- package/tests/MimicAuthService.test.ts +102 -134
- package/tests/MimicClusterServerEngine.test.ts +587 -0
- package/tests/MimicServer.test.ts +90 -226
- package/tests/MimicServerEngine.test.ts +521 -0
- package/tests/PresenceManager.test.ts +22 -63
- package/tests/Protocol.test.ts +190 -0
- package/tests/StorageIntegration.test.ts +259 -0
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +1 -1
- package/dist/DocumentProtocol.cjs +0 -94
- package/dist/DocumentProtocol.d.cts +0 -113
- package/dist/DocumentProtocol.d.cts.map +0 -1
- package/dist/DocumentProtocol.d.mts +0 -113
- package/dist/DocumentProtocol.d.mts.map +0 -1
- package/dist/DocumentProtocol.mjs +0 -89
- package/dist/DocumentProtocol.mjs.map +0 -1
- package/dist/MimicConfig.cjs +0 -60
- package/dist/MimicConfig.d.cts +0 -141
- package/dist/MimicConfig.d.cts.map +0 -1
- package/dist/MimicConfig.d.mts +0 -141
- package/dist/MimicConfig.d.mts.map +0 -1
- package/dist/MimicConfig.mjs +0 -50
- package/dist/MimicConfig.mjs.map +0 -1
- package/dist/MimicDataStorage.cjs +0 -83
- package/dist/MimicDataStorage.d.cts +0 -113
- package/dist/MimicDataStorage.d.cts.map +0 -1
- package/dist/MimicDataStorage.d.mts +0 -113
- package/dist/MimicDataStorage.d.mts.map +0 -1
- package/dist/MimicDataStorage.mjs +0 -74
- package/dist/MimicDataStorage.mjs.map +0 -1
- package/dist/WebSocketHandler.cjs +0 -365
- package/dist/WebSocketHandler.d.cts +0 -34
- package/dist/WebSocketHandler.d.cts.map +0 -1
- package/dist/WebSocketHandler.d.mts +0 -34
- package/dist/WebSocketHandler.d.mts.map +0 -1
- package/dist/WebSocketHandler.mjs +0 -355
- package/dist/WebSocketHandler.mjs.map +0 -1
- package/dist/auth/NoAuth.cjs +0 -43
- package/dist/auth/NoAuth.d.cts +0 -22
- package/dist/auth/NoAuth.d.cts.map +0 -1
- package/dist/auth/NoAuth.d.mts +0 -22
- package/dist/auth/NoAuth.d.mts.map +0 -1
- package/dist/auth/NoAuth.mjs +0 -36
- package/dist/auth/NoAuth.mjs.map +0 -1
- package/dist/errors.cjs +0 -74
- package/dist/errors.d.cts +0 -89
- package/dist/errors.d.cts.map +0 -1
- package/dist/errors.d.mts +0 -89
- package/dist/errors.d.mts.map +0 -1
- package/dist/errors.mjs +0 -67
- package/dist/errors.mjs.map +0 -1
- package/dist/storage/InMemoryDataStorage.cjs +0 -57
- package/dist/storage/InMemoryDataStorage.d.cts +0 -19
- package/dist/storage/InMemoryDataStorage.d.cts.map +0 -1
- package/dist/storage/InMemoryDataStorage.d.mts +0 -19
- package/dist/storage/InMemoryDataStorage.d.mts.map +0 -1
- package/dist/storage/InMemoryDataStorage.mjs +0 -48
- package/dist/storage/InMemoryDataStorage.mjs.map +0 -1
- package/src/DocumentProtocol.ts +0 -112
- package/src/MimicConfig.ts +0 -211
- package/src/MimicDataStorage.ts +0 -157
- package/src/WebSocketHandler.ts +0 -735
- package/src/auth/NoAuth.ts +0 -46
- package/src/errors.ts +0 -113
- package/src/storage/InMemoryDataStorage.ts +0 -66
- package/tests/DocumentProtocol.test.ts +0 -113
- package/tests/InMemoryDataStorage.test.ts +0 -190
- package/tests/MimicConfig.test.ts +0 -290
- package/tests/MimicDataStorage.test.ts +0 -190
- package/tests/NoAuth.test.ts +0 -94
- package/tests/WebSocketHandler.test.ts +0 -321
- package/tests/errors.test.ts +0 -77
package/src/MimicAuthService.ts
CHANGED
|
@@ -1,44 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* @voidhash/mimic-effect - MimicAuthService
|
|
3
|
+
*
|
|
4
|
+
* Authentication and authorization service interface and implementations.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
6
|
+
import { Context, Effect, Layer } from "effect";
|
|
7
|
+
import type { AuthContext, Permission } from "./Types";
|
|
8
|
+
import { AuthenticationError } from "./Errors";
|
|
9
9
|
|
|
10
10
|
// =============================================================================
|
|
11
|
-
//
|
|
11
|
+
// MimicAuthService Interface
|
|
12
12
|
// =============================================================================
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*/
|
|
25
|
-
export type AuthHandler = (token: string) => Promise<AuthResult> | AuthResult;
|
|
26
|
-
|
|
27
|
-
// =============================================================================
|
|
28
|
-
// Auth Service Interface
|
|
29
|
-
// =============================================================================
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Authentication service interface.
|
|
33
|
-
* Implementations can authenticate connections using various methods (JWT, API keys, etc.)
|
|
15
|
+
* MimicAuthService interface for authentication and authorization.
|
|
16
|
+
*
|
|
17
|
+
* The `authenticate` method receives the token from the client's auth message
|
|
18
|
+
* and the document ID being accessed. It should return an AuthContext on success
|
|
19
|
+
* or fail with AuthenticationError on failure.
|
|
20
|
+
*
|
|
21
|
+
* The permission in AuthContext determines what the user can do:
|
|
22
|
+
* - "read": Can subscribe, receive transactions, get snapshots
|
|
23
|
+
* - "write": All of the above, plus can submit transactions and set presence
|
|
34
24
|
*/
|
|
35
25
|
export interface MimicAuthService {
|
|
36
26
|
/**
|
|
37
|
-
* Authenticate a connection
|
|
38
|
-
*
|
|
39
|
-
* @
|
|
27
|
+
* Authenticate a connection and return authorization context.
|
|
28
|
+
*
|
|
29
|
+
* @param token - The token provided by the client
|
|
30
|
+
* @param documentId - The document ID being accessed
|
|
31
|
+
* @returns AuthContext with userId and permission level
|
|
40
32
|
*/
|
|
41
|
-
readonly authenticate: (
|
|
33
|
+
readonly authenticate: (
|
|
34
|
+
token: string,
|
|
35
|
+
documentId: string
|
|
36
|
+
) => Effect.Effect<AuthContext, AuthenticationError>;
|
|
42
37
|
}
|
|
43
38
|
|
|
44
39
|
// =============================================================================
|
|
@@ -46,58 +41,125 @@ export interface MimicAuthService {
|
|
|
46
41
|
// =============================================================================
|
|
47
42
|
|
|
48
43
|
/**
|
|
49
|
-
* Context tag for MimicAuthService
|
|
44
|
+
* Context tag for MimicAuthService
|
|
50
45
|
*/
|
|
51
46
|
export class MimicAuthServiceTag extends Context.Tag(
|
|
52
|
-
"@voidhash/mimic-
|
|
47
|
+
"@voidhash/mimic-effect/MimicAuthService"
|
|
53
48
|
)<MimicAuthServiceTag, MimicAuthService>() {}
|
|
54
49
|
|
|
55
50
|
// =============================================================================
|
|
56
|
-
//
|
|
51
|
+
// Factory
|
|
57
52
|
// =============================================================================
|
|
58
53
|
|
|
59
54
|
/**
|
|
60
|
-
* Create a MimicAuthService layer from an
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
*
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
*
|
|
55
|
+
* Create a MimicAuthService layer from an Effect that produces the service.
|
|
56
|
+
*
|
|
57
|
+
* This allows you to access other Effect services when implementing authentication.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const Auth = MimicAuthService.make(
|
|
62
|
+
* Effect.gen(function*() {
|
|
63
|
+
* const db = yield* DatabaseService
|
|
64
|
+
* const jwt = yield* JwtService
|
|
65
|
+
*
|
|
66
|
+
* return {
|
|
67
|
+
* authenticate: (token, documentId) =>
|
|
68
|
+
* Effect.gen(function*() {
|
|
69
|
+
* const payload = yield* jwt.verify(token).pipe(
|
|
70
|
+
* Effect.mapError(() => new AuthenticationError({ reason: "Invalid token" }))
|
|
71
|
+
* )
|
|
72
|
+
*
|
|
73
|
+
* const permission = yield* db.getDocumentPermission(payload.userId, documentId)
|
|
74
|
+
*
|
|
75
|
+
* return { userId: payload.userId, permission }
|
|
76
|
+
* })
|
|
77
|
+
* }
|
|
78
|
+
* })
|
|
79
|
+
* )
|
|
80
|
+
* ```
|
|
78
81
|
*/
|
|
79
|
-
export const
|
|
82
|
+
export const make = <E, R>(
|
|
80
83
|
effect: Effect.Effect<MimicAuthService, E, R>
|
|
81
84
|
): Layer.Layer<MimicAuthServiceTag, E, R> =>
|
|
82
85
|
Layer.effect(MimicAuthServiceTag, effect);
|
|
83
86
|
|
|
84
87
|
// =============================================================================
|
|
85
|
-
//
|
|
88
|
+
// NoAuth Implementation
|
|
86
89
|
// =============================================================================
|
|
87
90
|
|
|
88
91
|
/**
|
|
89
|
-
*
|
|
92
|
+
* No-authentication implementation.
|
|
93
|
+
*
|
|
94
|
+
* Everyone gets write access with userId "anonymous".
|
|
95
|
+
* ONLY USE FOR DEVELOPMENT/TESTING.
|
|
90
96
|
*/
|
|
91
|
-
export
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
97
|
+
export namespace NoAuth {
|
|
98
|
+
/**
|
|
99
|
+
* Create a NoAuth layer.
|
|
100
|
+
* All connections are authenticated with write permission.
|
|
101
|
+
*/
|
|
102
|
+
export const make = (): Layer.Layer<MimicAuthServiceTag> =>
|
|
103
|
+
Layer.succeed(MimicAuthServiceTag, {
|
|
104
|
+
authenticate: (_token, _documentId) =>
|
|
105
|
+
Effect.succeed({
|
|
106
|
+
userId: "anonymous",
|
|
107
|
+
permission: "write" as const,
|
|
108
|
+
}),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// =============================================================================
|
|
113
|
+
// Static Implementation
|
|
114
|
+
// =============================================================================
|
|
95
115
|
|
|
96
116
|
/**
|
|
97
|
-
*
|
|
117
|
+
* Static permissions implementation.
|
|
118
|
+
*
|
|
119
|
+
* Permissions are defined at configuration time.
|
|
120
|
+
* The token is treated as the userId.
|
|
98
121
|
*/
|
|
99
|
-
export
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
122
|
+
export namespace Static {
|
|
123
|
+
export interface Options {
|
|
124
|
+
/**
|
|
125
|
+
* Map of userId (token) to permission level
|
|
126
|
+
*/
|
|
127
|
+
readonly permissions: Record<string, Permission>;
|
|
128
|
+
/**
|
|
129
|
+
* Default permission for users not in the permissions map.
|
|
130
|
+
* If undefined, unknown users will fail authentication.
|
|
131
|
+
*/
|
|
132
|
+
readonly defaultPermission?: Permission;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Create a Static auth layer.
|
|
137
|
+
* The token is treated as the userId, and permissions are looked up from the config.
|
|
138
|
+
*/
|
|
139
|
+
export const make = (options: Options): Layer.Layer<MimicAuthServiceTag> =>
|
|
140
|
+
Layer.succeed(MimicAuthServiceTag, {
|
|
141
|
+
authenticate: (token, _documentId) => {
|
|
142
|
+
const permission = options.permissions[token] ?? options.defaultPermission;
|
|
143
|
+
if (permission === undefined) {
|
|
144
|
+
return Effect.fail(
|
|
145
|
+
new AuthenticationError({ reason: "Unknown user" })
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
return Effect.succeed({
|
|
149
|
+
userId: token,
|
|
150
|
+
permission,
|
|
151
|
+
});
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// =============================================================================
|
|
157
|
+
// Re-export namespace
|
|
158
|
+
// =============================================================================
|
|
159
|
+
|
|
160
|
+
export const MimicAuthService = {
|
|
161
|
+
Tag: MimicAuthServiceTag,
|
|
162
|
+
make,
|
|
163
|
+
NoAuth,
|
|
164
|
+
Static,
|
|
165
|
+
};
|