atom.io 0.46.5 → 0.46.6
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/dist/realtime/index.d.ts +7 -6
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js +19 -10
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +13 -13
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js +10 -3
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-server/index.d.ts +49 -41
- package/dist/realtime-server/index.d.ts.map +1 -1
- package/dist/realtime-server/index.js +123 -92
- package/dist/realtime-server/index.js.map +1 -1
- package/dist/realtime-testing/index.js +2 -2
- package/dist/realtime-testing/index.js.map +1 -1
- package/package.json +17 -16
- package/src/realtime/realtime-continuity.ts +2 -2
- package/src/realtime/shared-room-store.ts +38 -17
- package/src/realtime/socket-interface.ts +1 -1
- package/src/realtime-client/continuity/register-and-attempt-confirmed-update.ts +3 -1
- package/src/realtime-client/continuity/use-conceal-state.ts +2 -1
- package/src/realtime-client/pull-atom-family-member.ts +1 -1
- package/src/realtime-client/pull-atom.ts +1 -1
- package/src/realtime-client/pull-mutable-atom-family-member.ts +1 -1
- package/src/realtime-client/pull-mutable-atom.ts +1 -1
- package/src/realtime-client/pull-selector-family-member.ts +1 -1
- package/src/realtime-client/pull-selector-roots.ts +1 -1
- package/src/realtime-client/pull-selector.ts +1 -1
- package/src/realtime-client/push-state.ts +1 -1
- package/src/realtime-client/realtime-client-stores/client-main-store.ts +16 -3
- package/src/realtime-client/sync-continuity.ts +1 -2
- package/src/realtime-server/continuity/provide-outcomes.ts +1 -1
- package/src/realtime-server/ipc-sockets/parent-socket.ts +1 -8
- package/src/realtime-server/provide-rooms.ts +64 -16
- package/src/realtime-server/realtime-family-provider.ts +51 -35
- package/src/realtime-server/realtime-mutable-family-provider.ts +50 -34
- package/src/realtime-server/realtime-mutable-provider.ts +4 -4
- package/src/realtime-server/realtime-state-provider.ts +7 -7
- package/src/realtime-server/realtime-state-receiver.ts +2 -2
- package/src/realtime-server/server-config.ts +20 -13
- package/src/realtime-server/server-socket-state.ts +3 -3
- package/src/realtime-testing/setup-realtime-test.tsx +2 -2
|
@@ -96,37 +96,6 @@ declare class ParentSocket<I extends Events & { [id in string as `relay::${id}`]
|
|
|
96
96
|
receiveRelay(attachServices: (socket: SubjectSocket<any, any>, userKey: UserKey) => (() => void) | void): void;
|
|
97
97
|
}
|
|
98
98
|
//#endregion
|
|
99
|
-
//#region src/realtime-server/server-config.d.ts
|
|
100
|
-
type ServerConfig = {
|
|
101
|
-
socket: Socket;
|
|
102
|
-
userKey: UserKey;
|
|
103
|
-
store?: RootStore;
|
|
104
|
-
};
|
|
105
|
-
/** Socket Handshake details--taken from socket.io */
|
|
106
|
-
type Handshake = {
|
|
107
|
-
/** The headers sent as part of the handshake */
|
|
108
|
-
headers: IncomingHttpHeaders;
|
|
109
|
-
/** The date of creation (as string) */
|
|
110
|
-
time: string;
|
|
111
|
-
/** The ip of the client */
|
|
112
|
-
address: string;
|
|
113
|
-
/** Whether the connection is cross-domain */
|
|
114
|
-
xdomain: boolean;
|
|
115
|
-
/** Whether the connection is secure */
|
|
116
|
-
secure: boolean;
|
|
117
|
-
/** The date of creation (as unix timestamp) */
|
|
118
|
-
issued: number;
|
|
119
|
-
/** The request URL string */
|
|
120
|
-
url: string;
|
|
121
|
-
/** The query object */
|
|
122
|
-
query: ParsedUrlQuery;
|
|
123
|
-
/** The auth object */
|
|
124
|
-
auth: {
|
|
125
|
-
[key: string]: any;
|
|
126
|
-
};
|
|
127
|
-
};
|
|
128
|
-
declare function realtime(server: Server, auth: (handshake: Handshake) => Loadable<Error | UserKey>, onConnect: (config: ServerConfig) => Loadable<() => Loadable<void>>, store?: RootStore): () => Promise<void>;
|
|
129
|
-
//#endregion
|
|
130
99
|
//#region src/realtime-server/provide-rooms.d.ts
|
|
131
100
|
type RoomMap = Map<string, ChildSocket<any, any, ChildProcessWithoutNullStreams>>;
|
|
132
101
|
declare global {
|
|
@@ -174,6 +143,9 @@ type ProvideRoomsConfig<RoomNames extends string> = {
|
|
|
174
143
|
resolveRoomScript: (path: RoomNames) => [string, string[]];
|
|
175
144
|
roomNames: RoomNames[];
|
|
176
145
|
roomTimeLimit?: number;
|
|
146
|
+
userKey: UserKey;
|
|
147
|
+
store: RootStore;
|
|
148
|
+
socket: Socket;
|
|
177
149
|
};
|
|
178
150
|
declare function provideRooms<RoomNames extends string>({
|
|
179
151
|
store,
|
|
@@ -181,29 +153,29 @@ declare function provideRooms<RoomNames extends string>({
|
|
|
181
153
|
resolveRoomScript,
|
|
182
154
|
roomNames,
|
|
183
155
|
userKey
|
|
184
|
-
}: ProvideRoomsConfig<RoomNames>
|
|
156
|
+
}: ProvideRoomsConfig<RoomNames>): () => void;
|
|
185
157
|
//#endregion
|
|
186
158
|
//#region src/realtime-server/realtime-family-provider.d.ts
|
|
187
159
|
type FamilyProvider = ReturnType<typeof realtimeAtomFamilyProvider>;
|
|
188
160
|
declare function realtimeAtomFamilyProvider({
|
|
189
161
|
socket,
|
|
190
|
-
|
|
162
|
+
consumer,
|
|
191
163
|
store
|
|
192
|
-
}: ServerConfig): <J extends Json.Serializable, K extends Canonical>(family: AtomIO.RegularAtomFamilyToken<J, K>, index: AtomIO.ReadableToken<Iterable<NoInfer<K>>>) => () => void;
|
|
164
|
+
}: ServerConfig): <J extends Json.Serializable, K extends Canonical>(family: AtomIO.RegularAtomFamilyToken<J, K>, index: AtomIO.ReadableToken<Iterable<NoInfer<K>>> | Iterable<NoInfer<K>>) => () => void;
|
|
193
165
|
//#endregion
|
|
194
166
|
//#region src/realtime-server/realtime-mutable-family-provider.d.ts
|
|
195
167
|
type MutableFamilyProvider = ReturnType<typeof realtimeMutableFamilyProvider>;
|
|
196
168
|
declare function realtimeMutableFamilyProvider({
|
|
197
169
|
socket,
|
|
198
|
-
|
|
170
|
+
consumer,
|
|
199
171
|
store
|
|
200
|
-
}: ServerConfig): <T extends Transceiver<any, any, any>, K extends Canonical>(family: AtomIO.MutableAtomFamilyToken<T, K>, index: AtomIO.ReadableToken<Iterable<NoInfer<K>>>) => () => void;
|
|
172
|
+
}: ServerConfig): <T extends Transceiver<any, any, any>, K extends Canonical>(family: AtomIO.MutableAtomFamilyToken<T, K>, index: AtomIO.ReadableToken<Iterable<NoInfer<K>>> | Iterable<NoInfer<K>>) => () => void;
|
|
201
173
|
//#endregion
|
|
202
174
|
//#region src/realtime-server/realtime-mutable-provider.d.ts
|
|
203
175
|
type MutableProvider = ReturnType<typeof realtimeMutableProvider>;
|
|
204
176
|
declare function realtimeMutableProvider({
|
|
205
177
|
socket,
|
|
206
|
-
|
|
178
|
+
consumer,
|
|
207
179
|
store
|
|
208
180
|
}: ServerConfig): <Core extends Transceiver<any, Json.Serializable, Json.Serializable>>(token: AtomIO.MutableAtomToken<Core>) => () => void;
|
|
209
181
|
//#endregion
|
|
@@ -211,7 +183,7 @@ declare function realtimeMutableProvider({
|
|
|
211
183
|
type StateProvider = ReturnType<typeof realtimeStateProvider>;
|
|
212
184
|
declare function realtimeStateProvider({
|
|
213
185
|
socket,
|
|
214
|
-
|
|
186
|
+
consumer,
|
|
215
187
|
store
|
|
216
188
|
}: ServerConfig): <C extends Json.Serializable, S extends C>(clientToken: AtomIO.WritableToken<C>, serverData?: AtomIO.ReadableToken<S> | S) => () => void;
|
|
217
189
|
//#endregion
|
|
@@ -219,10 +191,46 @@ declare function realtimeStateProvider({
|
|
|
219
191
|
type StateReceiver = ReturnType<typeof realtimeStateReceiver>;
|
|
220
192
|
declare function realtimeStateReceiver({
|
|
221
193
|
socket,
|
|
222
|
-
|
|
194
|
+
consumer,
|
|
223
195
|
store
|
|
224
196
|
}: ServerConfig): <S extends Json.Serializable, C extends S>(schema: StandardSchemaV1<unknown, C>, clientToken: WritableToken<C>, serverToken?: WritableToken<S>) => () => void;
|
|
225
197
|
//#endregion
|
|
198
|
+
//#region src/realtime-server/server-config.d.ts
|
|
199
|
+
type ServerConfig = {
|
|
200
|
+
socket: Socket;
|
|
201
|
+
consumer: RoomKey | UserKey;
|
|
202
|
+
store?: RootStore;
|
|
203
|
+
};
|
|
204
|
+
type UserServerConfig = {
|
|
205
|
+
socket: Socket;
|
|
206
|
+
consumer: UserKey;
|
|
207
|
+
store?: RootStore;
|
|
208
|
+
};
|
|
209
|
+
/** Socket Handshake details--taken from socket.io */
|
|
210
|
+
type Handshake = {
|
|
211
|
+
/** The headers sent as part of the handshake */
|
|
212
|
+
headers: IncomingHttpHeaders;
|
|
213
|
+
/** The date of creation (as string) */
|
|
214
|
+
time: string;
|
|
215
|
+
/** The ip of the client */
|
|
216
|
+
address: string;
|
|
217
|
+
/** Whether the connection is cross-domain */
|
|
218
|
+
xdomain: boolean;
|
|
219
|
+
/** Whether the connection is secure */
|
|
220
|
+
secure: boolean;
|
|
221
|
+
/** The date of creation (as unix timestamp) */
|
|
222
|
+
issued: number;
|
|
223
|
+
/** The request URL string */
|
|
224
|
+
url: string;
|
|
225
|
+
/** The query object */
|
|
226
|
+
query: ParsedUrlQuery;
|
|
227
|
+
/** The auth object */
|
|
228
|
+
auth: {
|
|
229
|
+
[key: string]: any;
|
|
230
|
+
};
|
|
231
|
+
};
|
|
232
|
+
declare function realtime(server: Server, auth: (handshake: Handshake) => Loadable<Error | UserKey>, onConnect: (config: UserServerConfig) => Loadable<() => Loadable<void>>, store?: RootStore): () => Promise<void>;
|
|
233
|
+
//#endregion
|
|
226
234
|
//#region src/realtime-server/server-socket-state.d.ts
|
|
227
235
|
type SocketSystemHierarchy = Hierarchy<[{
|
|
228
236
|
above: `root`;
|
|
@@ -230,8 +238,8 @@ type SocketSystemHierarchy = Hierarchy<[{
|
|
|
230
238
|
}]>;
|
|
231
239
|
declare const socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>;
|
|
232
240
|
declare const socketKeysAtom: MutableAtomToken<UList<SocketKey>>;
|
|
233
|
-
declare const
|
|
241
|
+
declare const onlineUsersAtom: MutableAtomToken<UList<UserKey>>;
|
|
234
242
|
declare const usersOfSockets: JoinToken<`user`, UserKey, `socket`, SocketKey, `1:1`>;
|
|
235
243
|
//#endregion
|
|
236
|
-
export { ChildProcess, ChildSocket, CustomSocket, DestroyRoomConfig, EventBuffer, EventPayload, Events, FamilyProvider, Handshake, MutableFamilyProvider, MutableProvider, PROOF_OF_LIFE_SIGNAL, ParentProcess, ParentSocket, ProvideContinuity, ProvideEnterAndExitConfig, ProvideRoomsConfig, ROOMS, RoomMap, ServerConfig, SocketSystemHierarchy, SpawnRoomConfig, StateProvider, StateReceiver, StderrLog, SubjectSocket, destroyRoom, prepareToProvideContinuity, provideEnterAndExit, provideRooms, realtime, realtimeAtomFamilyProvider, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, roomMeta, socketAtoms, socketKeysAtom, spawnRoom,
|
|
244
|
+
export { ChildProcess, ChildSocket, CustomSocket, DestroyRoomConfig, EventBuffer, EventPayload, Events, FamilyProvider, Handshake, MutableFamilyProvider, MutableProvider, PROOF_OF_LIFE_SIGNAL, ParentProcess, ParentSocket, ProvideContinuity, ProvideEnterAndExitConfig, ProvideRoomsConfig, ROOMS, RoomMap, ServerConfig, SocketSystemHierarchy, SpawnRoomConfig, StateProvider, StateReceiver, StderrLog, SubjectSocket, UserServerConfig, destroyRoom, onlineUsersAtom, prepareToProvideContinuity, provideEnterAndExit, provideRooms, realtime, realtimeAtomFamilyProvider, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, roomMeta, socketAtoms, socketKeysAtom, spawnRoom, usersOfSockets };
|
|
237
245
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["ATOM_IO_REALTIME_SERVER_ROOMS: RoomMap","ROOMS: RoomMap","roomMeta: { count: number }","socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketKeysAtom: MutableAtomToken<UList<SocketKey>>","
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["ATOM_IO_REALTIME_SERVER_ROOMS: RoomMap","ROOMS: RoomMap","roomMeta: { count: number }","socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketKeysAtom: MutableAtomToken<UList<SocketKey>>","onlineUsersAtom: MutableAtomToken<UList<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>"],"sources":["../../src/realtime-server/continuity/provide-continuity.ts","../../src/realtime-server/ipc-sockets/custom-socket.ts","../../src/realtime-server/ipc-sockets/child-socket.ts","../../src/realtime-server/ipc-sockets/parent-socket.ts","../../src/realtime-server/provide-rooms.ts","../../src/realtime-server/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts","../../src/realtime-server/server-config.ts","../../src/realtime-server/server-socket-state.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@ import { IMPLICIT, OWN_OP, Subject, actUponStore, editRelationsInStore, findInSt
|
|
|
2
2
|
import { Realm, atomFamily, join, mutableAtom } from "atom.io";
|
|
3
3
|
import { parseJson, stringifyJson } from "atom.io/json";
|
|
4
4
|
import { UList } from "atom.io/transceivers/u-list";
|
|
5
|
-
import { castSocket, employSocket, isRoomKey, isSocketKey, isUserKey, mutexAtoms, ownersOfRooms, roomKeysAtom, usersInRooms, visibleUsersInRoomsSelector } from "atom.io/realtime";
|
|
5
|
+
import { castSocket, employSocket, isRoomKey, isSocketKey, isUserKey, mutexAtoms, ownersOfRooms, roomKeysAtom, usersInRooms, visibilityFromRoomSelector, visibleUsersInRoomsSelector } from "atom.io/realtime";
|
|
6
|
+
import { myRoomKeyAtom, myUserKeyAtom } from "atom.io/realtime-client";
|
|
6
7
|
import { spawn } from "node:child_process";
|
|
7
8
|
|
|
8
9
|
//#region src/realtime-server/continuity/continuity-store.ts
|
|
@@ -541,8 +542,12 @@ const isAvailable = (exposedSubKeys, subKey) => {
|
|
|
541
542
|
for (const exposedSubKey of exposedSubKeys) if (stringifyJson(exposedSubKey) === stringifyJson(subKey)) return true;
|
|
542
543
|
return false;
|
|
543
544
|
};
|
|
544
|
-
function realtimeMutableFamilyProvider({ socket,
|
|
545
|
+
function realtimeMutableFamilyProvider({ socket, consumer, store = IMPLICIT.STORE }) {
|
|
545
546
|
return function mutableFamilyProvider(family, index) {
|
|
547
|
+
const [dynamicIndex, staticIndex] = (() => {
|
|
548
|
+
if (typeof index === `object` && `key` in index && `type` in index) return [index, void 0];
|
|
549
|
+
return [void 0, index];
|
|
550
|
+
})();
|
|
546
551
|
const coreSubscriptions = /* @__PURE__ */ new Set();
|
|
547
552
|
const clearCoreSubscriptions = () => {
|
|
548
553
|
for (const unsub of coreSubscriptions) unsub();
|
|
@@ -580,21 +585,24 @@ function realtimeMutableFamilyProvider({ socket, userKey, store = IMPLICIT.STORE
|
|
|
580
585
|
}));
|
|
581
586
|
};
|
|
582
587
|
const start = () => {
|
|
583
|
-
store.logger.info(`👀`, `user`,
|
|
588
|
+
store.logger.info(`👀`, `user`, consumer, `can subscribe to family "${family.key}"`);
|
|
584
589
|
coreSubscriptions.add(employSocket(socket, `sub:${family.key}`, (subKey) => {
|
|
585
|
-
|
|
586
|
-
|
|
590
|
+
let exposedSubKeys;
|
|
591
|
+
if (dynamicIndex) exposedSubKeys = getFromStore(store, dynamicIndex);
|
|
592
|
+
else exposedSubKeys = staticIndex;
|
|
593
|
+
if (isAvailable(exposedSubKeys, subKey)) {
|
|
594
|
+
store.logger.info(`👀`, `user`, consumer, `is approved for a subscription to`, subKey, `in family "${family.key}"`);
|
|
587
595
|
exposeFamilyMembers(subKey);
|
|
588
596
|
} else {
|
|
589
|
-
store.logger.info(`❌`, `user`,
|
|
597
|
+
store.logger.info(`❌`, `user`, consumer, `is denied for a subscription to`, subKey, `in family "${family.key}"`);
|
|
590
598
|
familyMemberSubscriptionsWanted.add(stringifyJson(subKey));
|
|
591
599
|
socket.emit(`unavailable:${family.key}`, subKey);
|
|
592
600
|
}
|
|
593
601
|
}));
|
|
594
|
-
coreSubscriptions.add(subscribeToState(store,
|
|
595
|
-
store.logger.info(`👀`, `user`,
|
|
602
|
+
if (dynamicIndex) coreSubscriptions.add(subscribeToState(store, dynamicIndex, `expose-family:${family.key}:${socket.id}`, ({ newValue: newExposedSubKeys }) => {
|
|
603
|
+
store.logger.info(`👀`, `user`, consumer, `has the following keys available for family "${family.key}"`, newExposedSubKeys);
|
|
596
604
|
for (const subKey of newExposedSubKeys) if (familyMemberSubscriptionsWanted.has(stringifyJson(subKey))) {
|
|
597
|
-
store.logger.info(`👀`, `user`,
|
|
605
|
+
store.logger.info(`👀`, `user`, consumer, `is retroactively approved for a subscription to`, subKey, `in family "${family.key}"`);
|
|
598
606
|
exposeFamilyMembers(subKey);
|
|
599
607
|
}
|
|
600
608
|
}));
|
|
@@ -609,7 +617,7 @@ function realtimeMutableFamilyProvider({ socket, userKey, store = IMPLICIT.STORE
|
|
|
609
617
|
|
|
610
618
|
//#endregion
|
|
611
619
|
//#region src/realtime-server/realtime-mutable-provider.ts
|
|
612
|
-
function realtimeMutableProvider({ socket,
|
|
620
|
+
function realtimeMutableProvider({ socket, consumer, store = IMPLICIT.STORE }) {
|
|
613
621
|
return function mutableProvider(token) {
|
|
614
622
|
const subscriptions = /* @__PURE__ */ new Set();
|
|
615
623
|
const clearSubscriptions = () => {
|
|
@@ -619,16 +627,16 @@ function realtimeMutableProvider({ socket, userKey, store = IMPLICIT.STORE }) {
|
|
|
619
627
|
const jsonToken = getJsonToken(store, token);
|
|
620
628
|
const trackerToken = getUpdateToken(token);
|
|
621
629
|
const start = () => {
|
|
622
|
-
store.logger.info(`👀`, `user`,
|
|
630
|
+
store.logger.info(`👀`, `user`, consumer, `can subscribe to state "${token.key}"`);
|
|
623
631
|
subscriptions.add(employSocket(socket, `sub:${token.key}`, () => {
|
|
624
|
-
store.logger.info(`👀`, `user`,
|
|
632
|
+
store.logger.info(`👀`, `user`, consumer, `subscribes to state "${token.key}"`);
|
|
625
633
|
clearSubscriptions();
|
|
626
634
|
socket.emit(`init:${token.key}`, getFromStore(store, jsonToken));
|
|
627
635
|
subscriptions.add(subscribeToState(store, trackerToken, `expose-single:${socket.id}`, ({ newValue }) => {
|
|
628
636
|
socket.emit(`next:${token.key}`, newValue);
|
|
629
637
|
}));
|
|
630
638
|
subscriptions.add(employSocket(socket, `unsub:${token.key}`, () => {
|
|
631
|
-
store.logger.info(`🙈`, `user`,
|
|
639
|
+
store.logger.info(`🙈`, `user`, consumer, `unsubscribes from state "${token.key}"`);
|
|
632
640
|
clearSubscriptions();
|
|
633
641
|
start();
|
|
634
642
|
}));
|
|
@@ -639,6 +647,47 @@ function realtimeMutableProvider({ socket, userKey, store = IMPLICIT.STORE }) {
|
|
|
639
647
|
};
|
|
640
648
|
}
|
|
641
649
|
|
|
650
|
+
//#endregion
|
|
651
|
+
//#region src/realtime-server/realtime-state-provider.ts
|
|
652
|
+
function isReadableToken(input) {
|
|
653
|
+
return typeof input === `object` && input !== null && `key` in input && `type` in input;
|
|
654
|
+
}
|
|
655
|
+
function realtimeStateProvider({ socket, consumer, store = IMPLICIT.STORE }) {
|
|
656
|
+
store.logger.info(`🔌`, `user`, consumer, `initialized state provider`);
|
|
657
|
+
return function stateProvider(clientToken, serverData = clientToken) {
|
|
658
|
+
const isStatic = !isReadableToken(serverData);
|
|
659
|
+
const subscriptions = /* @__PURE__ */ new Set();
|
|
660
|
+
const clearSubscriptions = () => {
|
|
661
|
+
for (const unsub of subscriptions) unsub();
|
|
662
|
+
subscriptions.clear();
|
|
663
|
+
};
|
|
664
|
+
const start = () => {
|
|
665
|
+
if (isStatic) store.logger.info(`👀`, `user`, consumer, `will be served`, serverData, `as "${clientToken.key}"`);
|
|
666
|
+
else store.logger.info(`👀`, `user`, consumer, `can subscribe to state "${serverData.key}" as "${clientToken.key}"`);
|
|
667
|
+
subscriptions.add(employSocket(socket, `sub:${clientToken.key}`, () => {
|
|
668
|
+
if (isStatic) {
|
|
669
|
+
store.logger.info(`👀`, `user`, consumer, `requests`, `"${clientToken.key}"`);
|
|
670
|
+
socket.emit(`serve:${clientToken.key}`, serverData);
|
|
671
|
+
} else {
|
|
672
|
+
store.logger.info(`👀`, `user`, consumer, `subscribes to state "${serverData.key}"`, clientToken === serverData ? `directly` : `as "${clientToken.key}"`);
|
|
673
|
+
clearSubscriptions();
|
|
674
|
+
socket.emit(`serve:${clientToken.key}`, getFromStore(store, serverData));
|
|
675
|
+
subscriptions.add(subscribeToState(store, serverData, `expose-single:${socket.id}`, ({ newValue }) => {
|
|
676
|
+
socket.emit(`serve:${clientToken.key}`, newValue);
|
|
677
|
+
}));
|
|
678
|
+
subscriptions.add(employSocket(socket, `unsub:${serverData.key}`, () => {
|
|
679
|
+
store.logger.info(`🙈`, `user`, consumer, `unsubscribes from state "${serverData.key}", served`, clientToken === serverData ? `directly` : `as "${clientToken.key}"`);
|
|
680
|
+
clearSubscriptions();
|
|
681
|
+
start();
|
|
682
|
+
}));
|
|
683
|
+
}
|
|
684
|
+
}));
|
|
685
|
+
};
|
|
686
|
+
start();
|
|
687
|
+
return clearSubscriptions;
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
|
|
642
691
|
//#endregion
|
|
643
692
|
//#region src/realtime-server/provide-rooms.ts
|
|
644
693
|
const ROOMS = globalThis.ATOM_IO_REALTIME_SERVER_ROOMS ?? (globalThis.ATOM_IO_REALTIME_SERVER_ROOMS = /* @__PURE__ */ new Map());
|
|
@@ -648,17 +697,17 @@ function spawnRoom({ store, socket, userKey, resolveRoomScript }) {
|
|
|
648
697
|
store.logger.info(`📡`, `socket`, socket.id ?? `[ID MISSING?!]`, `👤 ${userKey} spawns room ${roomName}`);
|
|
649
698
|
const roomKey = `room::${roomMeta.count++}`;
|
|
650
699
|
const [command, args] = resolveRoomScript(roomName);
|
|
651
|
-
const
|
|
652
|
-
const room = spawn(command, args, { env: process.env });
|
|
700
|
+
const room = new ChildSocket(await new Promise((resolve) => {
|
|
701
|
+
const room$1 = spawn(command, args, { env: process.env });
|
|
653
702
|
const resolver = (data) => {
|
|
654
703
|
if (data.toString() === PROOF_OF_LIFE_SIGNAL) {
|
|
655
|
-
room.stdout.off(`data`, resolver);
|
|
656
|
-
resolve(room);
|
|
704
|
+
room$1.stdout.off(`data`, resolver);
|
|
705
|
+
resolve(room$1);
|
|
657
706
|
}
|
|
658
707
|
};
|
|
659
|
-
room.stdout.on(`data`, resolver);
|
|
708
|
+
room$1.stdout.on(`data`, resolver);
|
|
660
709
|
}), roomKey);
|
|
661
|
-
ROOMS.set(roomKey,
|
|
710
|
+
ROOMS.set(roomKey, room);
|
|
662
711
|
setIntoStore(store, roomKeysAtom, (index) => (index.add(roomKey), index));
|
|
663
712
|
editRelationsInStore(store, ownersOfRooms, (relations) => {
|
|
664
713
|
relations.set({
|
|
@@ -666,23 +715,41 @@ function spawnRoom({ store, socket, userKey, resolveRoomScript }) {
|
|
|
666
715
|
user: userKey
|
|
667
716
|
});
|
|
668
717
|
});
|
|
669
|
-
|
|
718
|
+
const provideMutableFamily = realtimeMutableFamilyProvider({
|
|
719
|
+
socket: room,
|
|
720
|
+
consumer: roomKey,
|
|
721
|
+
store
|
|
722
|
+
});
|
|
723
|
+
const unsubFromRoomKey = realtimeStateProvider({
|
|
724
|
+
socket: room,
|
|
725
|
+
consumer: roomKey,
|
|
726
|
+
store
|
|
727
|
+
})(myRoomKeyAtom, roomKey);
|
|
728
|
+
const unsubFromOwnerKeys = provideMutableFamily(getInternalRelationsFromStore(store, ownersOfRooms), [roomKey]);
|
|
729
|
+
const unsubFromUsersInRooms = provideMutableFamily(getInternalRelationsFromStore(store, usersInRooms), findInStore(store, visibilityFromRoomSelector, roomKey));
|
|
730
|
+
room.on(`close`, () => {
|
|
731
|
+
unsubFromRoomKey();
|
|
732
|
+
unsubFromOwnerKeys();
|
|
733
|
+
unsubFromUsersInRooms();
|
|
670
734
|
destroyRoom({
|
|
671
735
|
store,
|
|
672
736
|
socket,
|
|
673
737
|
userKey
|
|
674
738
|
})(roomKey);
|
|
675
739
|
});
|
|
676
|
-
return
|
|
740
|
+
return room;
|
|
677
741
|
};
|
|
678
742
|
}
|
|
679
743
|
function provideEnterAndExit({ store, socket, roomSocket, userKey }) {
|
|
680
744
|
const enterRoom = (roomKey) => {
|
|
681
745
|
store.logger.info(`📡`, `socket`, socket.id ?? `[ID MISSING?!]`, `👤 ${userKey} enters room ${roomKey}`);
|
|
746
|
+
const dcUserFromRoom = () => {
|
|
747
|
+
toRoom([`user-leaves`]);
|
|
748
|
+
};
|
|
682
749
|
const exitRoom = () => {
|
|
683
750
|
store.logger.info(`📡`, `socket`, socket.id ?? `[ID MISSING?!]`, `👤 ${userKey} leaves room ${roomKey}`);
|
|
684
751
|
socket.offAny(forward);
|
|
685
|
-
|
|
752
|
+
dcUserFromRoom();
|
|
686
753
|
editRelationsInStore(store, usersInRooms, (relations) => {
|
|
687
754
|
relations.delete({
|
|
688
755
|
room: roomKey,
|
|
@@ -692,8 +759,6 @@ function provideEnterAndExit({ store, socket, roomSocket, userKey }) {
|
|
|
692
759
|
roomSocket.off(`leaveRoom`, exitRoom);
|
|
693
760
|
roomSocket.on(`joinRoom`, enterRoom);
|
|
694
761
|
};
|
|
695
|
-
roomSocket.on(`leaveRoom`, exitRoom);
|
|
696
|
-
roomSocket.off(`joinRoom`, enterRoom);
|
|
697
762
|
const roomQueue = [];
|
|
698
763
|
const pushToRoomQueue = (payload) => {
|
|
699
764
|
roomQueue.push(payload);
|
|
@@ -712,7 +777,7 @@ function provideEnterAndExit({ store, socket, roomSocket, userKey }) {
|
|
|
712
777
|
const childSocket = ROOMS.get(roomKey);
|
|
713
778
|
if (!childSocket) {
|
|
714
779
|
store.logger.error(`❌`, `unknown`, roomKey, `no room found with this id`);
|
|
715
|
-
return
|
|
780
|
+
return;
|
|
716
781
|
}
|
|
717
782
|
childSocket.onAny((...payload) => {
|
|
718
783
|
socket.emit(...payload);
|
|
@@ -725,6 +790,9 @@ function provideEnterAndExit({ store, socket, roomSocket, userKey }) {
|
|
|
725
790
|
const payload = roomQueue.shift();
|
|
726
791
|
if (payload) toRoom(payload);
|
|
727
792
|
}
|
|
793
|
+
socket.on(`disconnect`, dcUserFromRoom);
|
|
794
|
+
roomSocket.on(`leaveRoom`, exitRoom);
|
|
795
|
+
roomSocket.off(`joinRoom`, enterRoom);
|
|
728
796
|
};
|
|
729
797
|
roomSocket.on(`joinRoom`, enterRoom);
|
|
730
798
|
return enterRoom;
|
|
@@ -754,7 +822,7 @@ function provideRooms({ store = IMPLICIT.STORE, socket, resolveRoomScript, roomN
|
|
|
754
822
|
const unsubFromRoomKeys = realtimeMutableProvider({
|
|
755
823
|
socket,
|
|
756
824
|
store,
|
|
757
|
-
userKey
|
|
825
|
+
consumer: userKey
|
|
758
826
|
})(roomKeysAtom);
|
|
759
827
|
const usersInRoomsAtoms = getInternalRelationsFromStore(store, usersInRooms);
|
|
760
828
|
const [, usersInRoomsAtomsUsersOnly] = getInternalRelationsFromStore(store, usersInRooms, `split`);
|
|
@@ -763,7 +831,7 @@ function provideRooms({ store = IMPLICIT.STORE, socket, resolveRoomScript, roomN
|
|
|
763
831
|
const exposeMutableFamily = realtimeMutableFamilyProvider({
|
|
764
832
|
socket,
|
|
765
833
|
store,
|
|
766
|
-
userKey
|
|
834
|
+
consumer: userKey
|
|
767
835
|
});
|
|
768
836
|
const unsubFromUsersInRooms = exposeMutableFamily(usersInRoomsAtoms, usersWhoseRoomsCanBeSeenSelector);
|
|
769
837
|
const unsubFromOwnersOfRooms = exposeMutableFamily(ownersOfRoomsAtoms, usersWhoseRoomsCanBeSeenSelector);
|
|
@@ -828,8 +896,12 @@ function createRoomSocketGuard(roomNames) {
|
|
|
828
896
|
|
|
829
897
|
//#endregion
|
|
830
898
|
//#region src/realtime-server/realtime-family-provider.ts
|
|
831
|
-
function realtimeAtomFamilyProvider({ socket,
|
|
899
|
+
function realtimeAtomFamilyProvider({ socket, consumer, store = IMPLICIT.STORE }) {
|
|
832
900
|
return function familyProvider(family, index) {
|
|
901
|
+
const [dynamicIndex, staticIndex] = (() => {
|
|
902
|
+
if (typeof index === `object` && `key` in index && `type` in index) return [index, void 0];
|
|
903
|
+
return [void 0, index];
|
|
904
|
+
})();
|
|
833
905
|
const coreSubscriptions = /* @__PURE__ */ new Set();
|
|
834
906
|
const clearCoreSubscriptions = () => {
|
|
835
907
|
for (const unsub of coreSubscriptions) unsub();
|
|
@@ -861,7 +933,7 @@ function realtimeAtomFamilyProvider({ socket, userKey, store = IMPLICIT.STORE })
|
|
|
861
933
|
socket.emit(`serve:${token.key}`, newValue);
|
|
862
934
|
}));
|
|
863
935
|
familyMemberSubscriptions.set(`${token.key}:unsub`, employSocket(socket, `unsub:${token.key}`, () => {
|
|
864
|
-
store.logger.info(`🙈`, `user`,
|
|
936
|
+
store.logger.info(`🙈`, `user`, consumer, `unsubscribed from state "${token.key}"`);
|
|
865
937
|
fillUnsubRequest(token.key);
|
|
866
938
|
}));
|
|
867
939
|
};
|
|
@@ -870,21 +942,24 @@ function realtimeAtomFamilyProvider({ socket, userKey, store = IMPLICIT.STORE })
|
|
|
870
942
|
return false;
|
|
871
943
|
};
|
|
872
944
|
const start = () => {
|
|
873
|
-
store.logger.info(`👀`, `user`,
|
|
945
|
+
store.logger.info(`👀`, `user`, consumer, `can subscribe to family "${family.key}"`);
|
|
874
946
|
coreSubscriptions.add(employSocket(socket, `sub:${family.key}`, (subKey) => {
|
|
875
|
-
|
|
876
|
-
|
|
947
|
+
let exposedSubKeys;
|
|
948
|
+
if (dynamicIndex) exposedSubKeys = getFromStore(store, dynamicIndex);
|
|
949
|
+
else exposedSubKeys = staticIndex;
|
|
950
|
+
if (isAvailable$1(exposedSubKeys, subKey)) {
|
|
951
|
+
store.logger.info(`👀`, `user`, consumer, `is approved for a subscription to`, subKey, `in family "${family.key}"`);
|
|
877
952
|
exposeFamilyMembers(subKey);
|
|
878
953
|
} else {
|
|
879
|
-
store.logger.info(`❌`, `user`,
|
|
954
|
+
store.logger.info(`❌`, `user`, consumer, `is denied for a subscription to`, subKey, `in family "${family.key}"`);
|
|
880
955
|
familyMemberSubscriptionsWanted.add(stringifyJson(subKey));
|
|
881
956
|
socket.emit(`unavailable:${family.key}`, subKey);
|
|
882
957
|
}
|
|
883
958
|
}));
|
|
884
|
-
coreSubscriptions.add(subscribeToState(store,
|
|
885
|
-
store.logger.info(`👀`, `user`,
|
|
959
|
+
if (dynamicIndex) coreSubscriptions.add(subscribeToState(store, dynamicIndex, `expose-family:${family.key}:${socket.id}`, ({ newValue: newExposedSubKeys }) => {
|
|
960
|
+
store.logger.info(`👀`, `user`, consumer, `has the following keys available for family "${family.key}"`, newExposedSubKeys);
|
|
886
961
|
for (const subKey of newExposedSubKeys) if (familyMemberSubscriptionsWanted.has(stringifyJson(subKey))) {
|
|
887
|
-
store.logger.info(`👀`, `user`,
|
|
962
|
+
store.logger.info(`👀`, `user`, consumer, `is retroactively approved for a subscription to`, subKey, `in family "${family.key}"`);
|
|
888
963
|
exposeFamilyMembers(subKey);
|
|
889
964
|
}
|
|
890
965
|
}));
|
|
@@ -897,50 +972,9 @@ function realtimeAtomFamilyProvider({ socket, userKey, store = IMPLICIT.STORE })
|
|
|
897
972
|
};
|
|
898
973
|
}
|
|
899
974
|
|
|
900
|
-
//#endregion
|
|
901
|
-
//#region src/realtime-server/realtime-state-provider.ts
|
|
902
|
-
function isReadableToken(input) {
|
|
903
|
-
return typeof input === `object` && input !== null && `key` in input && `type` in input;
|
|
904
|
-
}
|
|
905
|
-
function realtimeStateProvider({ socket, userKey, store = IMPLICIT.STORE }) {
|
|
906
|
-
store.logger.info(`🔌`, `user`, userKey, `initialized state provider`);
|
|
907
|
-
return function stateProvider(clientToken, serverData = clientToken) {
|
|
908
|
-
const isStatic = !isReadableToken(serverData);
|
|
909
|
-
const subscriptions = /* @__PURE__ */ new Set();
|
|
910
|
-
const clearSubscriptions = () => {
|
|
911
|
-
for (const unsub of subscriptions) unsub();
|
|
912
|
-
subscriptions.clear();
|
|
913
|
-
};
|
|
914
|
-
const start = () => {
|
|
915
|
-
if (isStatic) store.logger.info(`👀`, `user`, userKey, `will be served`, serverData, `as "${clientToken.key}"`);
|
|
916
|
-
else store.logger.info(`👀`, `user`, userKey, `can subscribe to state "${serverData.key}" as "${clientToken.key}"`);
|
|
917
|
-
subscriptions.add(employSocket(socket, `sub:${clientToken.key}`, () => {
|
|
918
|
-
if (isStatic) {
|
|
919
|
-
store.logger.info(`👀`, `user`, userKey, `requests`, `"${clientToken.key}"`);
|
|
920
|
-
socket.emit(`serve:${clientToken.key}`, serverData);
|
|
921
|
-
} else {
|
|
922
|
-
store.logger.info(`👀`, `user`, userKey, `subscribes to state "${serverData.key}"`, clientToken === serverData ? `directly` : `as "${clientToken.key}"`);
|
|
923
|
-
clearSubscriptions();
|
|
924
|
-
socket.emit(`serve:${clientToken.key}`, getFromStore(store, serverData));
|
|
925
|
-
subscriptions.add(subscribeToState(store, serverData, `expose-single:${socket.id}`, ({ newValue }) => {
|
|
926
|
-
socket.emit(`serve:${clientToken.key}`, newValue);
|
|
927
|
-
}));
|
|
928
|
-
subscriptions.add(employSocket(socket, `unsub:${serverData.key}`, () => {
|
|
929
|
-
store.logger.info(`🙈`, `user`, userKey, `unsubscribes from state "${serverData.key}", served`, clientToken === serverData ? `directly` : `as "${clientToken.key}"`);
|
|
930
|
-
clearSubscriptions();
|
|
931
|
-
start();
|
|
932
|
-
}));
|
|
933
|
-
}
|
|
934
|
-
}));
|
|
935
|
-
};
|
|
936
|
-
start();
|
|
937
|
-
return clearSubscriptions;
|
|
938
|
-
};
|
|
939
|
-
}
|
|
940
|
-
|
|
941
975
|
//#endregion
|
|
942
976
|
//#region src/realtime-server/realtime-state-receiver.ts
|
|
943
|
-
function realtimeStateReceiver({ socket,
|
|
977
|
+
function realtimeStateReceiver({ socket, consumer, store = IMPLICIT.STORE }) {
|
|
944
978
|
return function stateReceiver(schema, clientToken, serverToken = clientToken) {
|
|
945
979
|
const socketKey = `socket::${socket.id}`;
|
|
946
980
|
const mutexAtom = findInStore(store, mutexAtoms, serverToken.key);
|
|
@@ -954,7 +988,7 @@ function realtimeStateReceiver({ socket, userKey, store = IMPLICIT.STORE }) {
|
|
|
954
988
|
subscriptions.add(employSocket(socket, `pub:${clientToken.key}`, async (newValue) => {
|
|
955
989
|
const parsed = await schema[`~standard`].validate(newValue);
|
|
956
990
|
if (parsed.issues) {
|
|
957
|
-
store.logger.error(`❌`, `user`,
|
|
991
|
+
store.logger.error(`❌`, `user`, consumer, `attempted to publish invalid value`, newValue, `to state "${serverToken.key}"`);
|
|
958
992
|
return;
|
|
959
993
|
}
|
|
960
994
|
setIntoStore(store, serverToken, parsed.value);
|
|
@@ -996,11 +1030,11 @@ const socketAtoms = atomFamily({
|
|
|
996
1030
|
default: null
|
|
997
1031
|
});
|
|
998
1032
|
const socketKeysAtom = mutableAtom({
|
|
999
|
-
key: `
|
|
1033
|
+
key: `socketKeys`,
|
|
1000
1034
|
class: UList
|
|
1001
1035
|
});
|
|
1002
|
-
const
|
|
1003
|
-
key: `
|
|
1036
|
+
const onlineUsersAtom = mutableAtom({
|
|
1037
|
+
key: `onlineUsers`,
|
|
1004
1038
|
class: UList
|
|
1005
1039
|
});
|
|
1006
1040
|
const usersOfSockets = join({
|
|
@@ -1027,29 +1061,26 @@ function realtime(server, auth, onConnect, store = IMPLICIT.STORE) {
|
|
|
1027
1061
|
editRelationsInStore(store, usersOfSockets, (relations) => {
|
|
1028
1062
|
relations.set(userClaim, socketClaim);
|
|
1029
1063
|
});
|
|
1030
|
-
setIntoStore(store,
|
|
1064
|
+
setIntoStore(store, onlineUsersAtom, (index) => index.add(userClaim));
|
|
1031
1065
|
setIntoStore(store, socketKeysAtom, (index) => index.add(socketClaim));
|
|
1032
1066
|
next();
|
|
1033
1067
|
}).on(`connection`, async (socket) => {
|
|
1034
1068
|
const socketKey = `socket::${socket.id}`;
|
|
1035
|
-
const
|
|
1036
|
-
const userKey = getFromStore(store,
|
|
1069
|
+
const userKeySelector = findRelationsInStore(store, usersOfSockets, socketKey).userKeyOfSocket;
|
|
1070
|
+
const userKey = getFromStore(store, userKeySelector);
|
|
1037
1071
|
const serverConfig = {
|
|
1038
1072
|
store,
|
|
1039
1073
|
socket,
|
|
1040
|
-
userKey
|
|
1074
|
+
consumer: userKey
|
|
1041
1075
|
};
|
|
1042
|
-
const unsubFromMyUserKey = realtimeStateProvider(serverConfig)(
|
|
1043
|
-
key: `myUserKey`,
|
|
1044
|
-
type: `atom`
|
|
1045
|
-
}, userKey);
|
|
1076
|
+
const unsubFromMyUserKey = realtimeStateProvider(serverConfig)(myUserKeyAtom, userKey);
|
|
1046
1077
|
const disposeServices = await onConnect(serverConfig);
|
|
1047
1078
|
socket.on(`disconnect`, async () => {
|
|
1048
1079
|
store.logger.info(`📡`, `socket`, socketKey, `👤 ${userKey} disconnects`);
|
|
1049
1080
|
await disposeServices();
|
|
1050
1081
|
unsubFromMyUserKey();
|
|
1051
1082
|
editRelationsInStore(store, usersOfSockets, (rel) => rel.delete(socketKey));
|
|
1052
|
-
setIntoStore(store,
|
|
1083
|
+
setIntoStore(store, onlineUsersAtom, (keys) => (keys.delete(userKey), keys));
|
|
1053
1084
|
setIntoStore(store, socketKeysAtom, (keys) => (keys.delete(socketKey), keys));
|
|
1054
1085
|
});
|
|
1055
1086
|
});
|
|
@@ -1060,5 +1091,5 @@ function realtime(server, auth, onConnect, store = IMPLICIT.STORE) {
|
|
|
1060
1091
|
}
|
|
1061
1092
|
|
|
1062
1093
|
//#endregion
|
|
1063
|
-
export { ChildSocket, CustomSocket, PROOF_OF_LIFE_SIGNAL, ParentSocket, ROOMS, SubjectSocket, destroyRoom, prepareToProvideContinuity, provideEnterAndExit, provideRooms, realtime, realtimeAtomFamilyProvider, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, roomMeta, socketAtoms, socketKeysAtom, spawnRoom,
|
|
1094
|
+
export { ChildSocket, CustomSocket, PROOF_OF_LIFE_SIGNAL, ParentSocket, ROOMS, SubjectSocket, destroyRoom, onlineUsersAtom, prepareToProvideContinuity, provideEnterAndExit, provideRooms, realtime, realtimeAtomFamilyProvider, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, roomMeta, socketAtoms, socketKeysAtom, spawnRoom, usersOfSockets };
|
|
1064
1095
|
//# sourceMappingURL=index.js.map
|