atom.io 0.44.8 → 0.44.9

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.
@@ -0,0 +1,18 @@
1
+ //#region rolldown:runtime
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (all, symbols) => {
4
+ let target = {};
5
+ for (var name in all) {
6
+ __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ }
11
+ if (symbols) {
12
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
13
+ }
14
+ return target;
15
+ };
16
+
17
+ //#endregion
18
+ export { __export as t };
@@ -2,7 +2,10 @@ import { ESLintUtils } from "@typescript-eslint/utils";
2
2
  import { ESLint } from "eslint";
3
3
 
4
4
  //#region src/eslint-plugin/rules/explicit-state-types.d.ts
5
- declare const explicitStateTypes: ESLintUtils.RuleModule<`noTypeArgument`, [], unknown, ESLintUtils.RuleListener>;
5
+ type Options = [{
6
+ permitAnnotation?: boolean;
7
+ }];
8
+ declare const explicitStateTypes: ESLintUtils.RuleModule<`noTypeArgument` | `noTypeArgumentOrAnnotation`, Options, unknown, ESLintUtils.RuleListener>;
6
9
  declare namespace index_d_exports {
7
10
  export { explicitStateTypes };
8
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument`,\n\t[],\n\tunknown,\n\tESLintUtils.RuleListener\n>","plugin: ESLint.Plugin"],"sources":["../../src/eslint-plugin/rules/explicit-state-types.ts","../../src/eslint-plugin/rules/index.ts","../../src/eslint-plugin/index.ts"],"sourcesContent":[],"mappings":";;;;cAgBaA,oBAAoB,WAAA,CAAY,0CAI5C,WAAA,CAAY;;;;;;cEdPC,QAAQ,MAAA,CAAO"}
1
+ {"version":3,"file":"index.d.ts","names":["explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument` | `noTypeArgumentOrAnnotation`,\n\tOptions,\n\tunknown,\n\tESLintUtils.RuleListener\n>","plugin: ESLint.Plugin"],"sources":["../../src/eslint-plugin/rules/explicit-state-types.ts","../../src/eslint-plugin/rules/index.ts","../../src/eslint-plugin/index.ts"],"sourcesContent":[],"mappings":";;;;KAiBK,OAAA;;;cAMQA,oBAAoB,WAAA,CAAY,4DAE5C,kBAEA,WAAA,CAAY;;;;;;cErBPC,QAAQ,MAAA,CAAO"}
@@ -1,5 +1,5 @@
1
- import { t as __export } from "../chunk-dQTVuLCX.js";
2
- import { ESLintUtils } from "@typescript-eslint/utils";
1
+ import { t as __export } from "../chunk-D8lmAICg.js";
2
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
3
3
 
4
4
  //#region src/eslint-plugin/rules/explicit-state-types.ts
5
5
  const createRule = ESLintUtils.RuleCreator((name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`);
@@ -16,29 +16,52 @@ const explicitStateTypes = createRule({
16
16
  meta: {
17
17
  type: `problem`,
18
18
  docs: { description: `State declarations must have generic type arguments directly passed to them` },
19
- messages: { noTypeArgument: `State declarations must have generic type arguments directly passed to them.` },
20
- schema: []
19
+ messages: {
20
+ noTypeArgument: `State declarations must have generic type arguments directly passed to them.`,
21
+ noTypeArgumentOrAnnotation: `State declarations must have generic type arguments directly passed to them, or a top-level type annotation.`
22
+ },
23
+ schema: [{
24
+ type: `object`,
25
+ properties: { permitAnnotation: {
26
+ type: `boolean`,
27
+ default: false
28
+ } },
29
+ additionalProperties: false
30
+ }]
21
31
  },
22
- defaultOptions: [],
32
+ defaultOptions: [{ permitAnnotation: false }],
23
33
  create(context) {
34
+ const permitAnnotation = context.options[0]?.permitAnnotation ?? false;
24
35
  return { CallExpression(node) {
25
- const { callee } = node;
36
+ const callee = node.callee;
26
37
  switch (callee.type) {
27
38
  case `Identifier`:
28
- if (STATE_FUNCTIONS.includes(callee.name)) {
29
- if (!node.typeArguments) context.report({
30
- node,
31
- messageId: `noTypeArgument`
32
- });
33
- }
39
+ if (STATE_FUNCTIONS.includes(callee.name) === false) return;
34
40
  break;
35
- case `MemberExpression`: if (callee.property.type === `Identifier` && STATE_FUNCTIONS.includes(callee.property.name)) {
36
- if (!node.typeArguments) context.report({
37
- node,
38
- messageId: `noTypeArgument`
39
- });
41
+ case `MemberExpression`:
42
+ if ((callee.property.type === `Identifier` && STATE_FUNCTIONS.includes(callee.property.name)) === false) return;
43
+ break;
44
+ default: return;
45
+ }
46
+ if (node.typeArguments) return;
47
+ if (permitAnnotation) {
48
+ let hasAnnotation = false;
49
+ const parent = node.parent;
50
+ if (parent?.type === AST_NODE_TYPES.VariableDeclarator && parent.init === node) {
51
+ const declaratorId = parent.id;
52
+ if (declaratorId.type === AST_NODE_TYPES.Identifier) hasAnnotation = Boolean(declaratorId.typeAnnotation);
40
53
  }
54
+ if (hasAnnotation) return;
55
+ context.report({
56
+ node,
57
+ messageId: `noTypeArgumentOrAnnotation`
58
+ });
59
+ return;
41
60
  }
61
+ context.report({
62
+ node,
63
+ messageId: `noTypeArgument`
64
+ });
42
65
  } };
43
66
  }
44
67
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument`,\n\t[],\n\tunknown,\n\tESLintUtils.RuleListener\n>","plugin: ESLint.Plugin","Rules.explicitStateTypes"],"sources":["../../src/eslint-plugin/rules/explicit-state-types.ts","../../src/eslint-plugin/rules/index.ts","../../src/eslint-plugin/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/switch-exhaustiveness-check */\nimport { ESLintUtils } from \"@typescript-eslint/utils\"\n\nconst createRule = ESLintUtils.RuleCreator(\n\t(name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`,\n)\n\nconst STATE_FUNCTIONS = [\n\t`atom`,\n\t`atomFamily`,\n\t`mutableAtom`,\n\t`mutableAtomFamily`,\n\t`selector`,\n\t`selectorFamily`,\n]\n\nexport const explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument`,\n\t[],\n\tunknown,\n\tESLintUtils.RuleListener\n> = createRule({\n\tname: `explicit-state-types`,\n\tmeta: {\n\t\ttype: `problem`,\n\t\tdocs: {\n\t\t\tdescription: `State declarations must have generic type arguments directly passed to them`,\n\t\t},\n\t\tmessages: {\n\t\t\tnoTypeArgument: `State declarations must have generic type arguments directly passed to them.`,\n\t\t},\n\t\tschema: [], // no options\n\t},\n\tdefaultOptions: [],\n\tcreate(context) {\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tconst { callee } = node\n\t\t\t\tswitch (callee.type) {\n\t\t\t\t\tcase `Identifier`: {\n\t\t\t\t\t\tif (STATE_FUNCTIONS.includes(callee.name)) {\n\t\t\t\t\t\t\tif (!node.typeArguments) {\n\t\t\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\t\tmessageId: `noTypeArgument`,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase `MemberExpression`: {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcallee.property.type === `Identifier` &&\n\t\t\t\t\t\t\tSTATE_FUNCTIONS.includes(callee.property.name)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (!node.typeArguments) {\n\t\t\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\t\tmessageId: `noTypeArgument`,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n})\n","export * from \"./explicit-state-types\"\n","import type { ESLint } from \"eslint\"\n\nimport * as Rules from \"./rules\"\n\nexport { Rules }\n\nconst plugin: ESLint.Plugin = {\n\trules: {\n\t\t\"explicit-state-types\": Rules.explicitStateTypes as any,\n\t},\n} satisfies ESLint.Plugin\n\nexport default plugin\n"],"mappings":";;;;AAGA,MAAM,aAAa,YAAY,aAC7B,SAAS,0CAA0C,OACpD;AAED,MAAM,kBAAkB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;AAED,MAAaA,qBAKT,WAAW;CACd,MAAM;CACN,MAAM;EACL,MAAM;EACN,MAAM,EACL,aAAa,+EACb;EACD,UAAU,EACT,gBAAgB,gFAChB;EACD,QAAQ,EAAE;EACV;CACD,gBAAgB,EAAE;CAClB,OAAO,SAAS;AACf,SAAO,EACN,eAAe,MAAM;GACpB,MAAM,EAAE,WAAW;AACnB,WAAQ,OAAO,MAAf;IACC,KAAK;AACJ,SAAI,gBAAgB,SAAS,OAAO,KAAK,EACxC;UAAI,CAAC,KAAK,cACT,SAAQ,OAAO;OACd;OACA,WAAW;OACX,CAAC;;AAGJ;IAED,KAAK,mBACJ,KACC,OAAO,SAAS,SAAS,gBACzB,gBAAgB,SAAS,OAAO,SAAS,KAAK,EAE9C;SAAI,CAAC,KAAK,cACT,SAAQ,OAAO;MACd;MACA,WAAW;MACX,CAAC;;;KAMP;;CAEF,CAAC;;;;;;;;AE7DF,MAAMC,SAAwB,EAC7B,OAAO,EACN,wBAAwBC,oBACxB,EACD;AAED,4BAAe"}
1
+ {"version":3,"file":"index.js","names":["explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument` | `noTypeArgumentOrAnnotation`,\n\tOptions,\n\tunknown,\n\tESLintUtils.RuleListener\n>","plugin: ESLint.Plugin","Rules.explicitStateTypes"],"sources":["../../src/eslint-plugin/rules/explicit-state-types.ts","../../src/eslint-plugin/rules/index.ts","../../src/eslint-plugin/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/switch-exhaustiveness-check */\nimport type { TSESTree } from \"@typescript-eslint/utils\"\nimport { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\"\n\nconst createRule = ESLintUtils.RuleCreator(\n\t(name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`,\n)\n\nconst STATE_FUNCTIONS = [\n\t`atom`,\n\t`atomFamily`,\n\t`mutableAtom`,\n\t`mutableAtomFamily`,\n\t`selector`,\n\t`selectorFamily`,\n]\n\ntype Options = [\n\t{\n\t\tpermitAnnotation?: boolean\n\t},\n]\n\nexport const explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument` | `noTypeArgumentOrAnnotation`,\n\tOptions,\n\tunknown,\n\tESLintUtils.RuleListener\n> = createRule({\n\tname: `explicit-state-types`,\n\tmeta: {\n\t\ttype: `problem`,\n\t\tdocs: {\n\t\t\tdescription: `State declarations must have generic type arguments directly passed to them`,\n\t\t},\n\t\tmessages: {\n\t\t\tnoTypeArgument: `State declarations must have generic type arguments directly passed to them.`,\n\t\t\tnoTypeArgumentOrAnnotation: `State declarations must have generic type arguments directly passed to them, or a top-level type annotation.`,\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\ttype: `object`,\n\t\t\t\tproperties: {\n\t\t\t\t\tpermitAnnotation: {\n\t\t\t\t\t\ttype: `boolean`,\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t],\n\t},\n\tdefaultOptions: [\n\t\t{\n\t\t\tpermitAnnotation: false,\n\t\t},\n\t],\n\tcreate(context) {\n\t\tconst options = context.options[0]\n\t\tconst permitAnnotation = options?.permitAnnotation ?? false\n\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tconst callee = node.callee\n\n\t\t\t\tswitch (callee.type) {\n\t\t\t\t\tcase `Identifier`:\n\t\t\t\t\t\tif (STATE_FUNCTIONS.includes(callee.name) === false) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase `MemberExpression`:\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(callee.property.type === `Identifier` &&\n\t\t\t\t\t\t\t\tSTATE_FUNCTIONS.includes(callee.property.name)) === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Check for the *required* generic type argument first\n\t\t\t\tif (node.typeArguments) {\n\t\t\t\t\treturn // Generic type argument is present, no error\n\t\t\t\t}\n\n\t\t\t\t// If generic arguments are missing, check if the top-level annotation exception is enabled AND present\n\t\t\t\tif (permitAnnotation) {\n\t\t\t\t\tlet hasAnnotation = false\n\t\t\t\t\t// Check if the CallExpression is the initializer of a variable declarator\n\t\t\t\t\tconst parent = node.parent\n\t\t\t\t\tif (\n\t\t\t\t\t\tparent?.type === AST_NODE_TYPES.VariableDeclarator &&\n\t\t\t\t\t\tparent.init === node\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Check if the VariableDeclarator has an id with a TypeAnnotation\n\t\t\t\t\t\tconst declaratorId = parent.id\n\t\t\t\t\t\tif (declaratorId.type === AST_NODE_TYPES.Identifier) {\n\t\t\t\t\t\t\t// Check for 'const myAtom: AtomToken<string> = ...'\n\t\t\t\t\t\t\thasAnnotation = Boolean(declaratorId.typeAnnotation)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (hasAnnotation) {\n\t\t\t\t\t\treturn // Exception met: type annotation is on the variable declaration\n\t\t\t\t\t}\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tmessageId: `noTypeArgumentOrAnnotation`,\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode,\n\t\t\t\t\tmessageId: `noTypeArgument`,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t},\n})\n","export * from \"./explicit-state-types\"\n","import type { ESLint } from \"eslint\"\n\nimport * as Rules from \"./rules\"\n\nexport { Rules }\n\nconst plugin: ESLint.Plugin = {\n\trules: {\n\t\t\"explicit-state-types\": Rules.explicitStateTypes as any,\n\t},\n} satisfies ESLint.Plugin\n\nexport default plugin\n"],"mappings":";;;;AAIA,MAAM,aAAa,YAAY,aAC7B,SAAS,0CAA0C,OACpD;AAED,MAAM,kBAAkB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;AAQD,MAAaA,qBAKT,WAAW;CACd,MAAM;CACN,MAAM;EACL,MAAM;EACN,MAAM,EACL,aAAa,+EACb;EACD,UAAU;GACT,gBAAgB;GAChB,4BAA4B;GAC5B;EACD,QAAQ,CACP;GACC,MAAM;GACN,YAAY,EACX,kBAAkB;IACjB,MAAM;IACN,SAAS;IACT,EACD;GACD,sBAAsB;GACtB,CACD;EACD;CACD,gBAAgB,CACf,EACC,kBAAkB,OAClB,CACD;CACD,OAAO,SAAS;EAEf,MAAM,mBADU,QAAQ,QAAQ,IACE,oBAAoB;AAEtD,SAAO,EACN,eAAe,MAAM;GACpB,MAAM,SAAS,KAAK;AAEpB,WAAQ,OAAO,MAAf;IACC,KAAK;AACJ,SAAI,gBAAgB,SAAS,OAAO,KAAK,KAAK,MAC7C;AAED;IACD,KAAK;AACJ,UACE,OAAO,SAAS,SAAS,gBACzB,gBAAgB,SAAS,OAAO,SAAS,KAAK,MAAM,MAErD;AAED;IACD,QACC;;AAIF,OAAI,KAAK,cACR;AAID,OAAI,kBAAkB;IACrB,IAAI,gBAAgB;IAEpB,MAAM,SAAS,KAAK;AACpB,QACC,QAAQ,SAAS,eAAe,sBAChC,OAAO,SAAS,MACf;KAED,MAAM,eAAe,OAAO;AAC5B,SAAI,aAAa,SAAS,eAAe,WAExC,iBAAgB,QAAQ,aAAa,eAAe;;AAGtD,QAAI,cACH;AAED,YAAQ,OAAO;KACd;KACA,WAAW;KACX,CAAC;AACF;;AAGD,WAAQ,OAAO;IACd;IACA,WAAW;IACX,CAAC;KAEH;;CAEF,CAAC;;;;;;;;AEnHF,MAAMC,SAAwB,EAC7B,OAAO,EACN,wBAAwBC,oBACxB,EACD;AAED,4BAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["mutexAtoms: AtomFamilyToken<boolean, Canonical>","roomKeysAtom: MutableAtomToken<UList<string>>","DEFAULT_USER_IN_ROOM_META: UserInRoomMeta","usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`>","usersInMyRoomView: ReadonlyPureSelectorFamilyToken<\n\tMutableAtomToken<UList<RoomKey>>[],\n\tUserKey\n>"],"sources":["../../src/realtime/employ-socket.ts","../../src/realtime/mutex-store.ts","../../src/realtime/realtime-continuity.ts","../../src/realtime/realtime-key-types.ts","../../src/realtime/shared-room-store.ts"],"sourcesContent":["import type { Socket } from \"atom.io/realtime\"\nimport type { Events } from \"atom.io/realtime-server\"\n\nexport function employSocket<I extends Events, K extends string & keyof I>(\n\tsocket: Socket,\n\tevent: K,\n\thandleEvent: (...data: I[K]) => void,\n): () => void {\n\tsocket.on(event, handleEvent)\n\tconst retireSocket = () => {\n\t\tsocket.off(event, handleEvent)\n\t}\n\treturn retireSocket\n}\n","import type { AtomFamilyToken } from \"atom.io\"\nimport { atomFamily } from \"atom.io\"\nimport type { Canonical } from \"atom.io/json\"\n\nexport const mutexAtoms: AtomFamilyToken<boolean, Canonical> = atomFamily<\n\tboolean,\n\tCanonical\n>({\n\tkey: `mutex`,\n\tdefault: false,\n})\n","import type {\n\tAtomFamilyToken,\n\tAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tTokenType,\n\tTransactionToken,\n} from \"atom.io\"\nimport {\n\tassignTransactionToContinuity,\n\tIMPLICIT,\n\tsetEpochNumberOfContinuity,\n} from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\n\nimport type { UserKey } from \"./realtime-key-types\"\n\n/* eslint-disable no-console */\n\nexport class InvariantMap<K, V> extends Map<K, V> implements ReadonlyMap<K, V> {\n\tpublic set(key: K, value: V): this {\n\t\tif (this.has(key)) {\n\t\t\tconsole.warn(`Tried to set a key that already exists in an InvariantMap`, {\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t})\n\t\t\treturn this\n\t\t}\n\t\treturn super.set(key, value)\n\t}\n}\n\nexport type PerspectiveToken<F extends AtomFamilyToken<any>> = {\n\ttype: `realtime_perspective`\n\tresourceAtoms: F\n\tviewAtoms: ReadableFamilyToken<ReadableToken<TokenType<F>>[], UserKey>\n}\n\nexport type ContinuityToken = {\n\treadonly type: `continuity`\n\treadonly key: string\n\treadonly globals: AtomToken<any>[]\n\treadonly actions: TransactionToken<any>[]\n\treadonly perspectives: PerspectiveToken<AtomFamilyToken<any, Canonical>>[]\n}\n\nexport class SyncGroup {\n\tpublic type = `continuity` as const\n\n\tprotected globals: AtomToken<any>[] = []\n\tprotected actions: TransactionToken<any>[] = []\n\tprotected perspectives: PerspectiveToken<any>[] = []\n\tprotected readonly key: string\n\n\tprotected constructor(key: string) {\n\t\tthis.key = key\n\t}\n\n\tpublic static existing: InvariantMap<string, ContinuityToken> =\n\t\tnew InvariantMap()\n\tpublic static create(\n\t\tkey: string,\n\t\tbuilder: (group: SyncGroup) => SyncGroup,\n\t): ContinuityToken {\n\t\tconst group = new SyncGroup(key)\n\t\tconst { type, globals, actions, perspectives } = builder(group)\n\t\tconst token = { type, key, globals, actions, perspectives }\n\t\tSyncGroup.existing.set(key, token)\n\t\treturn token\n\t}\n\n\tpublic add(...atoms: AtomToken<any>[]): SyncGroup\n\tpublic add(...args: TransactionToken<any>[]): SyncGroup\n\tpublic add<\n\t\tF extends AtomFamilyToken<any>,\n\t\tT extends F extends AtomFamilyToken<infer U> ? U : never,\n\t>(\n\t\tfamily: AtomFamilyToken<T, any>,\n\t\tindex: ReadableFamilyToken<Iterable<AtomToken<T>>, string>,\n\t): SyncGroup\n\tpublic add(\n\t\t...args:\n\t\t\t| readonly AtomToken<any>[]\n\t\t\t| readonly TransactionToken<any>[]\n\t\t\t| [AtomFamilyToken<any, any>, ReadableFamilyToken<Iterable<any>, string>]\n\t): this {\n\t\tconst zeroth = args[0]\n\t\tswitch (zeroth.type) {\n\t\t\tcase `atom`:\n\t\t\tcase `mutable_atom`:\n\t\t\t\tthis.globals.push(...(args as AtomToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `transaction`:\n\t\t\t\tthis.actions.push(...(args as TransactionToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `atom_family`:\n\t\t\tcase `mutable_atom_family`:\n\t\t\t\t{\n\t\t\t\t\tconst [family, index] = args as [\n\t\t\t\t\t\tAtomFamilyToken<any, any>,\n\t\t\t\t\t\tReadableFamilyToken<ReadableToken<any>[], UserKey>,\n\t\t\t\t\t]\n\t\t\t\t\tthis.perspectives.push({\n\t\t\t\t\t\ttype: `realtime_perspective`,\n\t\t\t\t\t\tresourceAtoms: family,\n\t\t\t\t\t\tviewAtoms: index,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn this\n\t}\n}\n\nexport type ContinuityOptions = {\n\tkey: string\n\tconfig: (group: SyncGroup) => SyncGroup\n}\n\nexport function continuity(options: ContinuityOptions): ContinuityToken {\n\tconst { key, config } = options\n\tconst token = SyncGroup.create(key, config)\n\tconst { actions } = token\n\tfor (const action of actions) {\n\t\tassignTransactionToContinuity(IMPLICIT.STORE, key, action.key)\n\t}\n\tsetEpochNumberOfContinuity(IMPLICIT.STORE, key, -1)\n\treturn token\n}\n\n// const counterStates = atomFamily<number, { c: string }>({\n// \tkey: `counter`,\n// \tdefault: 0,\n// })\n// const counterIndices = atomFamily<{ c: string }[], string>({\n// \tkey: `counterIndex`,\n// \tdefault: [],\n// })\n// const nameStates = atomFamily<number, { n: string }>({\n// \tkey: `name`,\n// \tdefault: 0,\n// })\n// const nameIndices = atomFamily<{ n: string }[], string>({\n// \tkey: `nameIndex`,\n// \tdefault: [],\n// })\n\n// const counterContinuity = continuity({\n// \tkey: `counter`,\n// \tconfig: (group) =>\n// \t\tgroup\n// \t\t\t.add(counterStates, counterIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices),\n// })\n","export type SocketKey = `socket::${string}`\nexport const isSocketKey = (key: string): key is SocketKey =>\n\tkey.startsWith(`socket::`)\n\nexport type UserKey = `user::${string}`\nexport const isUserKey = (key: string): key is UserKey =>\n\tkey.startsWith(`user::`)\n\nexport type RoomKey = `room::${string}`\nexport const isRoomKey = (key: string): key is RoomKey =>\n\tkey.startsWith(`room::`)\n","import type {\n\tJoinToken,\n\tMutableAtomToken,\n\tReadonlyPureSelectorFamilyToken,\n} from \"atom.io\"\nimport { getInternalRelations, join, mutableAtom, selectorFamily } from \"atom.io\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nimport {\n\tisRoomKey,\n\tisUserKey,\n\ttype RoomKey,\n\ttype UserKey,\n} from \"./realtime-key-types\"\n\nexport type RoomSocketInterface<RoomNames extends string> = {\n\tcreateRoom: (roomName: RoomNames) => void\n\tjoinRoom: (roomKey: string) => void\n\t[leaveRoom: `leaveRoom:${string}`]: () => void\n\t[deleteRoom: `deleteRoom:${string}`]: () => void\n}\n\nexport const roomKeysAtom: MutableAtomToken<UList<string>> = mutableAtom<\n\tUList<string>\n>({\n\tkey: `roomIndex`,\n\tclass: UList,\n})\n\nexport type UserInRoomMeta = {\n\tenteredAtEpoch: number\n}\nexport const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {\n\tenteredAtEpoch: 0,\n}\nexport const usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`> =\n\tjoin({\n\t\tkey: `usersInRooms`,\n\t\tbetween: [`room`, `user`],\n\t\tcardinality: `1:n`,\n\t\tisAType: isRoomKey,\n\t\tisBType: isUserKey,\n\t})\n\nexport const usersInMyRoomView: ReadonlyPureSelectorFamilyToken<\n\tMutableAtomToken<UList<RoomKey>>[],\n\tUserKey\n> = selectorFamily<MutableAtomToken<UList<RoomKey>>[], UserKey>({\n\tkey: `usersInMyRoomView`,\n\tget:\n\t\t(myUsername) =>\n\t\t({ find }) => {\n\t\t\tconst [, roomsOfUsersAtoms] = getInternalRelations(usersInRooms, `split`)\n\t\t\tconst myRoomIndex = find(roomsOfUsersAtoms, myUsername)\n\t\t\treturn [myRoomIndex]\n\t\t},\n})\n"],"mappings":";;;;;AAGA,SAAgB,aACf,QACA,OACA,aACa;AACb,QAAO,GAAG,OAAO,YAAY;CAC7B,MAAM,qBAAqB;AAC1B,SAAO,IAAI,OAAO,YAAY;;AAE/B,QAAO;;;;;ACRR,MAAaA,aAAkD,WAG7D;CACD,KAAK;CACL,SAAS;CACT,CAAC;;;;ACSF,IAAa,eAAb,cAAwC,IAAuC;CAC9E,AAAO,IAAI,KAAQ,OAAgB;AAClC,MAAI,KAAK,IAAI,IAAI,EAAE;AAClB,WAAQ,KAAK,6DAA6D;IACzE;IACA;IACA,CAAC;AACF,UAAO;;AAER,SAAO,MAAM,IAAI,KAAK,MAAM;;;AAkB9B,IAAa,YAAb,MAAa,UAAU;CACtB,AAAO,OAAO;CAEd,AAAU,UAA4B,EAAE;CACxC,AAAU,UAAmC,EAAE;CAC/C,AAAU,eAAwC,EAAE;CACpD,AAAmB;CAEnB,AAAU,YAAY,KAAa;AAClC,OAAK,MAAM;;CAGZ,OAAc,WACb,IAAI,cAAc;CACnB,OAAc,OACb,KACA,SACkB;EAElB,MAAM,EAAE,MAAM,SAAS,SAAS,iBAAiB,QADnC,IAAI,UAAU,IAAI,CAC+B;EAC/D,MAAM,QAAQ;GAAE;GAAM;GAAK;GAAS;GAAS;GAAc;AAC3D,YAAU,SAAS,IAAI,KAAK,MAAM;AAClC,SAAO;;CAYR,AAAO,IACN,GAAG,MAII;AAEP,UADe,KAAK,GACL,MAAf;GACC,KAAK;GACL,KAAK;AACJ,SAAK,QAAQ,KAAK,GAAI,KAA0B;AAChD;GACD,KAAK;AACJ,SAAK,QAAQ,KAAK,GAAI,KAAiC;AACvD;GACD,KAAK;GACL,KAAK;IACJ;KACC,MAAM,CAAC,QAAQ,SAAS;AAIxB,UAAK,aAAa,KAAK;MACtB,MAAM;MACN,eAAe;MACf,WAAW;MACX,CAAC;;AAEH;;AAGF,SAAO;;;AAST,SAAgB,WAAW,SAA6C;CACvE,MAAM,EAAE,KAAK,WAAW;CACxB,MAAM,QAAQ,UAAU,OAAO,KAAK,OAAO;CAC3C,MAAM,EAAE,YAAY;AACpB,MAAK,MAAM,UAAU,QACpB,+BAA8B,SAAS,OAAO,KAAK,OAAO,IAAI;AAE/D,4BAA2B,SAAS,OAAO,KAAK,GAAG;AACnD,QAAO;;;;;AC/HR,MAAa,eAAe,QAC3B,IAAI,WAAW,WAAW;AAG3B,MAAa,aAAa,QACzB,IAAI,WAAW,SAAS;AAGzB,MAAa,aAAa,QACzB,IAAI,WAAW,SAAS;;;;ACYzB,MAAaC,eAAgD,YAE3D;CACD,KAAK;CACL,OAAO;CACP,CAAC;AAKF,MAAaC,4BAA4C,EACxD,gBAAgB,GAChB;AACD,MAAaC,eACZ,KAAK;CACJ,KAAK;CACL,SAAS,CAAC,QAAQ,OAAO;CACzB,aAAa;CACb,SAAS;CACT,SAAS;CACT,CAAC;AAEH,MAAaC,oBAGT,eAA4D;CAC/D,KAAK;CACL,MACE,gBACA,EAAE,WAAW;EACb,MAAM,GAAG,qBAAqB,qBAAqB,cAAc,QAAQ;AAEzE,SAAO,CADa,KAAK,mBAAmB,WAAW,CACnC;;CAEtB,CAAC"}
1
+ {"version":3,"file":"index.js","names":["mutexAtoms: AtomFamilyToken<boolean, Canonical>","roomKeysAtom: MutableAtomToken<UList<string>>","DEFAULT_USER_IN_ROOM_META: UserInRoomMeta","usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`>","usersInMyRoomView: ReadonlyPureSelectorFamilyToken<\n\tMutableAtomToken<UList<RoomKey>>[],\n\tUserKey\n>"],"sources":["../../src/realtime/employ-socket.ts","../../src/realtime/mutex-store.ts","../../src/realtime/realtime-continuity.ts","../../src/realtime/realtime-key-types.ts","../../src/realtime/shared-room-store.ts"],"sourcesContent":["import type { Socket } from \"atom.io/realtime\"\nimport type { Events } from \"atom.io/realtime-server\"\n\nexport function employSocket<I extends Events, K extends string & keyof I>(\n\tsocket: Socket,\n\tevent: K,\n\thandleEvent: (...data: I[K]) => void,\n): () => void {\n\tsocket.on(event, handleEvent)\n\tconst retireSocket = () => {\n\t\tsocket.off(event, handleEvent)\n\t}\n\treturn retireSocket\n}\n","import type { AtomFamilyToken } from \"atom.io\"\nimport { atomFamily } from \"atom.io\"\nimport type { Canonical } from \"atom.io/json\"\n\nexport const mutexAtoms: AtomFamilyToken<boolean, Canonical> = atomFamily({\n\tkey: `mutex`,\n\tdefault: false,\n})\n","import type {\n\tAtomFamilyToken,\n\tAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tTokenType,\n\tTransactionToken,\n} from \"atom.io\"\nimport {\n\tassignTransactionToContinuity,\n\tIMPLICIT,\n\tsetEpochNumberOfContinuity,\n} from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\n\nimport type { UserKey } from \"./realtime-key-types\"\n\n/* eslint-disable no-console */\n\nexport class InvariantMap<K, V> extends Map<K, V> implements ReadonlyMap<K, V> {\n\tpublic set(key: K, value: V): this {\n\t\tif (this.has(key)) {\n\t\t\tconsole.warn(`Tried to set a key that already exists in an InvariantMap`, {\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t})\n\t\t\treturn this\n\t\t}\n\t\treturn super.set(key, value)\n\t}\n}\n\nexport type PerspectiveToken<F extends AtomFamilyToken<any>> = {\n\ttype: `realtime_perspective`\n\tresourceAtoms: F\n\tviewAtoms: ReadableFamilyToken<ReadableToken<TokenType<F>>[], UserKey>\n}\n\nexport type ContinuityToken = {\n\treadonly type: `continuity`\n\treadonly key: string\n\treadonly globals: AtomToken<any>[]\n\treadonly actions: TransactionToken<any>[]\n\treadonly perspectives: PerspectiveToken<AtomFamilyToken<any, Canonical>>[]\n}\n\nexport class SyncGroup {\n\tpublic type = `continuity` as const\n\n\tprotected globals: AtomToken<any>[] = []\n\tprotected actions: TransactionToken<any>[] = []\n\tprotected perspectives: PerspectiveToken<any>[] = []\n\tprotected readonly key: string\n\n\tprotected constructor(key: string) {\n\t\tthis.key = key\n\t}\n\n\tpublic static existing: InvariantMap<string, ContinuityToken> =\n\t\tnew InvariantMap()\n\tpublic static create(\n\t\tkey: string,\n\t\tbuilder: (group: SyncGroup) => SyncGroup,\n\t): ContinuityToken {\n\t\tconst group = new SyncGroup(key)\n\t\tconst { type, globals, actions, perspectives } = builder(group)\n\t\tconst token = { type, key, globals, actions, perspectives }\n\t\tSyncGroup.existing.set(key, token)\n\t\treturn token\n\t}\n\n\tpublic add(...atoms: AtomToken<any>[]): SyncGroup\n\tpublic add(...args: TransactionToken<any>[]): SyncGroup\n\tpublic add<\n\t\tF extends AtomFamilyToken<any>,\n\t\tT extends F extends AtomFamilyToken<infer U> ? U : never,\n\t>(\n\t\tfamily: AtomFamilyToken<T, any>,\n\t\tindex: ReadableFamilyToken<Iterable<AtomToken<T>>, string>,\n\t): SyncGroup\n\tpublic add(\n\t\t...args:\n\t\t\t| readonly AtomToken<any>[]\n\t\t\t| readonly TransactionToken<any>[]\n\t\t\t| [AtomFamilyToken<any, any>, ReadableFamilyToken<Iterable<any>, string>]\n\t): this {\n\t\tconst zeroth = args[0]\n\t\tswitch (zeroth.type) {\n\t\t\tcase `atom`:\n\t\t\tcase `mutable_atom`:\n\t\t\t\tthis.globals.push(...(args as AtomToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `transaction`:\n\t\t\t\tthis.actions.push(...(args as TransactionToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `atom_family`:\n\t\t\tcase `mutable_atom_family`:\n\t\t\t\t{\n\t\t\t\t\tconst [family, index] = args as [\n\t\t\t\t\t\tAtomFamilyToken<any, any>,\n\t\t\t\t\t\tReadableFamilyToken<ReadableToken<any>[], UserKey>,\n\t\t\t\t\t]\n\t\t\t\t\tthis.perspectives.push({\n\t\t\t\t\t\ttype: `realtime_perspective`,\n\t\t\t\t\t\tresourceAtoms: family,\n\t\t\t\t\t\tviewAtoms: index,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn this\n\t}\n}\n\nexport type ContinuityOptions = {\n\tkey: string\n\tconfig: (group: SyncGroup) => SyncGroup\n}\n\nexport function continuity(options: ContinuityOptions): ContinuityToken {\n\tconst { key, config } = options\n\tconst token = SyncGroup.create(key, config)\n\tconst { actions } = token\n\tfor (const action of actions) {\n\t\tassignTransactionToContinuity(IMPLICIT.STORE, key, action.key)\n\t}\n\tsetEpochNumberOfContinuity(IMPLICIT.STORE, key, -1)\n\treturn token\n}\n\n// const counterStates = atomFamily<number, { c: string }>({\n// \tkey: `counter`,\n// \tdefault: 0,\n// })\n// const counterIndices = atomFamily<{ c: string }[], string>({\n// \tkey: `counterIndex`,\n// \tdefault: [],\n// })\n// const nameStates = atomFamily<number, { n: string }>({\n// \tkey: `name`,\n// \tdefault: 0,\n// })\n// const nameIndices = atomFamily<{ n: string }[], string>({\n// \tkey: `nameIndex`,\n// \tdefault: [],\n// })\n\n// const counterContinuity = continuity({\n// \tkey: `counter`,\n// \tconfig: (group) =>\n// \t\tgroup\n// \t\t\t.add(counterStates, counterIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices),\n// })\n","export type SocketKey = `socket::${string}`\nexport const isSocketKey = (key: string): key is SocketKey =>\n\tkey.startsWith(`socket::`)\n\nexport type UserKey = `user::${string}`\nexport const isUserKey = (key: string): key is UserKey =>\n\tkey.startsWith(`user::`)\n\nexport type RoomKey = `room::${string}`\nexport const isRoomKey = (key: string): key is RoomKey =>\n\tkey.startsWith(`room::`)\n","import type {\n\tJoinToken,\n\tMutableAtomToken,\n\tReadonlyPureSelectorFamilyToken,\n} from \"atom.io\"\nimport { getInternalRelations, join, mutableAtom, selectorFamily } from \"atom.io\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nimport {\n\tisRoomKey,\n\tisUserKey,\n\ttype RoomKey,\n\ttype UserKey,\n} from \"./realtime-key-types\"\n\nexport type RoomSocketInterface<RoomNames extends string> = {\n\tcreateRoom: (roomName: RoomNames) => void\n\tjoinRoom: (roomKey: string) => void\n\t[leaveRoom: `leaveRoom:${string}`]: () => void\n\t[deleteRoom: `deleteRoom:${string}`]: () => void\n}\n\nexport const roomKeysAtom: MutableAtomToken<UList<string>> = mutableAtom({\n\tkey: `roomIndex`,\n\tclass: UList,\n})\n\nexport type UserInRoomMeta = {\n\tenteredAtEpoch: number\n}\nexport const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {\n\tenteredAtEpoch: 0,\n}\nexport const usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`> =\n\tjoin({\n\t\tkey: `usersInRooms`,\n\t\tbetween: [`room`, `user`],\n\t\tcardinality: `1:n`,\n\t\tisAType: isRoomKey,\n\t\tisBType: isUserKey,\n\t})\n\nexport const usersInMyRoomView: ReadonlyPureSelectorFamilyToken<\n\tMutableAtomToken<UList<RoomKey>>[],\n\tUserKey\n> = selectorFamily({\n\tkey: `usersInMyRoomView`,\n\tget:\n\t\t(myUsername) =>\n\t\t({ find }) => {\n\t\t\tconst [, roomsOfUsersAtoms] = getInternalRelations(usersInRooms, `split`)\n\t\t\tconst myRoomIndex = find(roomsOfUsersAtoms, myUsername)\n\t\t\treturn [myRoomIndex]\n\t\t},\n})\n"],"mappings":";;;;;AAGA,SAAgB,aACf,QACA,OACA,aACa;AACb,QAAO,GAAG,OAAO,YAAY;CAC7B,MAAM,qBAAqB;AAC1B,SAAO,IAAI,OAAO,YAAY;;AAE/B,QAAO;;;;;ACRR,MAAaA,aAAkD,WAAW;CACzE,KAAK;CACL,SAAS;CACT,CAAC;;;;ACYF,IAAa,eAAb,cAAwC,IAAuC;CAC9E,AAAO,IAAI,KAAQ,OAAgB;AAClC,MAAI,KAAK,IAAI,IAAI,EAAE;AAClB,WAAQ,KAAK,6DAA6D;IACzE;IACA;IACA,CAAC;AACF,UAAO;;AAER,SAAO,MAAM,IAAI,KAAK,MAAM;;;AAkB9B,IAAa,YAAb,MAAa,UAAU;CACtB,AAAO,OAAO;CAEd,AAAU,UAA4B,EAAE;CACxC,AAAU,UAAmC,EAAE;CAC/C,AAAU,eAAwC,EAAE;CACpD,AAAmB;CAEnB,AAAU,YAAY,KAAa;AAClC,OAAK,MAAM;;CAGZ,OAAc,WACb,IAAI,cAAc;CACnB,OAAc,OACb,KACA,SACkB;EAElB,MAAM,EAAE,MAAM,SAAS,SAAS,iBAAiB,QADnC,IAAI,UAAU,IAAI,CAC+B;EAC/D,MAAM,QAAQ;GAAE;GAAM;GAAK;GAAS;GAAS;GAAc;AAC3D,YAAU,SAAS,IAAI,KAAK,MAAM;AAClC,SAAO;;CAYR,AAAO,IACN,GAAG,MAII;AAEP,UADe,KAAK,GACL,MAAf;GACC,KAAK;GACL,KAAK;AACJ,SAAK,QAAQ,KAAK,GAAI,KAA0B;AAChD;GACD,KAAK;AACJ,SAAK,QAAQ,KAAK,GAAI,KAAiC;AACvD;GACD,KAAK;GACL,KAAK;IACJ;KACC,MAAM,CAAC,QAAQ,SAAS;AAIxB,UAAK,aAAa,KAAK;MACtB,MAAM;MACN,eAAe;MACf,WAAW;MACX,CAAC;;AAEH;;AAGF,SAAO;;;AAST,SAAgB,WAAW,SAA6C;CACvE,MAAM,EAAE,KAAK,WAAW;CACxB,MAAM,QAAQ,UAAU,OAAO,KAAK,OAAO;CAC3C,MAAM,EAAE,YAAY;AACpB,MAAK,MAAM,UAAU,QACpB,+BAA8B,SAAS,OAAO,KAAK,OAAO,IAAI;AAE/D,4BAA2B,SAAS,OAAO,KAAK,GAAG;AACnD,QAAO;;;;;AC/HR,MAAa,eAAe,QAC3B,IAAI,WAAW,WAAW;AAG3B,MAAa,aAAa,QACzB,IAAI,WAAW,SAAS;AAGzB,MAAa,aAAa,QACzB,IAAI,WAAW,SAAS;;;;ACYzB,MAAaC,eAAgD,YAAY;CACxE,KAAK;CACL,OAAO;CACP,CAAC;AAKF,MAAaC,4BAA4C,EACxD,gBAAgB,GAChB;AACD,MAAaC,eACZ,KAAK;CACJ,KAAK;CACL,SAAS,CAAC,QAAQ,OAAO;CACzB,aAAa;CACb,SAAS;CACT,SAAS;CACT,CAAC;AAEH,MAAaC,oBAGT,eAAe;CAClB,KAAK;CACL,MACE,gBACA,EAAE,WAAW;EACb,MAAM,GAAG,qBAAqB,qBAAqB,cAAc,QAAQ;AAEzE,SAAO,CADa,KAAK,mBAAmB,WAAW,CACnC;;CAEtB,CAAC"}
@@ -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>>","userKeysAtom: MutableAtomToken<UList<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>","selfListSelectors: PureSelectorFamilyToken<UserKey[], UserKey>"],"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/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/server-config.ts","../../src/realtime-server/realtime-server-stores/server-room-external-store.ts","../../src/realtime-server/realtime-server-stores/server-user-store.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts"],"sourcesContent":[],"mappings":"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"}
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>>","userKeysAtom: MutableAtomToken<UList<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>","selfListSelectors: PureSelectorFamilyToken<UserKey[], UserKey>"],"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/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/server-config.ts","../../src/realtime-server/realtime-server-stores/server-room-external-store.ts","../../src/realtime-server/realtime-server-stores/server-user-store.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]\n\t},\n\tUserKey\n>","unacknowledgedUpdatesAtoms: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n>","initialPayload: Json.Serializable[]","isAvailable","socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketKeysAtom: MutableAtomToken<UList<SocketKey>>","userKeysAtom: MutableAtomToken<UList<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>","selfListSelectors: PureSelectorFamilyToken<UserKey[], UserKey>","ROOMS: RoomMap","roomMeta: { count: number }","roomQueue: [string, ...Json.Array][]"],"sources":["../../src/realtime-server/continuity/continuity-store.ts","../../src/realtime-server/continuity/provide-outcomes.ts","../../src/realtime-server/continuity/provide-perspectives.ts","../../src/realtime-server/continuity/provide-startup-payloads.ts","../../src/realtime-server/continuity/receive-action-requests.ts","../../src/realtime-server/continuity/track-acknowledgements.ts","../../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/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/realtime-server-stores/server-user-store.ts","../../src/realtime-server/realtime-server-stores/server-room-external-store.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts"],"sourcesContent":["import type {\n\tRegularAtomFamilyToken,\n\tTransactionOutcomeEvent,\n\tTransactionSubEvent,\n} from \"atom.io\"\nimport { atomFamily } from \"atom.io\"\nimport type { UserKey } from \"atom.io/realtime\"\n\nexport function redactTransactionUpdateContent(\n\tvisibleStateKeys: string[],\n\tupdates: TransactionSubEvent[],\n): TransactionSubEvent[] {\n\treturn updates\n\t\t.map((update): TransactionSubEvent => {\n\t\t\tswitch (update.type) {\n\t\t\t\tcase `transaction_outcome`: {\n\t\t\t\t\tconst redacted = redactTransactionUpdateContent(\n\t\t\t\t\t\tvisibleStateKeys,\n\t\t\t\t\t\tupdate.subEvents,\n\t\t\t\t\t)\n\t\t\t\t\treturn { ...update, subEvents: redacted }\n\t\t\t\t}\n\t\t\t\tcase `atom_update`:\n\t\t\t\tcase `molecule_creation`:\n\t\t\t\tcase `molecule_disposal`:\n\t\t\t\tcase `molecule_transfer`:\n\t\t\t\tcase `state_creation`:\n\t\t\t\tcase `state_disposal`:\n\t\t\t\t\treturn update\n\t\t\t}\n\t\t})\n\t\t.filter((update) => {\n\t\t\tswitch (update.type) {\n\t\t\t\tcase `atom_update`:\n\t\t\t\tcase `state_creation`:\n\t\t\t\tcase `state_disposal`:\n\t\t\t\t\treturn visibleStateKeys.includes(update.token.key)\n\t\t\t\tcase `molecule_creation`:\n\t\t\t\tcase `transaction_outcome`:\n\t\t\t\tcase `molecule_disposal`:\n\t\t\t\tcase `molecule_transfer`:\n\t\t\t\t\treturn true\n\t\t\t}\n\t\t})\n}\n\nexport const redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]\n\t},\n\tUserKey\n> = atomFamily<\n\t{\n\t\tocclude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]\n\t},\n\tUserKey\n>({\n\tkey: `redactor`,\n\tdefault: { occlude: (updates) => updates },\n})\n\nexport type ContinuitySyncTransactionUpdate = Pick<\n\tTransactionOutcomeEvent<any>,\n\t`epoch` | `id` | `output` | `subEvents` | `token`\n>\nexport const unacknowledgedUpdatesAtoms: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n> = atomFamily<ContinuitySyncTransactionUpdate[], UserKey>({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetUpdateToken,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\n\nimport {\n\tredactTransactionUpdateContent,\n\tunacknowledgedUpdatesAtoms,\n} from \"./continuity-store\"\n\nexport function provideOutcomes(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst unsubscribeFunctions = new Set<() => void>()\n\n\tfor (const transaction of continuity.actions) {\n\t\tconst unsubscribeFromTransaction = subscribeToTransaction(\n\t\t\tstore,\n\t\t\ttransaction,\n\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\t(outcomes) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst visibleKeys = continuity.globals\n\t\t\t\t\t\t.map((atom) => {\n\t\t\t\t\t\t\tif (atom.type === `atom`) {\n\t\t\t\t\t\t\t\treturn atom.key\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn getUpdateToken(atom).key\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\tcontinuity.perspectives.flatMap((perspective) => {\n\t\t\t\t\t\t\t\tconst { viewAtoms } = perspective\n\t\t\t\t\t\t\t\tconst userPerspectiveTokenState = findInStore(\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\tviewAtoms,\n\t\t\t\t\t\t\t\t\tuserKey,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tconst visibleTokens = getFromStore(\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\tuserPerspectiveTokenState,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn visibleTokens.map((token) => {\n\t\t\t\t\t\t\t\t\tconst key =\n\t\t\t\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? `*` + token.key : token.key\n\t\t\t\t\t\t\t\t\treturn key\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\tconst redactedUpdates = redactTransactionUpdateContent(\n\t\t\t\t\t\tvisibleKeys,\n\t\t\t\t\t\toutcomes.subEvents,\n\t\t\t\t\t)\n\t\t\t\t\tconst redactedUpdate = {\n\t\t\t\t\t\t...outcomes,\n\t\t\t\t\t\tupdates: redactedUpdates,\n\t\t\t\t\t}\n\t\t\t\t\tsetIntoStore(store, unacknowledgedUpdatesAtoms, userKey, (updates) => {\n\t\t\t\t\t\tif (redactedUpdate) {\n\t\t\t\t\t\t\tupdates.push(redactedUpdate)\n\t\t\t\t\t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t\t`${userKey} unacknowledged update queue now has`,\n\t\t\t\t\t\t\t\tupdates.length,\n\t\t\t\t\t\t\t\t`items`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn updates\n\t\t\t\t\t})\n\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\t\t\tredactedUpdate as Json.Serializable,\n\t\t\t\t\t)\n\t\t\t\t} catch (thrown) {\n\t\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t`${userKey} failed to send update from transaction ${transaction.key} to ${userKey}`,\n\t\t\t\t\t\t\tthrown.message,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tunsubscribeFunctions.add(unsubscribeFromTransaction)\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\n\nexport function providePerspectives(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst unsubFns = new Set<() => void>()\n\tfor (const perspective of continuity.perspectives) {\n\t\tconst { viewAtoms } = perspective\n\t\tconst userViewState = findInStore(store, viewAtoms, userKey)\n\t\tconst unsubscribeFromUserView = subscribeToState(\n\t\t\tstore,\n\t\t\tuserViewState,\n\t\t\t`sync-continuity:${continuityKey}:${userKey}:perspective:${perspective.resourceAtoms.key}`,\n\t\t\t({ oldValue, newValue }) => {\n\t\t\t\tconst oldKeys = oldValue?.map((token) => token.key)\n\t\t\t\tconst newKeys = newValue.map((token) => token.key)\n\t\t\t\tconst concealed = oldValue?.filter(\n\t\t\t\t\t(token) => !newKeys.includes(token.key),\n\t\t\t\t)\n\t\t\t\tconst revealed = newValue\n\t\t\t\t\t.filter((token) => !oldKeys?.includes(token.key))\n\t\t\t\t\t.flatMap((token) => {\n\t\t\t\t\t\tconst resourceToken =\n\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? getJsonToken(store, token) : token\n\t\t\t\t\t\tconst resource = getFromStore(store, resourceToken)\n\t\t\t\t\t\treturn [resourceToken, resource]\n\t\t\t\t\t})\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`👁`,\n\t\t\t\t\t`atom`,\n\t\t\t\t\tperspective.resourceAtoms.key,\n\t\t\t\t\t`${userKey} has a new perspective`,\n\t\t\t\t\t{ oldKeys, newKeys, revealed, concealed },\n\t\t\t\t)\n\t\t\t\tif (revealed.length > 0) {\n\t\t\t\t\tsocket.emit(`reveal:${continuityKey}`, revealed)\n\t\t\t\t}\n\t\t\t\tif (concealed && concealed.length > 0) {\n\t\t\t\t\tsocket.emit(`conceal:${continuityKey}`, concealed)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tunsubFns.add(unsubscribeFromUserView)\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubFns) unsubscribe()\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tisRootStore,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\nimport { employSocket } from \"atom.io/realtime\"\n\nexport function provideStartupPayloads(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tfunction sendInitialPayload(): void {\n\t\tconst initialPayload: Json.Serializable[] = []\n\t\tfor (const atom of continuity.globals) {\n\t\t\tconst resourceToken =\n\t\t\t\tatom.type === `mutable_atom` ? getJsonToken(store, atom) : atom\n\t\t\tconst resource = getFromStore(store, resourceToken)\n\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t}\n\t\tfor (const perspective of continuity.perspectives) {\n\t\t\tconst { viewAtoms, resourceAtoms } = perspective\n\t\t\tconst userViewState = findInStore(store, viewAtoms, userKey)\n\t\t\tconst userView = getFromStore(store, userViewState)\n\t\t\tstore.logger.info(`👁`, `atom`, resourceAtoms.key, `${userKey} can see`, {\n\t\t\t\tviewAtoms,\n\t\t\t\tresourceAtoms,\n\t\t\t\tuserView,\n\t\t\t})\n\t\t\tfor (const visibleToken of userView) {\n\t\t\t\tconst resourceToken =\n\t\t\t\t\tvisibleToken.type === `mutable_atom`\n\t\t\t\t\t\t? getJsonToken(store, visibleToken)\n\t\t\t\t\t\t: visibleToken\n\t\t\t\tconst resource = getFromStore(store, resourceToken)\n\n\t\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t\t}\n\t\t}\n\n\t\tconst epoch = isRootStore(store)\n\t\t\t? (store.transactionMeta.epoch.get(continuityKey) ?? null)\n\t\t\t: null\n\n\t\tsocket.emit(`continuity-init:${continuityKey}`, epoch, initialPayload)\n\t}\n\treturn employSocket(socket, `get:${continuityKey}`, sendInitialPayload)\n}\n","import type { TransactionOutcomeEvent, TransactionToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { actUponStore } from \"atom.io/internal\"\nimport type { Json, JsonIO } from \"atom.io/json\"\nimport type { ContinuityToken, Socket } from \"atom.io/realtime\"\nimport { employSocket } from \"atom.io/realtime\"\n\nexport function receiveActionRequests(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: string,\n): () => void {\n\tconst continuityKey = continuity.key\n\n\treturn employSocket(\n\t\tsocket,\n\t\t`tx-run:${continuityKey}`,\n\t\tfunction serveTransactionRequest(\n\t\t\ttxOutcome: Json.Serializable &\n\t\t\t\tPick<\n\t\t\t\t\tTransactionOutcomeEvent<TransactionToken<JsonIO>>,\n\t\t\t\t\t`id` | `params` | `token`\n\t\t\t\t>,\n\t\t) {\n\t\t\tstore.logger.info(`🛎️`, `continuity`, continuityKey, `received`, txOutcome)\n\t\t\tconst transactionKey = txOutcome.token.key\n\t\t\tconst updateId = txOutcome.id\n\t\t\tconst performanceKey = `tx-run:${transactionKey}:${updateId}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\ttry {\n\t\t\t\tactUponStore(\n\t\t\t\t\tstore,\n\t\t\t\t\t{ type: `transaction`, key: transactionKey },\n\t\t\t\t\tupdateId,\n\t\t\t\t)(...txOutcome.params)\n\t\t\t} catch (thrown) {\n\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`failed to run transaction ${transactionKey} from ${userKey} with update ${updateId}`,\n\t\t\t\t\t\tthrown.message,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore.logger.info(\n\t\t\t\t`🚀`,\n\t\t\t\t`transaction`,\n\t\t\t\ttransactionKey,\n\t\t\t\tupdateId,\n\t\t\t\tuserKey,\n\t\t\t\tmetric.duration,\n\t\t\t)\n\t\t},\n\t)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { getFromStore, setIntoStore } from \"atom.io/internal\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport { unacknowledgedUpdatesAtoms } from \"./continuity-store\"\n\nexport function trackAcknowledgements(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst userUnacknowledgedUpdates = getFromStore(\n\t\tstore,\n\t\tunacknowledgedUpdatesAtoms,\n\t\tuserKey,\n\t)\n\tfunction trackClientAcknowledgement(epoch: number): void {\n\t\tstore.logger.info(\n\t\t\t`👍`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`${userKey} acknowledged epoch ${epoch}`,\n\t\t)\n\t\tconst isUnacknowledged = userUnacknowledgedUpdates[0]?.epoch === epoch\n\t\tif (isUnacknowledged) {\n\t\t\tsetIntoStore(store, unacknowledgedUpdatesAtoms, userKey, (updates) => {\n\t\t\t\tupdates.shift()\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`👍`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`${userKey} unacknowledged update queue now has`,\n\t\t\t\t\tupdates.length,\n\t\t\t\t\t`items`,\n\t\t\t\t)\n\t\t\t\treturn updates\n\t\t\t})\n\t\t}\n\t}\n\treturn employSocket(socket, `ack:${continuityKey}`, trackClientAcknowledgement)\n}\n","import { getFromStore, IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken, UserKey } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \"..\"\nimport { unacknowledgedUpdatesAtoms } from \"./continuity-store\"\nimport { provideOutcomes } from \"./provide-outcomes\"\nimport { providePerspectives } from \"./provide-perspectives\"\nimport { provideStartupPayloads } from \"./provide-startup-payloads\"\nimport { receiveActionRequests } from \"./receive-action-requests\"\nimport { trackAcknowledgements } from \"./track-acknowledgements\"\n\nexport type ProvideContinuity = (\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n) => () => void\nexport function prepareToProvideContinuity({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig): ProvideContinuity {\n\treturn function syncRealtimeContinuity(continuity, userKey) {\n\t\tconst continuityKey = continuity.key\n\n\t\tconst unacknowledgedUpdates = getFromStore(\n\t\t\tstore,\n\t\t\tunacknowledgedUpdatesAtoms,\n\t\t\tuserKey,\n\t\t)\n\t\tfor (const unacknowledgedUpdate of unacknowledgedUpdates) {\n\t\t\tsocket.emit(\n\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\tunacknowledgedUpdate as Json.Serializable,\n\t\t\t)\n\t\t}\n\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsubscribe of subscriptions) unsubscribe()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tsubscriptions.add(providePerspectives(store, socket, continuity, userKey))\n\t\tsubscriptions.add(provideOutcomes(store, socket, continuity, userKey))\n\t\tsubscriptions.add(provideStartupPayloads(store, socket, continuity, userKey))\n\t\tsubscriptions.add(receiveActionRequests(store, socket, continuity, userKey))\n\t\tsubscriptions.add(trackAcknowledgements(store, socket, continuity, userKey))\n\n\t\treturn clearSubscriptions\n\t}\n}\n","import type { Json, stringified } from \"atom.io/json\"\nimport type { Socket } from \"atom.io/realtime\"\n\nexport type Events = Json.Object<string, Json.Serializable[]>\n\nexport type EventPayload<\n\treceiveRelay extends Events,\n\tK extends string & keyof receiveRelay = string & keyof receiveRelay,\n> = [string, ...receiveRelay[K]]\n\nexport interface EventBuffer<\n\tE extends Events,\n\tK extends string & keyof E = string & keyof E,\n> extends Buffer {\n\ttoString(): stringified<EventPayload<E, K>>\n}\n\nexport abstract class CustomSocket<I extends Events, O extends Events>\n\timplements Socket\n{\n\tprotected listeners: Map<keyof O, Set<(...args: Json.Array) => void>>\n\tprotected globalListeners: Set<(event: string, ...args: Json.Array) => void>\n\tprotected handleEvent<K extends string & keyof I>(\n\t\t...args: EventPayload<I, K>\n\t): void {\n\t\tconst [event, ...rest] = args\n\t\tfor (const listener of this.globalListeners) {\n\t\t\tlistener(event, ...rest)\n\t\t}\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...rest)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic id = `no_id_retrieved`\n\tpublic emit: <Event extends keyof I>(\n\t\tevent: Event,\n\t\t...args: I[Event]\n\t) => CustomSocket<I, O>\n\n\tpublic constructor(\n\t\temit: <Event extends keyof I>(\n\t\t\tevent: Event,\n\t\t\t...args: I[Event]\n\t\t) => CustomSocket<I, O>,\n\t) {\n\t\tthis.emit = emit\n\t\tthis.listeners = new Map()\n\t\tthis.globalListeners = new Set()\n\t}\n\n\tpublic on<Event extends keyof O>(\n\t\tevent: Event,\n\t\tlistener: (...args: O[Event]) => void,\n\t): this {\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tlisteners.add(listener)\n\t\t} else {\n\t\t\tthis.listeners.set(event, new Set([listener]))\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic onAny(listener: (event: string, ...args: Json.Array) => void): this {\n\t\tthis.globalListeners.add(listener)\n\t\treturn this\n\t}\n\n\tpublic off<Event extends keyof O>(\n\t\tevent: Event,\n\t\tlistener?: (...args: O[Event]) => void,\n\t): this {\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tif (listener) {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t} else {\n\t\t\t\tthis.listeners.delete(event)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic offAny(listener: (event: string, ...args: Json.Array) => void): this {\n\t\tthis.globalListeners.delete(listener)\n\t\treturn this\n\t}\n}\n","import type { Readable, Writable } from \"node:stream\"\n\nimport type { Json, stringified } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { EventBuffer, EventPayload, Events } from \"./custom-socket\"\nimport { CustomSocket } from \"./custom-socket\"\n\n/* eslint-disable no-console */\n\nexport type ChildProcess = {\n\tpid?: number | undefined\n\tstdin: Writable\n\tstdout: Readable\n\tstderr: Readable\n}\n\nexport type StderrLog = [`e` | `i` | `w`, ...Json.Array]\n\nexport class ChildSocket<\n\tI extends Events,\n\tO extends Events,\n\tP extends ChildProcess = ChildProcess,\n> extends CustomSocket<I, O> {\n\tprotected incompleteData = ``\n\tprotected unprocessedEvents: string[] = []\n\tprotected incompleteLog = ``\n\tprotected unprocessedLogs: string[] = []\n\n\tpublic id = `#####`\n\n\tpublic proc: P\n\tpublic key: string\n\tpublic logger: Pick<Console, `error` | `info` | `warn`>\n\n\tprotected handleLog(log: StderrLog): void {\n\t\tif (Array.isArray(log)) {\n\t\t\tconst [level, ...rest] = log\n\t\t\tswitch (level) {\n\t\t\t\tcase `i`:\n\t\t\t\t\tthis.logger.info(...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `w`:\n\t\t\t\t\tthis.logger.warn(...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `e`:\n\t\t\t\t\tthis.logger.error(...rest)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tproc: P,\n\t\tkey: string,\n\t\tlogger?: Pick<Console, `error` | `info` | `warn`>,\n\t) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args]) + `\\x03`\n\t\t\tconst errorHandler = (err: { code: string }) => {\n\t\t\t\tif (err.code === `EPIPE`) {\n\t\t\t\t\tconsole.error(`EPIPE error during write`, this.proc.stdin)\n\t\t\t\t}\n\t\t\t\tthis.proc.stdin.removeListener(`error`, errorHandler)\n\t\t\t}\n\n\t\t\tthis.proc.stdin.once(`error`, errorHandler)\n\t\t\tthis.proc.stdin.write(stringifiedEvent)\n\n\t\t\treturn this\n\t\t})\n\t\tthis.proc = proc\n\t\tthis.key = key\n\t\tthis.logger = logger ?? {\n\t\t\tinfo: (...args: unknown[]) => {\n\t\t\t\tconsole.info(this.id, this.key, ...args)\n\t\t\t},\n\t\t\twarn: (...args: unknown[]) => {\n\t\t\t\tconsole.warn(this.id, this.key, ...args)\n\t\t\t},\n\t\t\terror: (...args: unknown[]) => {\n\t\t\t\tconsole.error(this.id, this.key, ...args)\n\t\t\t},\n\t\t}\n\t\tthis.proc.stdout.on(\n\t\t\t`data`,\n\t\t\t<K extends string & keyof I>(buffer: EventBuffer<I, K>) => {\n\t\t\t\tconst chunk = buffer.toString()\n\n\t\t\t\tif (chunk === `ALIVE`) {\n\t\t\t\t\tthis.logger.info(chunk)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst pieces = chunk.split(`\\x03`)\n\t\t\t\tconst initialMaybeWellFormed = pieces[0]\n\t\t\t\tpieces[0] = this.incompleteData + initialMaybeWellFormed\n\t\t\t\tlet idx = 0\n\t\t\t\tfor (const piece of pieces) {\n\t\t\t\t\tif (piece === ``) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonPiece = parseJson(piece as stringified<EventPayload<I, K>>)\n\t\t\t\t\t\tthis.handleEvent(...jsonPiece)\n\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t} catch (thrown0) {\n\t\t\t\t\t\tif (thrown0 instanceof Error) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t`❌ Malformed data received from child process`,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tpiece,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tthrown0.message,\n\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (idx === 0) {\n\t\t\t\t\t\t\t\tthis.incompleteData = piece\n\t\t\t\t\t\t\t\tconst maybeActualJsonPiece = parseJson(\n\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed as stringified<EventPayload<I, K>>,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tthis.handleEvent(...maybeActualJsonPiece)\n\t\t\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.incompleteData += piece\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (thrown1) {\n\t\t\t\t\t\t\tif (thrown1 instanceof Error) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t`❌ Malformed data received from child process`,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tthrown1.message,\n\t\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t++idx\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tthis.proc.stderr.on(`data`, (buffer: Buffer) => {\n\t\t\tconst chunk = buffer.toString()\n\t\t\tconst pieces = chunk.split(`\\x03`)\n\t\t\tconst initialMaybeWellFormed = pieces[0]\n\t\t\tpieces[0] = this.incompleteData + initialMaybeWellFormed\n\t\t\tlet idx = 0\n\t\t\tfor (const piece of pieces) {\n\t\t\t\tif (piece === ``) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst jsonPiece = parseJson(piece as stringified<StderrLog>)\n\t\t\t\t\tthis.handleLog(jsonPiece)\n\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t} catch (thrown0) {\n\t\t\t\t\tif (thrown0 instanceof Error) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t`❌ Malformed log received from child process`,\n\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\tpiece,\n\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\tthrown0.message,\n\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (idx === 0) {\n\t\t\t\t\t\t\tthis.incompleteData = piece\n\t\t\t\t\t\t\tconst maybeActualJsonPiece = parseJson(\n\t\t\t\t\t\t\t\tinitialMaybeWellFormed as stringified<StderrLog>,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthis.handleLog(maybeActualJsonPiece)\n\t\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.incompleteData += piece\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (thrown1) {\n\t\t\t\t\t\tif (thrown1 instanceof Error) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t`❌ Malformed log received from child process...`,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tthrown1.message,\n\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t++idx\n\t\t\t}\n\t\t})\n\t\tif (proc.pid) {\n\t\t\tthis.id = proc.pid.toString()\n\t\t}\n\t}\n}\n","import type { Readable, Writable } from \"node:stream\"\n\nimport { Subject } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\nimport type { UserKey } from \"atom.io/realtime\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nimport type { StderrLog } from \"./child-socket\"\nimport type { EventBuffer, EventPayload, Events } from \"./custom-socket\"\nimport { CustomSocket } from \"./custom-socket\"\n\nexport class SubjectSocket<\n\tI extends Events,\n\tO extends Events,\n> extends CustomSocket<I, O> {\n\tpublic in: Subject<EventPayload<I>>\n\tpublic out: Subject<EventPayload<O>>\n\tpublic id = `no_id_retrieved`\n\tpublic disposalFunctions: (() => void)[] = []\n\n\tpublic constructor(id: string) {\n\t\tsuper((...args) => {\n\t\t\tthis.out.next(args as any)\n\t\t\treturn this\n\t\t})\n\t\tthis.id = id\n\t\tthis.in = new Subject()\n\t\tthis.out = new Subject()\n\t\tthis.in.subscribe(`socket`, (event) => {\n\t\t\tthis.handleEvent(...event)\n\t\t})\n\t}\n\n\tpublic dispose(): void {\n\t\tfor (const dispose of this.disposalFunctions) {\n\t\t\tdispose()\n\t\t}\n\t}\n}\n\nexport type ParentProcess = {\n\tpid?: number | undefined\n\tstdin: Readable\n\tstdout: Writable\n\tstderr: Writable\n\texit: (code?: number) => void\n}\n\nexport class ParentSocket<\n\tI extends Events & {\n\t\t[id in string as `relay::${id}`]: [string, ...Json.Array[]]\n\t},\n\tO extends Events & {\n\t\t[id in string as `user::${id}`]: [string, ...Json.Array[]]\n\t} & {\n\t\t/* eslint-disable quotes */\n\t\t\"user-joins\": [key: UserKey]\n\t\t\"user-leaves\": [key: UserKey]\n\t\t/* eslint-enable quotes */\n\t},\n\tP extends ParentProcess = ParentProcess,\n> extends CustomSocket<I, O> {\n\tprotected incompleteData = ``\n\tprotected unprocessedEvents: string[] = []\n\tprotected relays: Map<string, SubjectSocket<any, any>>\n\tprotected relayServices: ((\n\t\tsocket: SubjectSocket<any, any>,\n\t\tuserKey: UserKey,\n\t) => (() => void) | void)[]\n\tpublic proc: P\n\n\tpublic id = `#####`\n\n\tprotected log(...args: StderrLog): void {\n\t\tthis.proc.stderr.write(\n\t\t\tstringifyJson(\n\t\t\t\targs.map((arg) =>\n\t\t\t\t\targ instanceof UList ? `{ ${arg.toJSON().join(` | `)} }` : arg,\n\t\t\t\t),\n\t\t\t) + `\\x03`,\n\t\t)\n\t}\n\tpublic logger = {\n\t\tinfo: (...args: Json.Array): void => {\n\t\t\tthis.log(`i`, ...args)\n\t\t},\n\t\twarn: (...args: Json.Array): void => {\n\t\t\tthis.log(`w`, ...args)\n\t\t},\n\t\terror: (...args: Json.Array): void => {\n\t\t\tthis.log(`e`, ...args)\n\t\t},\n\t}\n\n\tpublic constructor(proc: P) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args])\n\t\t\tthis.proc.stdout.write(stringifiedEvent + `\\x03`)\n\t\t\treturn this\n\t\t})\n\t\tthis.proc = proc\n\t\tthis.proc.stdin.resume()\n\t\tthis.relays = new Map()\n\t\tthis.relayServices = []\n\n\t\tthis.proc.stdin.on(\n\t\t\t`data`,\n\t\t\t<K extends string & keyof I>(buffer: EventBuffer<I, K>) => {\n\t\t\t\tconst chunk = buffer.toString()\n\t\t\t\tconst pieces = chunk.split(`\\x03`)\n\t\t\t\tconst initialMaybeWellFormed = pieces[0]\n\t\t\t\tpieces[0] = this.incompleteData + initialMaybeWellFormed\n\t\t\t\tlet idx = 0\n\t\t\t\tfor (const piece of pieces) {\n\t\t\t\t\tif (piece === ``) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonPiece = parseJson(piece)\n\t\t\t\t\t\tthis.logger.info(`🎰`, `received`, jsonPiece)\n\t\t\t\t\t\tthis.handleEvent(...(jsonPiece as EventPayload<I>))\n\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t} catch (thrown0) {\n\t\t\t\t\t\tif (thrown0 instanceof Error) {\n\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t`received malformed data from parent process:`,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tpiece,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tthrown0.message,\n\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (idx === 0) {\n\t\t\t\t\t\t\t\tthis.incompleteData = piece\n\t\t\t\t\t\t\t\tconst maybeActualJsonPiece = parseJson(initialMaybeWellFormed)\n\t\t\t\t\t\t\t\tthis.logger.info(`🎰`, `received`, maybeActualJsonPiece)\n\t\t\t\t\t\t\t\tthis.handleEvent(...(maybeActualJsonPiece as EventPayload<I>))\n\t\t\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.incompleteData += piece\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (thrown1) {\n\t\t\t\t\t\t\tif (thrown1 instanceof Error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t`received malformed data from parent process:`,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tthrown1.message,\n\t\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t++idx\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\n\t\tthis.on(`exit`, () => {\n\t\t\tthis.logger.info(`🔥`, this.id, `received \"exit\"`)\n\t\t\tthis.proc.exit(0)\n\t\t})\n\n\t\tif (this.proc.pid) {\n\t\t\tthis.id = this.proc.pid?.toString()\n\t\t}\n\n\t\tthis.on(`user-joins`, (username: string) => {\n\t\t\tthis.logger.info(`👤`, `user`, username, `joined`)\n\t\t\tconst userKey = `user::${username}` satisfies UserKey\n\t\t\tconst relay = new SubjectSocket(userKey)\n\t\t\tthis.relays.set(username, relay)\n\t\t\tthis.logger.info(\n\t\t\t\t`🔗`,\n\t\t\t\t`attaching services:`,\n\t\t\t\t`[${[...this.relayServices.keys()].join(`, `)}]`,\n\t\t\t)\n\t\t\tfor (const attachRelay of this.relayServices) {\n\t\t\t\tconst cleanupRelay = attachRelay(relay, userKey)\n\t\t\t\tif (cleanupRelay) {\n\t\t\t\t\trelay.disposalFunctions.push(cleanupRelay)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.on(userKey, (...data) => {\n\t\t\t\trelay.in.next(data)\n\t\t\t})\n\t\t\trelay.out.subscribe(`socket`, (data) => {\n\t\t\t\tthis.emit(...(data as [string, ...I[keyof I]]))\n\t\t\t})\n\t\t})\n\n\t\tthis.on(`user-leaves`, (username) => {\n\t\t\tconst relay = this.relays.get(username)\n\t\t\tthis.off(`relay:${username}`)\n\t\t\tif (relay) {\n\t\t\t\trelay.dispose()\n\t\t\t\tthis.relays.delete(username)\n\t\t\t}\n\t\t})\n\n\t\tthis.proc.stdout.write(`ALIVE`)\n\t}\n\n\tpublic receiveRelay(\n\t\tattachServices: (\n\t\t\tsocket: SubjectSocket<any, any>,\n\t\t\tuserKey: UserKey,\n\t\t) => (() => void) | void,\n\t): void {\n\t\tthis.logger.info(`🔗`, `running relay method`)\n\t\tthis.relayServices.push(attachServices)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Canonical, Json, stringified } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type FamilyProvider = ReturnType<typeof realtimeAtomFamilyProvider>\nexport function realtimeAtomFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<\n\t\tJ extends Json.Serializable,\n\t\tK extends Canonical,\n\t>(\n\t\tfamily: AtomIO.RegularAtomFamilyToken<J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst coreSubscriptions = new Set<() => void>()\n\t\tconst clearCoreSubscriptions = () => {\n\t\t\tfor (const unsub of coreSubscriptions) unsub()\n\t\t\tcoreSubscriptions.clear()\n\t\t}\n\t\tconst familyMemberSubscriptionsWanted = new Set<stringified<K>>()\n\t\tconst familyMemberSubscriptions = new Map<string, () => void>()\n\t\tconst clearFamilySubscriptions = () => {\n\t\t\tfor (const unsub of familyMemberSubscriptions.values()) unsub()\n\t\t\tfamilyMemberSubscriptions.clear()\n\t\t}\n\n\t\tconst fillUnsubRequest = (key: string) => {\n\t\t\tconst unsubUnsub = familyMemberSubscriptions.get(`${key}:unsub`)\n\t\t\tif (unsubUnsub) {\n\t\t\t\tunsubUnsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(`${key}:unsub`)\n\t\t\t}\n\t\t\tconst unsub = familyMemberSubscriptions.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst exposeFamilyMembers = (subKey: K) => {\n\t\t\tconst token = findInStore(store, family, subKey)\n\t\t\tgetFromStore(store, token)\n\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(store, token))\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\ttoken.key,\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\ttoken,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\t`${token.key}:unsub`,\n\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\tfillUnsubRequest(token.key)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tconst isAvailable = (exposedSubKeys: Iterable<K>, subKey: K): boolean => {\n\t\t\tfor (const exposedSubKey of exposedSubKeys) {\n\t\t\t\tif (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tcoreSubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${family.key}`, (subKey: K) => {\n\t\t\t\t\tconst exposedSubKeys = getFromStore(store, index)\n\t\t\t\t\tconst shouldExpose = isAvailable(exposedSubKeys, subKey)\n\t\t\t\t\tif (shouldExpose) {\n\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfamilyMemberSubscriptionsWanted.add(stringifyJson(subKey))\n\t\t\t\t\t\tsocket.emit(`unavailable:${family.key}`, subKey)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\t\t\tcoreSubscriptions.add(\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\tindex,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue: newExposedSubKeys }) => {\n\t\t\t\t\t\tfor (const subKey of newExposedSubKeys) {\n\t\t\t\t\t\t\tif (familyMemberSubscriptionsWanted.has(stringifyJson(subKey))) {\n\t\t\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn () => {\n\t\t\tclearCoreSubscriptions()\n\t\t\tclearFamilySubscriptions()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Canonical, stringified } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nconst isAvailable = <K extends Canonical>(\n\texposedSubKeys: Iterable<K>,\n\tsubKey: K,\n): boolean => {\n\tfor (const exposedSubKey of exposedSubKeys) {\n\t\tif (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nexport type MutableFamilyProvider = ReturnType<\n\ttypeof realtimeMutableFamilyProvider\n>\nexport function realtimeMutableFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableFamilyProvider<\n\t\tT extends Transceiver<any, any, any>,\n\t\tK extends Canonical,\n\t>(\n\t\tfamily: AtomIO.MutableAtomFamilyToken<T, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst coreSubscriptions = new Set<() => void>()\n\t\tconst clearCoreSubscriptions = () => {\n\t\t\tfor (const unsub of coreSubscriptions) unsub()\n\t\t\tcoreSubscriptions.clear()\n\t\t}\n\t\tconst familyMemberSubscriptionsWanted = new Set<stringified<K>>()\n\t\tconst familyMemberSubscriptions = new Map<string, () => void>()\n\t\tconst clearFamilySubscriptions = () => {\n\t\t\tfor (const unsub of familyMemberSubscriptions.values()) unsub()\n\t\t\tfamilyMemberSubscriptions.clear()\n\t\t}\n\n\t\tconst fillUnsubRequest = (key: string) => {\n\t\t\tconst unsubUnsub = familyMemberSubscriptions.get(`${key}:unsub`)\n\t\t\tif (unsubUnsub) {\n\t\t\t\tunsubUnsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(`${key}:unsub`)\n\t\t\t}\n\t\t\tconst unsub = familyMemberSubscriptions.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst exposeFamilyMembers = (subKey: K) => {\n\t\t\tconst token = findInStore(store, family, subKey)\n\t\t\tgetFromStore(store, token)\n\t\t\tconst jsonToken = getJsonToken(store, token)\n\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\tsocket.emit(`init:${token.key}`, getFromStore(store, jsonToken))\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\ttoken.key,\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\t`${token.key}:unsub`,\n\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\tfillUnsubRequest(token.key)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tcoreSubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${family.key}`, (subKey: K) => {\n\t\t\t\t\tconst exposedSubKeys = getFromStore(store, index)\n\t\t\t\t\tconst shouldExpose = isAvailable(exposedSubKeys, subKey)\n\t\t\t\t\tif (shouldExpose) {\n\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfamilyMemberSubscriptionsWanted.add(stringifyJson(subKey))\n\t\t\t\t\t\tsocket.emit(`unavailable:${family.key}`, subKey)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\t\t\tcoreSubscriptions.add(\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\tindex,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue: newExposedSubKeys }) => {\n\t\t\t\t\t\tfor (const subKey of newExposedSubKeys) {\n\t\t\t\t\t\t\tif (familyMemberSubscriptionsWanted.has(stringifyJson(subKey))) {\n\t\t\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn () => {\n\t\t\tclearCoreSubscriptions()\n\t\t\tclearFamilySubscriptions()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableProvider = ReturnType<typeof realtimeMutableProvider>\nexport function realtimeMutableProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableProvider<\n\t\tCore extends Transceiver<any, Json.Serializable, Json.Serializable>,\n\t>(token: AtomIO.MutableAtomToken<Core>): () => void {\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsub of subscriptions) unsub()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst start = () => {\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${token.key}`, () => {\n\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\tsocket.emit(`init:${token.key}`, getFromStore(store, jsonToken))\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\tsubscribeToState(\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\t\t\tstart()\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn clearSubscriptions\n\t}\n}\n","import type {\n\tHierarchy,\n\tJoinToken,\n\tMutableAtomToken,\n\tPureSelectorFamilyToken,\n\tRegularAtomFamilyToken,\n} from \"atom.io\"\nimport { atomFamily, join, mutableAtom, selectorFamily } from \"atom.io\"\nimport type { RoomKey, Socket, SocketKey, UserKey } from \"atom.io/realtime\"\nimport { isSocketKey, isUserKey } from \"atom.io/realtime\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nexport type SocketSystemHierarchy = Hierarchy<\n\t[\n\t\t{\n\t\t\tabove: `root`\n\t\t\tbelow: [UserKey, SocketKey, RoomKey]\n\t\t},\n\t]\n>\n\nexport const socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey> =\n\tatomFamily<Socket | null, SocketKey>({\n\t\tkey: `sockets`,\n\t\tdefault: null,\n\t})\n\nexport const socketKeysAtom: MutableAtomToken<UList<SocketKey>> = mutableAtom<\n\tUList<SocketKey>\n>({\n\tkey: `socketsIndex`,\n\tclass: UList,\n})\nexport const userKeysAtom: MutableAtomToken<UList<UserKey>> = mutableAtom<\n\tUList<UserKey>\n>({\n\tkey: `usersIndex`,\n\tclass: UList,\n})\nexport const usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n> = join({\n\tkey: `usersOfSockets`,\n\tbetween: [`user`, `socket`],\n\tcardinality: `1:1`,\n\tisAType: isUserKey,\n\tisBType: isSocketKey,\n})\n\nexport const selfListSelectors: PureSelectorFamilyToken<UserKey[], UserKey> =\n\tselectorFamily<UserKey[], UserKey>({\n\t\tkey: `selfList`,\n\t\tget: (userId) => () => [userId],\n\t})\n","import type { ChildProcessWithoutNullStreams } from \"node:child_process\"\nimport { spawn } from \"node:child_process\"\n\nimport type { Store } from \"atom.io/internal\"\nimport {\n\teditRelationsInStore,\n\tfindInStore,\n\tfindRelationsInStore,\n\tgetFromStore,\n\tgetInternalRelationsFromStore,\n\tIMPLICIT,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { RoomKey, Socket, SocketKey, UserKey } from \"atom.io/realtime\"\nimport { roomKeysAtom, usersInRooms } from \"atom.io/realtime\"\n\nimport { ChildSocket } from \"../ipc-sockets\"\nimport { realtimeMutableFamilyProvider } from \"../realtime-mutable-family-provider\"\nimport { realtimeMutableProvider } from \"../realtime-mutable-provider\"\nimport type { ServerConfig } from \"../server-config\"\nimport {\n\tselfListSelectors,\n\tsocketKeysAtom,\n\tuserKeysAtom,\n\tusersOfSockets,\n} from \"./server-user-store\"\n\nexport type RoomMap = Map<\n\tstring,\n\tChildSocket<any, any, ChildProcessWithoutNullStreams>\n>\n\ndeclare global {\n\tvar ATOM_IO_REALTIME_SERVER_ROOMS: RoomMap\n}\n\nexport const ROOMS: RoomMap =\n\tglobalThis.ATOM_IO_REALTIME_SERVER_ROOMS ??\n\t(globalThis.ATOM_IO_REALTIME_SERVER_ROOMS = new Map())\n\nexport const roomMeta: { count: number } = { count: 0 }\n\nexport async function spawnRoom(\n\tstore: Store,\n\troomKey: RoomKey,\n\tcommand: string,\n\targs: string[],\n): Promise<ChildSocket<any, any>> {\n\tconst child = await new Promise<ChildProcessWithoutNullStreams>((resolve) => {\n\t\tconst room = spawn(command, args, { env: process.env })\n\t\tconst resolver = (data: Buffer) => {\n\t\t\tif (data.toString() === `ALIVE`) {\n\t\t\t\troom.stdout.off(`data`, resolver)\n\t\t\t\tresolve(room)\n\t\t\t}\n\t\t}\n\t\troom.stdout.on(`data`, resolver)\n\t})\n\tconst roomSocket = new ChildSocket(child, roomKey)\n\tROOMS.set(roomKey, roomSocket)\n\tsetIntoStore(store, roomKeysAtom, (index) => (index.add(roomKey), index))\n\n\troomSocket.on(`close`, () => {\n\t\tdestroyRoom(store, roomKey)\n\t})\n\n\treturn roomSocket\n}\n\nexport function joinRoom(\n\tstore: Store,\n\troomKey: RoomKey,\n\tuserKey: UserKey,\n\tsocket: Socket,\n): {\n\tleave: () => void\n\troomSocket: ChildSocket<any, any, ChildProcessWithoutNullStreams>\n} | null {\n\tconst roomQueue: [string, ...Json.Array][] = []\n\tconst pushToRoomQueue = (payload: [string, ...Json.Array]): void => {\n\t\troomQueue.push(payload)\n\t}\n\tlet toRoom = pushToRoomQueue\n\tconst forward = (...payload: [string, ...Json.Array]) => {\n\t\ttoRoom(payload)\n\t}\n\tsocket.onAny(forward)\n\n\teditRelationsInStore(store, usersInRooms, (relations) => {\n\t\trelations.set({ room: roomKey, user: userKey })\n\t})\n\tconst roomSocket = ROOMS.get(roomKey)\n\tif (!roomSocket) {\n\t\tstore.logger.error(`❌`, `unknown`, roomKey, `no room found with this id`)\n\t\treturn null\n\t}\n\troomSocket.onAny((...payload) => {\n\t\tsocket.emit(...payload)\n\t})\n\troomSocket.emit(`user-joins`, userKey)\n\n\ttoRoom = (payload) => {\n\t\troomSocket.emit(`user::${userKey}`, ...payload)\n\t}\n\twhile (roomQueue.length > 0) {\n\t\tconst payload = roomQueue.shift()\n\t\tif (payload) toRoom(payload)\n\t}\n\n\tconst leave = () => {\n\t\tsocket.offAny(forward)\n\t\ttoRoom([`user-leaves`])\n\t\tleaveRoom(store, roomKey, userKey)\n\t}\n\n\treturn { leave, roomSocket }\n}\n\nexport function leaveRoom(\n\tstore: Store,\n\troomKey: RoomKey,\n\tuserKey: UserKey,\n): void {\n\teditRelationsInStore(store, usersInRooms, (relations) => {\n\t\trelations.delete({ room: roomKey, user: userKey })\n\t})\n}\n\nexport function destroyRoom(store: Store, roomKey: RoomKey): void {\n\tsetIntoStore(store, roomKeysAtom, (s) => (s.delete(roomKey), s))\n\teditRelationsInStore(store, usersInRooms, (relations) => {\n\t\trelations.delete({ room: roomKey })\n\t})\n\tconst room = ROOMS.get(roomKey)\n\tif (room) {\n\t\troom.emit(`exit`)\n\t\tROOMS.delete(roomKey)\n\t}\n}\n\nexport function provideRooms<RoomNames extends string>(\n\t{ store = IMPLICIT.STORE, socket }: ServerConfig,\n\tresolveRoomScript: (path: string) => [string, string[]],\n): void {\n\tconst socketKey = `socket::${socket.id}` satisfies SocketKey\n\tconst userKey = getFromStore(\n\t\tstore,\n\t\tfindRelationsInStore(store, usersOfSockets, socketKey).userKeyOfSocket,\n\t)!\n\n\tconst exposeMutable = realtimeMutableProvider({ socket, store })\n\tconst exposeMutableFamily = realtimeMutableFamilyProvider({\n\t\tsocket,\n\t\tstore,\n\t})\n\n\texposeMutable(roomKeysAtom)\n\n\tconst usersInRoomsAtoms = getInternalRelationsFromStore(store, usersInRooms)\n\tconst usersWhoseRoomsCanBeSeenSelector = findInStore(\n\t\tstore,\n\t\tselfListSelectors,\n\t\tuserKey,\n\t)\n\texposeMutableFamily(usersInRoomsAtoms, usersWhoseRoomsCanBeSeenSelector)\n\tconst usersOfSocketsAtoms = getInternalRelationsFromStore(\n\t\tstore,\n\t\tusersOfSockets,\n\t)\n\texposeMutableFamily(usersOfSocketsAtoms, socketKeysAtom)\n\n\tsocket.on(`createRoom`, async (roomName: RoomNames) => {\n\t\t// logger.info(`[${shortId}]:${username}`, `creating room \"${roomId}\"`)\n\t\tconst roomId = `room::${roomMeta.count++}` satisfies RoomKey\n\t\tawait spawnRoom(store, roomId, ...resolveRoomScript(roomName))\n\t\tsocket.on(`deleteRoom:${roomId}`, () => {\n\t\t\t// logger.info(`[${shortId}]:${username}`, `deleting room \"${roomId}\"`)\n\t\t\tdestroyRoom(store, roomId)\n\t\t})\n\t})\n\n\tsocket.on(`joinRoom`, (roomKey: RoomKey) => {\n\t\t// logger.info(`[${shortId}]:${username}`, `joining room \"${roomId}\"`)\n\t\tconst { leave } = joinRoom(store, roomKey, userKey, socket)!\n\t\tsocket.on(`leaveRoom:${roomKey}`, leave)\n\t})\n\n\tsocket.on(`disconnect`, () => {\n\t\teditRelationsInStore(store, usersOfSockets, (relations) =>\n\t\t\trelations.delete(socketKey),\n\t\t)\n\t\tif (userKey) {\n\t\t\tsetIntoStore(\n\t\t\t\tstore,\n\t\t\t\tuserKeysAtom,\n\t\t\t\t(index) => (index.delete(userKey), index),\n\t\t\t)\n\t\t}\n\t\tsetIntoStore(\n\t\t\tstore,\n\t\t\tsocketKeysAtom,\n\t\t\t(index) => (index.delete(socketKey), index),\n\t\t)\n\t\t// logger.info(`${socket.id} disconnected`)\n\t})\n}\n","import type * as AtomIO from \"atom.io\"\nimport { getFromStore, IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateProvider = ReturnType<typeof realtimeStateProvider>\nexport function realtimeStateProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateProvider<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsub of subscriptions) unsub()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${token.key}`, () => {\n\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(store, token))\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\tsubscribeToState(\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\t\t\tstart()\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn clearSubscriptions\n\t}\n}\n","import type { WritableToken } from \"atom.io\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tIMPLICIT,\n\toperateOnStore,\n\tOWN_OP,\n\tsetIntoStore,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket, mutexAtoms } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateReceiver = ReturnType<typeof realtimeStateReceiver>\nexport function realtimeStateReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateReceiver<S extends Json.Serializable, C extends S>(\n\t\tclientToken: WritableToken<C>,\n\t\tserverToken: WritableToken<S> = clientToken,\n\t): () => void {\n\t\tconst mutexAtom = findInStore(store, mutexAtoms, serverToken.key)\n\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsub of subscriptions) unsub()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tconst permitPublish = () => {\n\t\t\tclearSubscriptions()\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `pub:${clientToken.key}`, (newValue) => {\n\t\t\t\t\tsetIntoStore(store, serverToken, newValue as C)\n\t\t\t\t}),\n\t\t\t)\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `unclaim:${clientToken.key}`, () => {\n\t\t\t\t\tsetIntoStore(store, mutexAtom, false)\n\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\tstart()\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `claim:${clientToken.key}`, () => {\n\t\t\t\t\tif (getFromStore(store, mutexAtom)) {\n\t\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\t\tsubscribeToState(store, mutexAtom, socket.id!, () => {\n\t\t\t\t\t\t\t\tconst currentValue = getFromStore(store, mutexAtom)\n\t\t\t\t\t\t\t\tif (currentValue === false) {\n\t\t\t\t\t\t\t\t\toperateOnStore(OWN_OP, store, mutexAtom, true)\n\t\t\t\t\t\t\t\t\tpermitPublish()\n\t\t\t\t\t\t\t\t\tsocket.emit(`claim-result:${clientToken.key}`, true)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tsocket.emit(`claim-result:${clientToken.key}`, false)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tsetIntoStore(store, mutexAtom, true)\n\t\t\t\t\tpermitPublish()\n\t\t\t\t\tsocket.emit(`claim-result:${clientToken.key}`, true)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn clearSubscriptions\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]\n\t},\n\tUserKey\n>","unacknowledgedUpdatesAtoms: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n>","initialPayload: Json.Serializable[]","isAvailable","socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketKeysAtom: MutableAtomToken<UList<SocketKey>>","userKeysAtom: MutableAtomToken<UList<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>","selfListSelectors: PureSelectorFamilyToken<UserKey[], UserKey>","ROOMS: RoomMap","roomMeta: { count: number }","roomQueue: [string, ...Json.Array][]"],"sources":["../../src/realtime-server/continuity/continuity-store.ts","../../src/realtime-server/continuity/provide-outcomes.ts","../../src/realtime-server/continuity/provide-perspectives.ts","../../src/realtime-server/continuity/provide-startup-payloads.ts","../../src/realtime-server/continuity/receive-action-requests.ts","../../src/realtime-server/continuity/track-acknowledgements.ts","../../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/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/realtime-server-stores/server-user-store.ts","../../src/realtime-server/realtime-server-stores/server-room-external-store.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts"],"sourcesContent":["import type {\n\tRegularAtomFamilyToken,\n\tTransactionOutcomeEvent,\n\tTransactionSubEvent,\n} from \"atom.io\"\nimport { atomFamily } from \"atom.io\"\nimport type { UserKey } from \"atom.io/realtime\"\n\nexport function redactTransactionUpdateContent(\n\tvisibleStateKeys: string[],\n\tupdates: TransactionSubEvent[],\n): TransactionSubEvent[] {\n\treturn updates\n\t\t.map((update): TransactionSubEvent => {\n\t\t\tswitch (update.type) {\n\t\t\t\tcase `transaction_outcome`: {\n\t\t\t\t\tconst redacted = redactTransactionUpdateContent(\n\t\t\t\t\t\tvisibleStateKeys,\n\t\t\t\t\t\tupdate.subEvents,\n\t\t\t\t\t)\n\t\t\t\t\treturn { ...update, subEvents: redacted }\n\t\t\t\t}\n\t\t\t\tcase `atom_update`:\n\t\t\t\tcase `molecule_creation`:\n\t\t\t\tcase `molecule_disposal`:\n\t\t\t\tcase `molecule_transfer`:\n\t\t\t\tcase `state_creation`:\n\t\t\t\tcase `state_disposal`:\n\t\t\t\t\treturn update\n\t\t\t}\n\t\t})\n\t\t.filter((update) => {\n\t\t\tswitch (update.type) {\n\t\t\t\tcase `atom_update`:\n\t\t\t\tcase `state_creation`:\n\t\t\t\tcase `state_disposal`:\n\t\t\t\t\treturn visibleStateKeys.includes(update.token.key)\n\t\t\t\tcase `molecule_creation`:\n\t\t\t\tcase `transaction_outcome`:\n\t\t\t\tcase `molecule_disposal`:\n\t\t\t\tcase `molecule_transfer`:\n\t\t\t\t\treturn true\n\t\t\t}\n\t\t})\n}\n\nexport const redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]\n\t},\n\tUserKey\n> = atomFamily({\n\tkey: `redactor`,\n\tdefault: { occlude: (updates) => updates },\n})\n\nexport type ContinuitySyncTransactionUpdate = Pick<\n\tTransactionOutcomeEvent<any>,\n\t`epoch` | `id` | `output` | `subEvents` | `token`\n>\nexport const unacknowledgedUpdatesAtoms: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n> = atomFamily({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetUpdateToken,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\n\nimport {\n\tredactTransactionUpdateContent,\n\tunacknowledgedUpdatesAtoms,\n} from \"./continuity-store\"\n\nexport function provideOutcomes(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst unsubscribeFunctions = new Set<() => void>()\n\n\tfor (const transaction of continuity.actions) {\n\t\tconst unsubscribeFromTransaction = subscribeToTransaction(\n\t\t\tstore,\n\t\t\ttransaction,\n\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\t(outcomes) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst visibleKeys = continuity.globals\n\t\t\t\t\t\t.map((atom) => {\n\t\t\t\t\t\t\tif (atom.type === `atom`) {\n\t\t\t\t\t\t\t\treturn atom.key\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn getUpdateToken(atom).key\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\tcontinuity.perspectives.flatMap((perspective) => {\n\t\t\t\t\t\t\t\tconst { viewAtoms } = perspective\n\t\t\t\t\t\t\t\tconst userPerspectiveTokenState = findInStore(\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\tviewAtoms,\n\t\t\t\t\t\t\t\t\tuserKey,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tconst visibleTokens = getFromStore(\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\tuserPerspectiveTokenState,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn visibleTokens.map((token) => {\n\t\t\t\t\t\t\t\t\tconst key =\n\t\t\t\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? `*` + token.key : token.key\n\t\t\t\t\t\t\t\t\treturn key\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\tconst redactedUpdates = redactTransactionUpdateContent(\n\t\t\t\t\t\tvisibleKeys,\n\t\t\t\t\t\toutcomes.subEvents,\n\t\t\t\t\t)\n\t\t\t\t\tconst redactedUpdate = {\n\t\t\t\t\t\t...outcomes,\n\t\t\t\t\t\tupdates: redactedUpdates,\n\t\t\t\t\t}\n\t\t\t\t\tsetIntoStore(store, unacknowledgedUpdatesAtoms, userKey, (updates) => {\n\t\t\t\t\t\tif (redactedUpdate) {\n\t\t\t\t\t\t\tupdates.push(redactedUpdate)\n\t\t\t\t\t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t\t`${userKey} unacknowledged update queue now has`,\n\t\t\t\t\t\t\t\tupdates.length,\n\t\t\t\t\t\t\t\t`items`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn updates\n\t\t\t\t\t})\n\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\t\t\tredactedUpdate as Json.Serializable,\n\t\t\t\t\t)\n\t\t\t\t} catch (thrown) {\n\t\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t`${userKey} failed to send update from transaction ${transaction.key} to ${userKey}`,\n\t\t\t\t\t\t\tthrown.message,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tunsubscribeFunctions.add(unsubscribeFromTransaction)\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\n\nexport function providePerspectives(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst unsubFns = new Set<() => void>()\n\tfor (const perspective of continuity.perspectives) {\n\t\tconst { viewAtoms } = perspective\n\t\tconst userViewState = findInStore(store, viewAtoms, userKey)\n\t\tconst unsubscribeFromUserView = subscribeToState(\n\t\t\tstore,\n\t\t\tuserViewState,\n\t\t\t`sync-continuity:${continuityKey}:${userKey}:perspective:${perspective.resourceAtoms.key}`,\n\t\t\t({ oldValue, newValue }) => {\n\t\t\t\tconst oldKeys = oldValue?.map((token) => token.key)\n\t\t\t\tconst newKeys = newValue.map((token) => token.key)\n\t\t\t\tconst concealed = oldValue?.filter(\n\t\t\t\t\t(token) => !newKeys.includes(token.key),\n\t\t\t\t)\n\t\t\t\tconst revealed = newValue\n\t\t\t\t\t.filter((token) => !oldKeys?.includes(token.key))\n\t\t\t\t\t.flatMap((token) => {\n\t\t\t\t\t\tconst resourceToken =\n\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? getJsonToken(store, token) : token\n\t\t\t\t\t\tconst resource = getFromStore(store, resourceToken)\n\t\t\t\t\t\treturn [resourceToken, resource]\n\t\t\t\t\t})\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`👁`,\n\t\t\t\t\t`atom`,\n\t\t\t\t\tperspective.resourceAtoms.key,\n\t\t\t\t\t`${userKey} has a new perspective`,\n\t\t\t\t\t{ oldKeys, newKeys, revealed, concealed },\n\t\t\t\t)\n\t\t\t\tif (revealed.length > 0) {\n\t\t\t\t\tsocket.emit(`reveal:${continuityKey}`, revealed)\n\t\t\t\t}\n\t\t\t\tif (concealed && concealed.length > 0) {\n\t\t\t\t\tsocket.emit(`conceal:${continuityKey}`, concealed)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tunsubFns.add(unsubscribeFromUserView)\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubFns) unsubscribe()\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tisRootStore,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\nimport { employSocket } from \"atom.io/realtime\"\n\nexport function provideStartupPayloads(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tfunction sendInitialPayload(): void {\n\t\tconst initialPayload: Json.Serializable[] = []\n\t\tfor (const atom of continuity.globals) {\n\t\t\tconst resourceToken =\n\t\t\t\tatom.type === `mutable_atom` ? getJsonToken(store, atom) : atom\n\t\t\tconst resource = getFromStore(store, resourceToken)\n\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t}\n\t\tfor (const perspective of continuity.perspectives) {\n\t\t\tconst { viewAtoms, resourceAtoms } = perspective\n\t\t\tconst userViewState = findInStore(store, viewAtoms, userKey)\n\t\t\tconst userView = getFromStore(store, userViewState)\n\t\t\tstore.logger.info(`👁`, `atom`, resourceAtoms.key, `${userKey} can see`, {\n\t\t\t\tviewAtoms,\n\t\t\t\tresourceAtoms,\n\t\t\t\tuserView,\n\t\t\t})\n\t\t\tfor (const visibleToken of userView) {\n\t\t\t\tconst resourceToken =\n\t\t\t\t\tvisibleToken.type === `mutable_atom`\n\t\t\t\t\t\t? getJsonToken(store, visibleToken)\n\t\t\t\t\t\t: visibleToken\n\t\t\t\tconst resource = getFromStore(store, resourceToken)\n\n\t\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t\t}\n\t\t}\n\n\t\tconst epoch = isRootStore(store)\n\t\t\t? (store.transactionMeta.epoch.get(continuityKey) ?? null)\n\t\t\t: null\n\n\t\tsocket.emit(`continuity-init:${continuityKey}`, epoch, initialPayload)\n\t}\n\treturn employSocket(socket, `get:${continuityKey}`, sendInitialPayload)\n}\n","import type { TransactionOutcomeEvent, TransactionToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { actUponStore } from \"atom.io/internal\"\nimport type { Json, JsonIO } from \"atom.io/json\"\nimport type { ContinuityToken, Socket } from \"atom.io/realtime\"\nimport { employSocket } from \"atom.io/realtime\"\n\nexport function receiveActionRequests(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: string,\n): () => void {\n\tconst continuityKey = continuity.key\n\n\treturn employSocket(\n\t\tsocket,\n\t\t`tx-run:${continuityKey}`,\n\t\tfunction serveTransactionRequest(\n\t\t\ttxOutcome: Json.Serializable &\n\t\t\t\tPick<\n\t\t\t\t\tTransactionOutcomeEvent<TransactionToken<JsonIO>>,\n\t\t\t\t\t`id` | `params` | `token`\n\t\t\t\t>,\n\t\t) {\n\t\t\tstore.logger.info(`🛎️`, `continuity`, continuityKey, `received`, txOutcome)\n\t\t\tconst transactionKey = txOutcome.token.key\n\t\t\tconst updateId = txOutcome.id\n\t\t\tconst performanceKey = `tx-run:${transactionKey}:${updateId}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\ttry {\n\t\t\t\tactUponStore(\n\t\t\t\t\tstore,\n\t\t\t\t\t{ type: `transaction`, key: transactionKey },\n\t\t\t\t\tupdateId,\n\t\t\t\t)(...txOutcome.params)\n\t\t\t} catch (thrown) {\n\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`failed to run transaction ${transactionKey} from ${userKey} with update ${updateId}`,\n\t\t\t\t\t\tthrown.message,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore.logger.info(\n\t\t\t\t`🚀`,\n\t\t\t\t`transaction`,\n\t\t\t\ttransactionKey,\n\t\t\t\tupdateId,\n\t\t\t\tuserKey,\n\t\t\t\tmetric.duration,\n\t\t\t)\n\t\t},\n\t)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { getFromStore, setIntoStore } from \"atom.io/internal\"\nimport type { ContinuityToken, Socket, UserKey } from \"atom.io/realtime\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport { unacknowledgedUpdatesAtoms } from \"./continuity-store\"\n\nexport function trackAcknowledgements(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst userUnacknowledgedUpdates = getFromStore(\n\t\tstore,\n\t\tunacknowledgedUpdatesAtoms,\n\t\tuserKey,\n\t)\n\tfunction trackClientAcknowledgement(epoch: number): void {\n\t\tstore.logger.info(\n\t\t\t`👍`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`${userKey} acknowledged epoch ${epoch}`,\n\t\t)\n\t\tconst isUnacknowledged = userUnacknowledgedUpdates[0]?.epoch === epoch\n\t\tif (isUnacknowledged) {\n\t\t\tsetIntoStore(store, unacknowledgedUpdatesAtoms, userKey, (updates) => {\n\t\t\t\tupdates.shift()\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`👍`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`${userKey} unacknowledged update queue now has`,\n\t\t\t\t\tupdates.length,\n\t\t\t\t\t`items`,\n\t\t\t\t)\n\t\t\t\treturn updates\n\t\t\t})\n\t\t}\n\t}\n\treturn employSocket(socket, `ack:${continuityKey}`, trackClientAcknowledgement)\n}\n","import { getFromStore, IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken, UserKey } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \"..\"\nimport { unacknowledgedUpdatesAtoms } from \"./continuity-store\"\nimport { provideOutcomes } from \"./provide-outcomes\"\nimport { providePerspectives } from \"./provide-perspectives\"\nimport { provideStartupPayloads } from \"./provide-startup-payloads\"\nimport { receiveActionRequests } from \"./receive-action-requests\"\nimport { trackAcknowledgements } from \"./track-acknowledgements\"\n\nexport type ProvideContinuity = (\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n) => () => void\nexport function prepareToProvideContinuity({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig): ProvideContinuity {\n\treturn function syncRealtimeContinuity(continuity, userKey) {\n\t\tconst continuityKey = continuity.key\n\n\t\tconst unacknowledgedUpdates = getFromStore(\n\t\t\tstore,\n\t\t\tunacknowledgedUpdatesAtoms,\n\t\t\tuserKey,\n\t\t)\n\t\tfor (const unacknowledgedUpdate of unacknowledgedUpdates) {\n\t\t\tsocket.emit(\n\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\tunacknowledgedUpdate as Json.Serializable,\n\t\t\t)\n\t\t}\n\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsubscribe of subscriptions) unsubscribe()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tsubscriptions.add(providePerspectives(store, socket, continuity, userKey))\n\t\tsubscriptions.add(provideOutcomes(store, socket, continuity, userKey))\n\t\tsubscriptions.add(provideStartupPayloads(store, socket, continuity, userKey))\n\t\tsubscriptions.add(receiveActionRequests(store, socket, continuity, userKey))\n\t\tsubscriptions.add(trackAcknowledgements(store, socket, continuity, userKey))\n\n\t\treturn clearSubscriptions\n\t}\n}\n","import type { Json, stringified } from \"atom.io/json\"\nimport type { Socket } from \"atom.io/realtime\"\n\nexport type Events = Json.Object<string, Json.Serializable[]>\n\nexport type EventPayload<\n\treceiveRelay extends Events,\n\tK extends string & keyof receiveRelay = string & keyof receiveRelay,\n> = [string, ...receiveRelay[K]]\n\nexport interface EventBuffer<\n\tE extends Events,\n\tK extends string & keyof E = string & keyof E,\n> extends Buffer {\n\ttoString(): stringified<EventPayload<E, K>>\n}\n\nexport abstract class CustomSocket<I extends Events, O extends Events>\n\timplements Socket\n{\n\tprotected listeners: Map<keyof O, Set<(...args: Json.Array) => void>>\n\tprotected globalListeners: Set<(event: string, ...args: Json.Array) => void>\n\tprotected handleEvent<K extends string & keyof I>(\n\t\t...args: EventPayload<I, K>\n\t): void {\n\t\tconst [event, ...rest] = args\n\t\tfor (const listener of this.globalListeners) {\n\t\t\tlistener(event, ...rest)\n\t\t}\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...rest)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic id = `no_id_retrieved`\n\tpublic emit: <Event extends keyof I>(\n\t\tevent: Event,\n\t\t...args: I[Event]\n\t) => CustomSocket<I, O>\n\n\tpublic constructor(\n\t\temit: <Event extends keyof I>(\n\t\t\tevent: Event,\n\t\t\t...args: I[Event]\n\t\t) => CustomSocket<I, O>,\n\t) {\n\t\tthis.emit = emit\n\t\tthis.listeners = new Map()\n\t\tthis.globalListeners = new Set()\n\t}\n\n\tpublic on<Event extends keyof O>(\n\t\tevent: Event,\n\t\tlistener: (...args: O[Event]) => void,\n\t): this {\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tlisteners.add(listener)\n\t\t} else {\n\t\t\tthis.listeners.set(event, new Set([listener]))\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic onAny(listener: (event: string, ...args: Json.Array) => void): this {\n\t\tthis.globalListeners.add(listener)\n\t\treturn this\n\t}\n\n\tpublic off<Event extends keyof O>(\n\t\tevent: Event,\n\t\tlistener?: (...args: O[Event]) => void,\n\t): this {\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tif (listener) {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t} else {\n\t\t\t\tthis.listeners.delete(event)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic offAny(listener: (event: string, ...args: Json.Array) => void): this {\n\t\tthis.globalListeners.delete(listener)\n\t\treturn this\n\t}\n}\n","import type { Readable, Writable } from \"node:stream\"\n\nimport type { Json, stringified } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { EventBuffer, EventPayload, Events } from \"./custom-socket\"\nimport { CustomSocket } from \"./custom-socket\"\n\n/* eslint-disable no-console */\n\nexport type ChildProcess = {\n\tpid?: number | undefined\n\tstdin: Writable\n\tstdout: Readable\n\tstderr: Readable\n}\n\nexport type StderrLog = [`e` | `i` | `w`, ...Json.Array]\n\nexport class ChildSocket<\n\tI extends Events,\n\tO extends Events,\n\tP extends ChildProcess = ChildProcess,\n> extends CustomSocket<I, O> {\n\tprotected incompleteData = ``\n\tprotected unprocessedEvents: string[] = []\n\tprotected incompleteLog = ``\n\tprotected unprocessedLogs: string[] = []\n\n\tpublic id = `#####`\n\n\tpublic proc: P\n\tpublic key: string\n\tpublic logger: Pick<Console, `error` | `info` | `warn`>\n\n\tprotected handleLog(log: StderrLog): void {\n\t\tif (Array.isArray(log)) {\n\t\t\tconst [level, ...rest] = log\n\t\t\tswitch (level) {\n\t\t\t\tcase `i`:\n\t\t\t\t\tthis.logger.info(...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `w`:\n\t\t\t\t\tthis.logger.warn(...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `e`:\n\t\t\t\t\tthis.logger.error(...rest)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tproc: P,\n\t\tkey: string,\n\t\tlogger?: Pick<Console, `error` | `info` | `warn`>,\n\t) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args]) + `\\x03`\n\t\t\tconst errorHandler = (err: { code: string }) => {\n\t\t\t\tif (err.code === `EPIPE`) {\n\t\t\t\t\tconsole.error(`EPIPE error during write`, this.proc.stdin)\n\t\t\t\t}\n\t\t\t\tthis.proc.stdin.removeListener(`error`, errorHandler)\n\t\t\t}\n\n\t\t\tthis.proc.stdin.once(`error`, errorHandler)\n\t\t\tthis.proc.stdin.write(stringifiedEvent)\n\n\t\t\treturn this\n\t\t})\n\t\tthis.proc = proc\n\t\tthis.key = key\n\t\tthis.logger = logger ?? {\n\t\t\tinfo: (...args: unknown[]) => {\n\t\t\t\tconsole.info(this.id, this.key, ...args)\n\t\t\t},\n\t\t\twarn: (...args: unknown[]) => {\n\t\t\t\tconsole.warn(this.id, this.key, ...args)\n\t\t\t},\n\t\t\terror: (...args: unknown[]) => {\n\t\t\t\tconsole.error(this.id, this.key, ...args)\n\t\t\t},\n\t\t}\n\t\tthis.proc.stdout.on(\n\t\t\t`data`,\n\t\t\t<K extends string & keyof I>(buffer: EventBuffer<I, K>) => {\n\t\t\t\tconst chunk = buffer.toString()\n\n\t\t\t\tif (chunk === `ALIVE`) {\n\t\t\t\t\tthis.logger.info(chunk)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst pieces = chunk.split(`\\x03`)\n\t\t\t\tconst initialMaybeWellFormed = pieces[0]\n\t\t\t\tpieces[0] = this.incompleteData + initialMaybeWellFormed\n\t\t\t\tlet idx = 0\n\t\t\t\tfor (const piece of pieces) {\n\t\t\t\t\tif (piece === ``) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonPiece = parseJson(piece as stringified<EventPayload<I, K>>)\n\t\t\t\t\t\tthis.handleEvent(...jsonPiece)\n\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t} catch (thrown0) {\n\t\t\t\t\t\tif (thrown0 instanceof Error) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t`❌ Malformed data received from child process`,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tpiece,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tthrown0.message,\n\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (idx === 0) {\n\t\t\t\t\t\t\t\tthis.incompleteData = piece\n\t\t\t\t\t\t\t\tconst maybeActualJsonPiece = parseJson(\n\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed as stringified<EventPayload<I, K>>,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tthis.handleEvent(...maybeActualJsonPiece)\n\t\t\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.incompleteData += piece\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (thrown1) {\n\t\t\t\t\t\t\tif (thrown1 instanceof Error) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t`❌ Malformed data received from child process`,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tthrown1.message,\n\t\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t++idx\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tthis.proc.stderr.on(`data`, (buffer: Buffer) => {\n\t\t\tconst chunk = buffer.toString()\n\t\t\tconst pieces = chunk.split(`\\x03`)\n\t\t\tconst initialMaybeWellFormed = pieces[0]\n\t\t\tpieces[0] = this.incompleteData + initialMaybeWellFormed\n\t\t\tlet idx = 0\n\t\t\tfor (const piece of pieces) {\n\t\t\t\tif (piece === ``) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst jsonPiece = parseJson(piece as stringified<StderrLog>)\n\t\t\t\t\tthis.handleLog(jsonPiece)\n\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t} catch (thrown0) {\n\t\t\t\t\tif (thrown0 instanceof Error) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t`❌ Malformed log received from child process`,\n\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\tpiece,\n\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\tthrown0.message,\n\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (idx === 0) {\n\t\t\t\t\t\t\tthis.incompleteData = piece\n\t\t\t\t\t\t\tconst maybeActualJsonPiece = parseJson(\n\t\t\t\t\t\t\t\tinitialMaybeWellFormed as stringified<StderrLog>,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthis.handleLog(maybeActualJsonPiece)\n\t\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.incompleteData += piece\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (thrown1) {\n\t\t\t\t\t\tif (thrown1 instanceof Error) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t`❌ Malformed log received from child process...`,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tthrown1.message,\n\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t++idx\n\t\t\t}\n\t\t})\n\t\tif (proc.pid) {\n\t\t\tthis.id = proc.pid.toString()\n\t\t}\n\t}\n}\n","import type { Readable, Writable } from \"node:stream\"\n\nimport { Subject } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\nimport type { UserKey } from \"atom.io/realtime\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nimport type { StderrLog } from \"./child-socket\"\nimport type { EventBuffer, EventPayload, Events } from \"./custom-socket\"\nimport { CustomSocket } from \"./custom-socket\"\n\nexport class SubjectSocket<\n\tI extends Events,\n\tO extends Events,\n> extends CustomSocket<I, O> {\n\tpublic in: Subject<EventPayload<I>>\n\tpublic out: Subject<EventPayload<O>>\n\tpublic id = `no_id_retrieved`\n\tpublic disposalFunctions: (() => void)[] = []\n\n\tpublic constructor(id: string) {\n\t\tsuper((...args) => {\n\t\t\tthis.out.next(args as any)\n\t\t\treturn this\n\t\t})\n\t\tthis.id = id\n\t\tthis.in = new Subject()\n\t\tthis.out = new Subject()\n\t\tthis.in.subscribe(`socket`, (event) => {\n\t\t\tthis.handleEvent(...event)\n\t\t})\n\t}\n\n\tpublic dispose(): void {\n\t\tfor (const dispose of this.disposalFunctions) {\n\t\t\tdispose()\n\t\t}\n\t}\n}\n\nexport type ParentProcess = {\n\tpid?: number | undefined\n\tstdin: Readable\n\tstdout: Writable\n\tstderr: Writable\n\texit: (code?: number) => void\n}\n\nexport class ParentSocket<\n\tI extends Events & {\n\t\t[id in string as `relay::${id}`]: [string, ...Json.Array[]]\n\t},\n\tO extends Events & {\n\t\t[id in string as `user::${id}`]: [string, ...Json.Array[]]\n\t} & {\n\t\t/* eslint-disable quotes */\n\t\t\"user-joins\": [key: UserKey]\n\t\t\"user-leaves\": [key: UserKey]\n\t\t/* eslint-enable quotes */\n\t},\n\tP extends ParentProcess = ParentProcess,\n> extends CustomSocket<I, O> {\n\tprotected incompleteData = ``\n\tprotected unprocessedEvents: string[] = []\n\tprotected relays: Map<string, SubjectSocket<any, any>>\n\tprotected relayServices: ((\n\t\tsocket: SubjectSocket<any, any>,\n\t\tuserKey: UserKey,\n\t) => (() => void) | void)[]\n\tpublic proc: P\n\n\tpublic id = `#####`\n\n\tprotected log(...args: StderrLog): void {\n\t\tthis.proc.stderr.write(\n\t\t\tstringifyJson(\n\t\t\t\targs.map((arg) =>\n\t\t\t\t\targ instanceof UList ? `{ ${arg.toJSON().join(` | `)} }` : arg,\n\t\t\t\t),\n\t\t\t) + `\\x03`,\n\t\t)\n\t}\n\tpublic logger = {\n\t\tinfo: (...args: Json.Array): void => {\n\t\t\tthis.log(`i`, ...args)\n\t\t},\n\t\twarn: (...args: Json.Array): void => {\n\t\t\tthis.log(`w`, ...args)\n\t\t},\n\t\terror: (...args: Json.Array): void => {\n\t\t\tthis.log(`e`, ...args)\n\t\t},\n\t}\n\n\tpublic constructor(proc: P) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args])\n\t\t\tthis.proc.stdout.write(stringifiedEvent + `\\x03`)\n\t\t\treturn this\n\t\t})\n\t\tthis.proc = proc\n\t\tthis.proc.stdin.resume()\n\t\tthis.relays = new Map()\n\t\tthis.relayServices = []\n\n\t\tthis.proc.stdin.on(\n\t\t\t`data`,\n\t\t\t<K extends string & keyof I>(buffer: EventBuffer<I, K>) => {\n\t\t\t\tconst chunk = buffer.toString()\n\t\t\t\tconst pieces = chunk.split(`\\x03`)\n\t\t\t\tconst initialMaybeWellFormed = pieces[0]\n\t\t\t\tpieces[0] = this.incompleteData + initialMaybeWellFormed\n\t\t\t\tlet idx = 0\n\t\t\t\tfor (const piece of pieces) {\n\t\t\t\t\tif (piece === ``) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonPiece = parseJson(piece)\n\t\t\t\t\t\tthis.logger.info(`🎰`, `received`, jsonPiece)\n\t\t\t\t\t\tthis.handleEvent(...(jsonPiece as EventPayload<I>))\n\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t} catch (thrown0) {\n\t\t\t\t\t\tif (thrown0 instanceof Error) {\n\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t`received malformed data from parent process:`,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tpiece,\n\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\tthrown0.message,\n\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (idx === 0) {\n\t\t\t\t\t\t\t\tthis.incompleteData = piece\n\t\t\t\t\t\t\t\tconst maybeActualJsonPiece = parseJson(initialMaybeWellFormed)\n\t\t\t\t\t\t\t\tthis.logger.info(`🎰`, `received`, maybeActualJsonPiece)\n\t\t\t\t\t\t\t\tthis.handleEvent(...(maybeActualJsonPiece as EventPayload<I>))\n\t\t\t\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.incompleteData += piece\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (thrown1) {\n\t\t\t\t\t\t\tif (thrown1 instanceof Error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t`received malformed data from parent process:`,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tinitialMaybeWellFormed,\n\t\t\t\t\t\t\t\t\t\t``,\n\t\t\t\t\t\t\t\t\t\tthrown1.message,\n\t\t\t\t\t\t\t\t\t].join(`\\n❌\\t`),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t++idx\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\n\t\tthis.on(`exit`, () => {\n\t\t\tthis.logger.info(`🔥`, this.id, `received \"exit\"`)\n\t\t\tthis.proc.exit(0)\n\t\t})\n\n\t\tif (this.proc.pid) {\n\t\t\tthis.id = this.proc.pid?.toString()\n\t\t}\n\n\t\tthis.on(`user-joins`, (username: string) => {\n\t\t\tthis.logger.info(`👤`, `user`, username, `joined`)\n\t\t\tconst userKey = `user::${username}` satisfies UserKey\n\t\t\tconst relay = new SubjectSocket(userKey)\n\t\t\tthis.relays.set(username, relay)\n\t\t\tthis.logger.info(\n\t\t\t\t`🔗`,\n\t\t\t\t`attaching services:`,\n\t\t\t\t`[${[...this.relayServices.keys()].join(`, `)}]`,\n\t\t\t)\n\t\t\tfor (const attachRelay of this.relayServices) {\n\t\t\t\tconst cleanupRelay = attachRelay(relay, userKey)\n\t\t\t\tif (cleanupRelay) {\n\t\t\t\t\trelay.disposalFunctions.push(cleanupRelay)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.on(userKey, (...data) => {\n\t\t\t\trelay.in.next(data)\n\t\t\t})\n\t\t\trelay.out.subscribe(`socket`, (data) => {\n\t\t\t\tthis.emit(...(data as [string, ...I[keyof I]]))\n\t\t\t})\n\t\t})\n\n\t\tthis.on(`user-leaves`, (username) => {\n\t\t\tconst relay = this.relays.get(username)\n\t\t\tthis.off(`relay:${username}`)\n\t\t\tif (relay) {\n\t\t\t\trelay.dispose()\n\t\t\t\tthis.relays.delete(username)\n\t\t\t}\n\t\t})\n\n\t\tthis.proc.stdout.write(`ALIVE`)\n\t}\n\n\tpublic receiveRelay(\n\t\tattachServices: (\n\t\t\tsocket: SubjectSocket<any, any>,\n\t\t\tuserKey: UserKey,\n\t\t) => (() => void) | void,\n\t): void {\n\t\tthis.logger.info(`🔗`, `running relay method`)\n\t\tthis.relayServices.push(attachServices)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Canonical, Json, stringified } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type FamilyProvider = ReturnType<typeof realtimeAtomFamilyProvider>\nexport function realtimeAtomFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<\n\t\tJ extends Json.Serializable,\n\t\tK extends Canonical,\n\t>(\n\t\tfamily: AtomIO.RegularAtomFamilyToken<J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst coreSubscriptions = new Set<() => void>()\n\t\tconst clearCoreSubscriptions = () => {\n\t\t\tfor (const unsub of coreSubscriptions) unsub()\n\t\t\tcoreSubscriptions.clear()\n\t\t}\n\t\tconst familyMemberSubscriptionsWanted = new Set<stringified<K>>()\n\t\tconst familyMemberSubscriptions = new Map<string, () => void>()\n\t\tconst clearFamilySubscriptions = () => {\n\t\t\tfor (const unsub of familyMemberSubscriptions.values()) unsub()\n\t\t\tfamilyMemberSubscriptions.clear()\n\t\t}\n\n\t\tconst fillUnsubRequest = (key: string) => {\n\t\t\tconst unsubUnsub = familyMemberSubscriptions.get(`${key}:unsub`)\n\t\t\tif (unsubUnsub) {\n\t\t\t\tunsubUnsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(`${key}:unsub`)\n\t\t\t}\n\t\t\tconst unsub = familyMemberSubscriptions.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst exposeFamilyMembers = (subKey: K) => {\n\t\t\tconst token = findInStore(store, family, subKey)\n\t\t\tgetFromStore(store, token)\n\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(store, token))\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\ttoken.key,\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\ttoken,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\t`${token.key}:unsub`,\n\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\tfillUnsubRequest(token.key)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tconst isAvailable = (exposedSubKeys: Iterable<K>, subKey: K): boolean => {\n\t\t\tfor (const exposedSubKey of exposedSubKeys) {\n\t\t\t\tif (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tcoreSubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${family.key}`, (subKey: K) => {\n\t\t\t\t\tconst exposedSubKeys = getFromStore(store, index)\n\t\t\t\t\tconst shouldExpose = isAvailable(exposedSubKeys, subKey)\n\t\t\t\t\tif (shouldExpose) {\n\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfamilyMemberSubscriptionsWanted.add(stringifyJson(subKey))\n\t\t\t\t\t\tsocket.emit(`unavailable:${family.key}`, subKey)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\t\t\tcoreSubscriptions.add(\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\tindex,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue: newExposedSubKeys }) => {\n\t\t\t\t\t\tfor (const subKey of newExposedSubKeys) {\n\t\t\t\t\t\t\tif (familyMemberSubscriptionsWanted.has(stringifyJson(subKey))) {\n\t\t\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn () => {\n\t\t\tclearCoreSubscriptions()\n\t\t\tclearFamilySubscriptions()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Canonical, stringified } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nconst isAvailable = <K extends Canonical>(\n\texposedSubKeys: Iterable<K>,\n\tsubKey: K,\n): boolean => {\n\tfor (const exposedSubKey of exposedSubKeys) {\n\t\tif (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nexport type MutableFamilyProvider = ReturnType<\n\ttypeof realtimeMutableFamilyProvider\n>\nexport function realtimeMutableFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableFamilyProvider<\n\t\tT extends Transceiver<any, any, any>,\n\t\tK extends Canonical,\n\t>(\n\t\tfamily: AtomIO.MutableAtomFamilyToken<T, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst coreSubscriptions = new Set<() => void>()\n\t\tconst clearCoreSubscriptions = () => {\n\t\t\tfor (const unsub of coreSubscriptions) unsub()\n\t\t\tcoreSubscriptions.clear()\n\t\t}\n\t\tconst familyMemberSubscriptionsWanted = new Set<stringified<K>>()\n\t\tconst familyMemberSubscriptions = new Map<string, () => void>()\n\t\tconst clearFamilySubscriptions = () => {\n\t\t\tfor (const unsub of familyMemberSubscriptions.values()) unsub()\n\t\t\tfamilyMemberSubscriptions.clear()\n\t\t}\n\n\t\tconst fillUnsubRequest = (key: string) => {\n\t\t\tconst unsubUnsub = familyMemberSubscriptions.get(`${key}:unsub`)\n\t\t\tif (unsubUnsub) {\n\t\t\t\tunsubUnsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(`${key}:unsub`)\n\t\t\t}\n\t\t\tconst unsub = familyMemberSubscriptions.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tfamilyMemberSubscriptions.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst exposeFamilyMembers = (subKey: K) => {\n\t\t\tconst token = findInStore(store, family, subKey)\n\t\t\tgetFromStore(store, token)\n\t\t\tconst jsonToken = getJsonToken(store, token)\n\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\tsocket.emit(`init:${token.key}`, getFromStore(store, jsonToken))\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\ttoken.key,\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t\tfamilyMemberSubscriptions.set(\n\t\t\t\t`${token.key}:unsub`,\n\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\tfillUnsubRequest(token.key)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tcoreSubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${family.key}`, (subKey: K) => {\n\t\t\t\t\tconst exposedSubKeys = getFromStore(store, index)\n\t\t\t\t\tconst shouldExpose = isAvailable(exposedSubKeys, subKey)\n\t\t\t\t\tif (shouldExpose) {\n\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfamilyMemberSubscriptionsWanted.add(stringifyJson(subKey))\n\t\t\t\t\t\tsocket.emit(`unavailable:${family.key}`, subKey)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\t\t\tcoreSubscriptions.add(\n\t\t\t\tsubscribeToState(\n\t\t\t\t\tstore,\n\t\t\t\t\tindex,\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t({ newValue: newExposedSubKeys }) => {\n\t\t\t\t\t\tfor (const subKey of newExposedSubKeys) {\n\t\t\t\t\t\t\tif (familyMemberSubscriptionsWanted.has(stringifyJson(subKey))) {\n\t\t\t\t\t\t\t\texposeFamilyMembers(subKey)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn () => {\n\t\t\tclearCoreSubscriptions()\n\t\t\tclearFamilySubscriptions()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableProvider = ReturnType<typeof realtimeMutableProvider>\nexport function realtimeMutableProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableProvider<\n\t\tCore extends Transceiver<any, Json.Serializable, Json.Serializable>,\n\t>(token: AtomIO.MutableAtomToken<Core>): () => void {\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsub of subscriptions) unsub()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst start = () => {\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${token.key}`, () => {\n\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\tsocket.emit(`init:${token.key}`, getFromStore(store, jsonToken))\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\tsubscribeToState(\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\t\t\tstart()\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn clearSubscriptions\n\t}\n}\n","import type {\n\tHierarchy,\n\tJoinToken,\n\tMutableAtomToken,\n\tPureSelectorFamilyToken,\n\tRegularAtomFamilyToken,\n} from \"atom.io\"\nimport { atomFamily, join, mutableAtom, selectorFamily } from \"atom.io\"\nimport type { RoomKey, Socket, SocketKey, UserKey } from \"atom.io/realtime\"\nimport { isSocketKey, isUserKey } from \"atom.io/realtime\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nexport type SocketSystemHierarchy = Hierarchy<\n\t[\n\t\t{\n\t\t\tabove: `root`\n\t\t\tbelow: [UserKey, SocketKey, RoomKey]\n\t\t},\n\t]\n>\n\nexport const socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey> =\n\tatomFamily({\n\t\tkey: `sockets`,\n\t\tdefault: null,\n\t})\n\nexport const socketKeysAtom: MutableAtomToken<UList<SocketKey>> = mutableAtom({\n\tkey: `socketsIndex`,\n\tclass: UList,\n})\nexport const userKeysAtom: MutableAtomToken<UList<UserKey>> = mutableAtom({\n\tkey: `usersIndex`,\n\tclass: UList,\n})\nexport const usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n> = join({\n\tkey: `usersOfSockets`,\n\tbetween: [`user`, `socket`],\n\tcardinality: `1:1`,\n\tisAType: isUserKey,\n\tisBType: isSocketKey,\n})\n\nexport const selfListSelectors: PureSelectorFamilyToken<UserKey[], UserKey> =\n\tselectorFamily({\n\t\tkey: `selfList`,\n\t\tget: (userId) => () => [userId],\n\t})\n","import type { ChildProcessWithoutNullStreams } from \"node:child_process\"\nimport { spawn } from \"node:child_process\"\n\nimport type { Store } from \"atom.io/internal\"\nimport {\n\teditRelationsInStore,\n\tfindInStore,\n\tfindRelationsInStore,\n\tgetFromStore,\n\tgetInternalRelationsFromStore,\n\tIMPLICIT,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { RoomKey, Socket, SocketKey, UserKey } from \"atom.io/realtime\"\nimport { roomKeysAtom, usersInRooms } from \"atom.io/realtime\"\n\nimport { ChildSocket } from \"../ipc-sockets\"\nimport { realtimeMutableFamilyProvider } from \"../realtime-mutable-family-provider\"\nimport { realtimeMutableProvider } from \"../realtime-mutable-provider\"\nimport type { ServerConfig } from \"../server-config\"\nimport {\n\tselfListSelectors,\n\tsocketKeysAtom,\n\tuserKeysAtom,\n\tusersOfSockets,\n} from \"./server-user-store\"\n\nexport type RoomMap = Map<\n\tstring,\n\tChildSocket<any, any, ChildProcessWithoutNullStreams>\n>\n\ndeclare global {\n\tvar ATOM_IO_REALTIME_SERVER_ROOMS: RoomMap\n}\n\nexport const ROOMS: RoomMap =\n\tglobalThis.ATOM_IO_REALTIME_SERVER_ROOMS ??\n\t(globalThis.ATOM_IO_REALTIME_SERVER_ROOMS = new Map())\n\nexport const roomMeta: { count: number } = { count: 0 }\n\nexport async function spawnRoom(\n\tstore: Store,\n\troomKey: RoomKey,\n\tcommand: string,\n\targs: string[],\n): Promise<ChildSocket<any, any>> {\n\tconst child = await new Promise<ChildProcessWithoutNullStreams>((resolve) => {\n\t\tconst room = spawn(command, args, { env: process.env })\n\t\tconst resolver = (data: Buffer) => {\n\t\t\tif (data.toString() === `ALIVE`) {\n\t\t\t\troom.stdout.off(`data`, resolver)\n\t\t\t\tresolve(room)\n\t\t\t}\n\t\t}\n\t\troom.stdout.on(`data`, resolver)\n\t})\n\tconst roomSocket = new ChildSocket(child, roomKey)\n\tROOMS.set(roomKey, roomSocket)\n\tsetIntoStore(store, roomKeysAtom, (index) => (index.add(roomKey), index))\n\n\troomSocket.on(`close`, () => {\n\t\tdestroyRoom(store, roomKey)\n\t})\n\n\treturn roomSocket\n}\n\nexport function joinRoom(\n\tstore: Store,\n\troomKey: RoomKey,\n\tuserKey: UserKey,\n\tsocket: Socket,\n): {\n\tleave: () => void\n\troomSocket: ChildSocket<any, any, ChildProcessWithoutNullStreams>\n} | null {\n\tconst roomQueue: [string, ...Json.Array][] = []\n\tconst pushToRoomQueue = (payload: [string, ...Json.Array]): void => {\n\t\troomQueue.push(payload)\n\t}\n\tlet toRoom = pushToRoomQueue\n\tconst forward = (...payload: [string, ...Json.Array]) => {\n\t\ttoRoom(payload)\n\t}\n\tsocket.onAny(forward)\n\n\teditRelationsInStore(store, usersInRooms, (relations) => {\n\t\trelations.set({ room: roomKey, user: userKey })\n\t})\n\tconst roomSocket = ROOMS.get(roomKey)\n\tif (!roomSocket) {\n\t\tstore.logger.error(`❌`, `unknown`, roomKey, `no room found with this id`)\n\t\treturn null\n\t}\n\troomSocket.onAny((...payload) => {\n\t\tsocket.emit(...payload)\n\t})\n\troomSocket.emit(`user-joins`, userKey)\n\n\ttoRoom = (payload) => {\n\t\troomSocket.emit(`user::${userKey}`, ...payload)\n\t}\n\twhile (roomQueue.length > 0) {\n\t\tconst payload = roomQueue.shift()\n\t\tif (payload) toRoom(payload)\n\t}\n\n\tconst leave = () => {\n\t\tsocket.offAny(forward)\n\t\ttoRoom([`user-leaves`])\n\t\tleaveRoom(store, roomKey, userKey)\n\t}\n\n\treturn { leave, roomSocket }\n}\n\nexport function leaveRoom(\n\tstore: Store,\n\troomKey: RoomKey,\n\tuserKey: UserKey,\n): void {\n\teditRelationsInStore(store, usersInRooms, (relations) => {\n\t\trelations.delete({ room: roomKey, user: userKey })\n\t})\n}\n\nexport function destroyRoom(store: Store, roomKey: RoomKey): void {\n\tsetIntoStore(store, roomKeysAtom, (s) => (s.delete(roomKey), s))\n\teditRelationsInStore(store, usersInRooms, (relations) => {\n\t\trelations.delete({ room: roomKey })\n\t})\n\tconst room = ROOMS.get(roomKey)\n\tif (room) {\n\t\troom.emit(`exit`)\n\t\tROOMS.delete(roomKey)\n\t}\n}\n\nexport function provideRooms<RoomNames extends string>(\n\t{ store = IMPLICIT.STORE, socket }: ServerConfig,\n\tresolveRoomScript: (path: string) => [string, string[]],\n): void {\n\tconst socketKey = `socket::${socket.id}` satisfies SocketKey\n\tconst userKey = getFromStore(\n\t\tstore,\n\t\tfindRelationsInStore(store, usersOfSockets, socketKey).userKeyOfSocket,\n\t)!\n\n\tconst exposeMutable = realtimeMutableProvider({ socket, store })\n\tconst exposeMutableFamily = realtimeMutableFamilyProvider({\n\t\tsocket,\n\t\tstore,\n\t})\n\n\texposeMutable(roomKeysAtom)\n\n\tconst usersInRoomsAtoms = getInternalRelationsFromStore(store, usersInRooms)\n\tconst usersWhoseRoomsCanBeSeenSelector = findInStore(\n\t\tstore,\n\t\tselfListSelectors,\n\t\tuserKey,\n\t)\n\texposeMutableFamily(usersInRoomsAtoms, usersWhoseRoomsCanBeSeenSelector)\n\tconst usersOfSocketsAtoms = getInternalRelationsFromStore(\n\t\tstore,\n\t\tusersOfSockets,\n\t)\n\texposeMutableFamily(usersOfSocketsAtoms, socketKeysAtom)\n\n\tsocket.on(`createRoom`, async (roomName: RoomNames) => {\n\t\t// logger.info(`[${shortId}]:${username}`, `creating room \"${roomId}\"`)\n\t\tconst roomId = `room::${roomMeta.count++}` satisfies RoomKey\n\t\tawait spawnRoom(store, roomId, ...resolveRoomScript(roomName))\n\t\tsocket.on(`deleteRoom:${roomId}`, () => {\n\t\t\t// logger.info(`[${shortId}]:${username}`, `deleting room \"${roomId}\"`)\n\t\t\tdestroyRoom(store, roomId)\n\t\t})\n\t})\n\n\tsocket.on(`joinRoom`, (roomKey: RoomKey) => {\n\t\t// logger.info(`[${shortId}]:${username}`, `joining room \"${roomId}\"`)\n\t\tconst { leave } = joinRoom(store, roomKey, userKey, socket)!\n\t\tsocket.on(`leaveRoom:${roomKey}`, leave)\n\t})\n\n\tsocket.on(`disconnect`, () => {\n\t\teditRelationsInStore(store, usersOfSockets, (relations) =>\n\t\t\trelations.delete(socketKey),\n\t\t)\n\t\tif (userKey) {\n\t\t\tsetIntoStore(\n\t\t\t\tstore,\n\t\t\t\tuserKeysAtom,\n\t\t\t\t(index) => (index.delete(userKey), index),\n\t\t\t)\n\t\t}\n\t\tsetIntoStore(\n\t\t\tstore,\n\t\t\tsocketKeysAtom,\n\t\t\t(index) => (index.delete(socketKey), index),\n\t\t)\n\t\t// logger.info(`${socket.id} disconnected`)\n\t})\n}\n","import type * as AtomIO from \"atom.io\"\nimport { getFromStore, IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateProvider = ReturnType<typeof realtimeStateProvider>\nexport function realtimeStateProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateProvider<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsub of subscriptions) unsub()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `sub:${token.key}`, () => {\n\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(store, token))\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\tsubscribeToState(\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\temploySocket(socket, `unsub:${token.key}`, () => {\n\t\t\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\t\t\tstart()\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn clearSubscriptions\n\t}\n}\n","import type { WritableToken } from \"atom.io\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tIMPLICIT,\n\toperateOnStore,\n\tOWN_OP,\n\tsetIntoStore,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket, mutexAtoms } from \"atom.io/realtime\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateReceiver = ReturnType<typeof realtimeStateReceiver>\nexport function realtimeStateReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateReceiver<S extends Json.Serializable, C extends S>(\n\t\tclientToken: WritableToken<C>,\n\t\tserverToken: WritableToken<S> = clientToken,\n\t): () => void {\n\t\tconst mutexAtom = findInStore(store, mutexAtoms, serverToken.key)\n\n\t\tconst subscriptions = new Set<() => void>()\n\t\tconst clearSubscriptions = () => {\n\t\t\tfor (const unsub of subscriptions) unsub()\n\t\t\tsubscriptions.clear()\n\t\t}\n\n\t\tconst permitPublish = () => {\n\t\t\tclearSubscriptions()\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `pub:${clientToken.key}`, (newValue) => {\n\t\t\t\t\tsetIntoStore(store, serverToken, newValue as C)\n\t\t\t\t}),\n\t\t\t)\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `unclaim:${clientToken.key}`, () => {\n\t\t\t\t\tsetIntoStore(store, mutexAtom, false)\n\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\tstart()\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tconst start = () => {\n\t\t\tsubscriptions.add(\n\t\t\t\temploySocket(socket, `claim:${clientToken.key}`, () => {\n\t\t\t\t\tif (getFromStore(store, mutexAtom)) {\n\t\t\t\t\t\tclearSubscriptions()\n\t\t\t\t\t\tsubscriptions.add(\n\t\t\t\t\t\t\tsubscribeToState(store, mutexAtom, socket.id!, () => {\n\t\t\t\t\t\t\t\tconst currentValue = getFromStore(store, mutexAtom)\n\t\t\t\t\t\t\t\tif (currentValue === false) {\n\t\t\t\t\t\t\t\t\toperateOnStore(OWN_OP, store, mutexAtom, true)\n\t\t\t\t\t\t\t\t\tpermitPublish()\n\t\t\t\t\t\t\t\t\tsocket.emit(`claim-result:${clientToken.key}`, true)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tsocket.emit(`claim-result:${clientToken.key}`, false)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tsetIntoStore(store, mutexAtom, true)\n\t\t\t\t\tpermitPublish()\n\t\t\t\t\tsocket.emit(`claim-result:${clientToken.key}`, true)\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tstart()\n\n\t\treturn clearSubscriptions\n\t}\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shared-room-store-ZPGD_PIR.d.ts","names":["roomKeysAtom: MutableAtomToken<UList<string>>","DEFAULT_USER_IN_ROOM_META: UserInRoomMeta","usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`>","usersInMyRoomView: ReadonlyPureSelectorFamilyToken<\n\tMutableAtomToken<UList<RoomKey>>[],\n\tUserKey\n>"],"sources":["../src/realtime/realtime-key-types.ts","../src/realtime/shared-room-store.ts"],"sourcesContent":[],"mappings":";;;;KAAY,SAAA;cACC,qCAAoC;KAGrC,OAAA;cACC,mCAAkC;AALnC,KAQA,OAAA,GARA,SAAA,MAAA,EAAA;AACC,cAQA,SARoC,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAA,GAAA,IAQF,OARE;;;KCcrC;EDfZ,UAAY,EAAA,CAAA,QAAA,ECgBY,SDhBZ,EAAA,GAAA,IAAA;EACZ,QAAa,EAAA,CAAA,OAAoC,EAAA,MAAA,EAAA,GAAA,IAAA;EAGjD,CAAA,SAAY,EAAA,aAAA,MAAA,EAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EACZ,CAAA,UAAa,EAAA,cAAkC,MAAA,EAAA,CAAA,EAAA,GAAA,GAAA,IAAA;AAG/C,CAAA;AACa,cCaAA,YDbkC,ECapB,gBDboB,CCaH,KDbG,CAAA,MAAA,CAAA,CAAA;KCoBnC,cAAA;;;AAdA,cAiBCC,yBAjBD,EAiB4B,cAhBhB;AAMXD,cAaAE,YAb+B,EAajB,SAbA,CAAA,MAAA,EAakB,OAblB,EAAA,MAAA,EAamC,OAbnC,EAAA,KAAA,CAAA;AAOf,cAeCC,iBAfD,EAeoB,+BAfpB,CAgBX,gBAhBW,CAgBM,KAhBN,CAgBY,OAhBZ,CAAA,CAAA,EAAA,EAiBX,OAjBW,CAAA"}
1
+ {"version":3,"file":"shared-room-store-ZPGD_PIR.d.ts","names":["roomKeysAtom: MutableAtomToken<UList<string>>","DEFAULT_USER_IN_ROOM_META: UserInRoomMeta","usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`>","usersInMyRoomView: ReadonlyPureSelectorFamilyToken<\n\tMutableAtomToken<UList<RoomKey>>[],\n\tUserKey\n>"],"sources":["../src/realtime/realtime-key-types.ts","../src/realtime/shared-room-store.ts"],"sourcesContent":[],"mappings":";;;;KAAY,SAAA;cACC,qCAAoC;KAGrC,OAAA;cACC,mCAAkC;AALnC,KAQA,OAAA,GARA,SAAA,MAAA,EAAA;AACC,cAQA,SARoC,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAA,GAAA,IAQF,OARE;;;KCcrC;EDfZ,UAAY,EAAA,CAAA,QAAA,ECgBY,SDhBZ,EAAA,GAAA,IAAA;EACZ,QAAa,EAAA,CAAA,OAAoC,EAAA,MAAA,EAAA,GAAA,IAAA;EAGjD,CAAA,SAAY,EAAA,aAAA,MAAA,EAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EACZ,CAAA,UAAa,EAAA,cAAkC,MAAA,EAAA,CAAA,EAAA,GAAA,GAAA,IAAA;AAG/C,CAAA;AACa,cCaAA,YDbkC,ECapB,gBDboB,CCaH,KDbG,CAAA,MAAA,CAAA,CAAA;KCkBnC,cAAA;;;AAZA,cAeCC,yBAfD,EAe4B,cAdhB;AAMXD,cAWAE,YAX+B,EAWjB,SAXA,CAAA,MAAA,EAWkB,OAXlB,EAAA,MAAA,EAWmC,OAXnC,EAAA,KAAA,CAAA;AAKf,cAeCC,iBAfD,EAeoB,+BAfpB,CAgBX,gBAhBW,CAgBM,KAhBN,CAgBY,OAhBZ,CAAA,CAAA,EAAA,EAiBX,OAjBW,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.44.8",
3
+ "version": "0.44.9",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -72,9 +72,9 @@
72
72
  "@typescript-eslint/parser": "8.47.0",
73
73
  "@typescript-eslint/rule-tester": "8.47.0",
74
74
  "@typescript-eslint/utils": "8.47.0",
75
- "@typescript/native-preview": "7.0.0-dev.20251119.1",
76
- "@vitest/coverage-v8": "4.0.10",
77
- "@vitest/ui": "4.0.10",
75
+ "@typescript/native-preview": "7.0.0-dev.20251122.1",
76
+ "@vitest/coverage-v8": "4.0.13",
77
+ "@vitest/ui": "4.0.13",
78
78
  "arktype": "2.1.27",
79
79
  "concurrently": "9.2.1",
80
80
  "drizzle-kit": "0.31.7",
@@ -93,10 +93,10 @@
93
93
  "socket.io-client": "4.8.1",
94
94
  "storybook": "10.0.8",
95
95
  "tmp": "0.2.5",
96
- "tsdown": "0.16.5",
97
- "vite": "7.2.2",
96
+ "tsdown": "0.16.6",
97
+ "vite": "7.2.4",
98
98
  "vite-tsconfig-paths": "5.1.4",
99
- "vitest": "4.0.10",
99
+ "vitest": "4.0.13",
100
100
  "break-check": "0.6.23",
101
101
  "takua": "0.1.1"
102
102
  },
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/switch-exhaustiveness-check */
2
- import { ESLintUtils } from "@typescript-eslint/utils"
2
+ import type { TSESTree } from "@typescript-eslint/utils"
3
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"
3
4
 
4
5
  const createRule = ESLintUtils.RuleCreator(
5
6
  (name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`,
@@ -14,9 +15,15 @@ const STATE_FUNCTIONS = [
14
15
  `selectorFamily`,
15
16
  ]
16
17
 
18
+ type Options = [
19
+ {
20
+ permitAnnotation?: boolean
21
+ },
22
+ ]
23
+
17
24
  export const explicitStateTypes: ESLintUtils.RuleModule<
18
- `noTypeArgument`,
19
- [],
25
+ `noTypeArgument` | `noTypeArgumentOrAnnotation`,
26
+ Options,
20
27
  unknown,
21
28
  ESLintUtils.RuleListener
22
29
  > = createRule({
@@ -28,40 +35,87 @@ export const explicitStateTypes: ESLintUtils.RuleModule<
28
35
  },
29
36
  messages: {
30
37
  noTypeArgument: `State declarations must have generic type arguments directly passed to them.`,
38
+ noTypeArgumentOrAnnotation: `State declarations must have generic type arguments directly passed to them, or a top-level type annotation.`,
31
39
  },
32
- schema: [], // no options
40
+ schema: [
41
+ {
42
+ type: `object`,
43
+ properties: {
44
+ permitAnnotation: {
45
+ type: `boolean`,
46
+ default: false,
47
+ },
48
+ },
49
+ additionalProperties: false,
50
+ },
51
+ ],
33
52
  },
34
- defaultOptions: [],
53
+ defaultOptions: [
54
+ {
55
+ permitAnnotation: false,
56
+ },
57
+ ],
35
58
  create(context) {
59
+ const options = context.options[0]
60
+ const permitAnnotation = options?.permitAnnotation ?? false
61
+
36
62
  return {
37
63
  CallExpression(node) {
38
- const { callee } = node
64
+ const callee = node.callee
65
+
39
66
  switch (callee.type) {
40
- case `Identifier`: {
41
- if (STATE_FUNCTIONS.includes(callee.name)) {
42
- if (!node.typeArguments) {
43
- context.report({
44
- node,
45
- messageId: `noTypeArgument`,
46
- })
47
- }
67
+ case `Identifier`:
68
+ if (STATE_FUNCTIONS.includes(callee.name) === false) {
69
+ return
48
70
  }
49
71
  break
50
- }
51
- case `MemberExpression`: {
72
+ case `MemberExpression`:
52
73
  if (
53
- callee.property.type === `Identifier` &&
54
- STATE_FUNCTIONS.includes(callee.property.name)
74
+ (callee.property.type === `Identifier` &&
75
+ STATE_FUNCTIONS.includes(callee.property.name)) === false
55
76
  ) {
56
- if (!node.typeArguments) {
57
- context.report({
58
- node,
59
- messageId: `noTypeArgument`,
60
- })
61
- }
77
+ return
78
+ }
79
+ break
80
+ default:
81
+ return
82
+ }
83
+
84
+ // Check for the *required* generic type argument first
85
+ if (node.typeArguments) {
86
+ return // Generic type argument is present, no error
87
+ }
88
+
89
+ // If generic arguments are missing, check if the top-level annotation exception is enabled AND present
90
+ if (permitAnnotation) {
91
+ let hasAnnotation = false
92
+ // Check if the CallExpression is the initializer of a variable declarator
93
+ const parent = node.parent
94
+ if (
95
+ parent?.type === AST_NODE_TYPES.VariableDeclarator &&
96
+ parent.init === node
97
+ ) {
98
+ // Check if the VariableDeclarator has an id with a TypeAnnotation
99
+ const declaratorId = parent.id
100
+ if (declaratorId.type === AST_NODE_TYPES.Identifier) {
101
+ // Check for 'const myAtom: AtomToken<string> = ...'
102
+ hasAnnotation = Boolean(declaratorId.typeAnnotation)
62
103
  }
63
104
  }
105
+ if (hasAnnotation) {
106
+ return // Exception met: type annotation is on the variable declaration
107
+ }
108
+ context.report({
109
+ node,
110
+ messageId: `noTypeArgumentOrAnnotation`,
111
+ })
112
+ return
64
113
  }
114
+
115
+ context.report({
116
+ node,
117
+ messageId: `noTypeArgument`,
118
+ })
65
119
  },
66
120
  }
67
121
  },
@@ -2,10 +2,7 @@ import type { AtomFamilyToken } from "atom.io"
2
2
  import { atomFamily } from "atom.io"
3
3
  import type { Canonical } from "atom.io/json"
4
4
 
5
- export const mutexAtoms: AtomFamilyToken<boolean, Canonical> = atomFamily<
6
- boolean,
7
- Canonical
8
- >({
5
+ export const mutexAtoms: AtomFamilyToken<boolean, Canonical> = atomFamily({
9
6
  key: `mutex`,
10
7
  default: false,
11
8
  })
@@ -20,9 +20,7 @@ export type RoomSocketInterface<RoomNames extends string> = {
20
20
  [deleteRoom: `deleteRoom:${string}`]: () => void
21
21
  }
22
22
 
23
- export const roomKeysAtom: MutableAtomToken<UList<string>> = mutableAtom<
24
- UList<string>
25
- >({
23
+ export const roomKeysAtom: MutableAtomToken<UList<string>> = mutableAtom({
26
24
  key: `roomIndex`,
27
25
  class: UList,
28
26
  })
@@ -45,7 +43,7 @@ export const usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`> =
45
43
  export const usersInMyRoomView: ReadonlyPureSelectorFamilyToken<
46
44
  MutableAtomToken<UList<RoomKey>>[],
47
45
  UserKey
48
- > = selectorFamily<MutableAtomToken<UList<RoomKey>>[], UserKey>({
46
+ > = selectorFamily({
49
47
  key: `usersInMyRoomView`,
50
48
  get:
51
49
  (myUsername) =>
@@ -49,12 +49,7 @@ export const redactorAtoms: RegularAtomFamilyToken<
49
49
  occlude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]
50
50
  },
51
51
  UserKey
52
- > = atomFamily<
53
- {
54
- occlude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]
55
- },
56
- UserKey
57
- >({
52
+ > = atomFamily({
58
53
  key: `redactor`,
59
54
  default: { occlude: (updates) => updates },
60
55
  })
@@ -66,7 +61,7 @@ export type ContinuitySyncTransactionUpdate = Pick<
66
61
  export const unacknowledgedUpdatesAtoms: RegularAtomFamilyToken<
67
62
  ContinuitySyncTransactionUpdate[],
68
63
  UserKey
69
- > = atomFamily<ContinuitySyncTransactionUpdate[], UserKey>({
64
+ > = atomFamily({
70
65
  key: `unacknowledgedUpdates`,
71
66
  default: () => [],
72
67
  })
@@ -20,20 +20,16 @@ export type SocketSystemHierarchy = Hierarchy<
20
20
  >
21
21
 
22
22
  export const socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey> =
23
- atomFamily<Socket | null, SocketKey>({
23
+ atomFamily({
24
24
  key: `sockets`,
25
25
  default: null,
26
26
  })
27
27
 
28
- export const socketKeysAtom: MutableAtomToken<UList<SocketKey>> = mutableAtom<
29
- UList<SocketKey>
30
- >({
28
+ export const socketKeysAtom: MutableAtomToken<UList<SocketKey>> = mutableAtom({
31
29
  key: `socketsIndex`,
32
30
  class: UList,
33
31
  })
34
- export const userKeysAtom: MutableAtomToken<UList<UserKey>> = mutableAtom<
35
- UList<UserKey>
36
- >({
32
+ export const userKeysAtom: MutableAtomToken<UList<UserKey>> = mutableAtom({
37
33
  key: `usersIndex`,
38
34
  class: UList,
39
35
  })
@@ -52,7 +48,7 @@ export const usersOfSockets: JoinToken<
52
48
  })
53
49
 
54
50
  export const selfListSelectors: PureSelectorFamilyToken<UserKey[], UserKey> =
55
- selectorFamily<UserKey[], UserKey>({
51
+ selectorFamily({
56
52
  key: `selfList`,
57
53
  get: (userId) => () => [userId],
58
54
  })
@@ -1,13 +0,0 @@
1
- //#region rolldown:runtime
2
- var __defProp = Object.defineProperty;
3
- var __export = (all) => {
4
- let target = {};
5
- for (var name in all) __defProp(target, name, {
6
- get: all[name],
7
- enumerable: true
8
- });
9
- return target;
10
- };
11
-
12
- //#endregion
13
- export { __export as t };