@supalive/core 0.1.4 → 0.1.5

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.
Files changed (212) hide show
  1. package/README.md +17 -2
  2. package/dist/helper-CiacMqje.d.ts +14 -0
  3. package/dist/helper-CiacMqje.d.ts.map +1 -0
  4. package/dist/helper-zdJT5FUc.js +58 -0
  5. package/dist/helper-zdJT5FUc.js.map +1 -0
  6. package/dist/index-CTyXKcq_.d.ts +1736 -0
  7. package/dist/index-CTyXKcq_.d.ts.map +1 -0
  8. package/dist/mysql-C8SN443m.d.ts +104 -0
  9. package/dist/mysql-C8SN443m.d.ts.map +1 -0
  10. package/dist/mysql-DELSRrpY.js +569 -0
  11. package/dist/mysql-DELSRrpY.js.map +1 -0
  12. package/dist/overlap-checker-CVkbbuEQ.js +187 -0
  13. package/dist/overlap-checker-CVkbbuEQ.js.map +1 -0
  14. package/dist/postgres-DE-XyNAQ.js +823 -0
  15. package/dist/postgres-DE-XyNAQ.js.map +1 -0
  16. package/dist/postgres-D_gwCHx-.d.ts +108 -0
  17. package/dist/postgres-D_gwCHx-.d.ts.map +1 -0
  18. package/dist/query-CbQLjeME.js +713 -0
  19. package/dist/query-CbQLjeME.js.map +1 -0
  20. package/dist/realtime_db-D9p2X2PH.js +246 -0
  21. package/dist/realtime_db-D9p2X2PH.js.map +1 -0
  22. package/dist/router-DlTYWpop.js +81 -0
  23. package/dist/router-DlTYWpop.js.map +1 -0
  24. package/dist/schema-SKcIWHfo.js +167 -0
  25. package/dist/schema-SKcIWHfo.js.map +1 -0
  26. package/dist/src/client/index.d.ts +2 -17
  27. package/dist/src/client/index.js +1151 -18
  28. package/dist/src/client/index.js.map +1 -1
  29. package/dist/src/exports/mysql.d.ts +2 -2
  30. package/dist/src/exports/mysql.js +2 -2
  31. package/dist/src/exports/postgres.d.ts +2 -2
  32. package/dist/src/exports/postgres.js +2 -2
  33. package/dist/src/exports/procedure.d.ts +3 -5
  34. package/dist/src/exports/procedure.js +5 -5
  35. package/dist/src/exports/server.d.ts +368 -2
  36. package/dist/src/exports/server.d.ts.map +1 -1
  37. package/dist/src/exports/server.js +1346 -2
  38. package/dist/src/exports/server.js.map +1 -1
  39. package/dist/src/exports/subscription-manager-worker-entry.d.ts +1 -0
  40. package/dist/src/exports/subscription-manager-worker-entry.js +115 -0
  41. package/dist/src/exports/subscription-manager-worker-entry.js.map +1 -0
  42. package/dist/src/exports/types.d.ts +4 -6
  43. package/dist/src/exports/types.js +5 -6
  44. package/dist/subscription-worker-BurdPO8d.js +511 -0
  45. package/dist/subscription-worker-BurdPO8d.js.map +1 -0
  46. package/dist/types_client_rpc-CIsjQQGG.js +105 -0
  47. package/dist/types_client_rpc-CIsjQQGG.js.map +1 -0
  48. package/dist/types_db-Ctf-ksoy.js +168 -0
  49. package/dist/types_db-Ctf-ksoy.js.map +1 -0
  50. package/dist/types_server-Ch56y8L3.d.ts +216 -0
  51. package/dist/types_server-Ch56y8L3.d.ts.map +1 -0
  52. package/dist/types_server-Dk6o_B7N.js +24 -0
  53. package/dist/types_server-Dk6o_B7N.js.map +1 -0
  54. package/package.json +3 -3
  55. package/dist/src/client/caller_client.d.ts +0 -42
  56. package/dist/src/client/caller_client.d.ts.map +0 -1
  57. package/dist/src/client/caller_client.js +0 -77
  58. package/dist/src/client/caller_client.js.map +0 -1
  59. package/dist/src/client/client.d.ts +0 -149
  60. package/dist/src/client/client.d.ts.map +0 -1
  61. package/dist/src/client/client.js +0 -308
  62. package/dist/src/client/client.js.map +0 -1
  63. package/dist/src/client/index.d.ts.map +0 -1
  64. package/dist/src/client/sub_key.d.ts +0 -20
  65. package/dist/src/client/sub_key.d.ts.map +0 -1
  66. package/dist/src/client/sub_key.js +0 -37
  67. package/dist/src/client/sub_key.js.map +0 -1
  68. package/dist/src/client/ws_client_manager.d.ts +0 -268
  69. package/dist/src/client/ws_client_manager.d.ts.map +0 -1
  70. package/dist/src/client/ws_client_manager.js +0 -1013
  71. package/dist/src/client/ws_client_manager.js.map +0 -1
  72. package/dist/src/config.d.ts +0 -117
  73. package/dist/src/config.d.ts.map +0 -1
  74. package/dist/src/config.js +0 -2
  75. package/dist/src/config.js.map +0 -1
  76. package/dist/src/db/bytes.d.ts +0 -4
  77. package/dist/src/db/bytes.d.ts.map +0 -1
  78. package/dist/src/db/bytes.js +0 -24
  79. package/dist/src/db/bytes.js.map +0 -1
  80. package/dist/src/db/cache.d.ts +0 -30
  81. package/dist/src/db/cache.d.ts.map +0 -1
  82. package/dist/src/db/cache.js +0 -153
  83. package/dist/src/db/cache.js.map +0 -1
  84. package/dist/src/db/codec.d.ts +0 -10
  85. package/dist/src/db/codec.d.ts.map +0 -1
  86. package/dist/src/db/codec.js +0 -73
  87. package/dist/src/db/codec.js.map +0 -1
  88. package/dist/src/db/context.d.ts +0 -28
  89. package/dist/src/db/context.d.ts.map +0 -1
  90. package/dist/src/db/context.js +0 -147
  91. package/dist/src/db/context.js.map +0 -1
  92. package/dist/src/db/db.d.ts +0 -154
  93. package/dist/src/db/db.d.ts.map +0 -1
  94. package/dist/src/db/db.js +0 -23
  95. package/dist/src/db/db.js.map +0 -1
  96. package/dist/src/db/mysql.d.ts +0 -120
  97. package/dist/src/db/mysql.d.ts.map +0 -1
  98. package/dist/src/db/mysql.js +0 -708
  99. package/dist/src/db/mysql.js.map +0 -1
  100. package/dist/src/db/postgres.d.ts +0 -116
  101. package/dist/src/db/postgres.d.ts.map +0 -1
  102. package/dist/src/db/postgres.js +0 -998
  103. package/dist/src/db/postgres.js.map +0 -1
  104. package/dist/src/db/query.d.ts +0 -174
  105. package/dist/src/db/query.d.ts.map +0 -1
  106. package/dist/src/db/query.js +0 -790
  107. package/dist/src/db/query.js.map +0 -1
  108. package/dist/src/db/query_definition.d.ts +0 -54
  109. package/dist/src/db/query_definition.d.ts.map +0 -1
  110. package/dist/src/db/query_definition.js +0 -47
  111. package/dist/src/db/query_definition.js.map +0 -1
  112. package/dist/src/db/realtime_db.d.ts +0 -19
  113. package/dist/src/db/realtime_db.d.ts.map +0 -1
  114. package/dist/src/db/realtime_db.js +0 -98
  115. package/dist/src/db/realtime_db.js.map +0 -1
  116. package/dist/src/db/schema.d.ts +0 -110
  117. package/dist/src/db/schema.d.ts.map +0 -1
  118. package/dist/src/db/schema.js +0 -47
  119. package/dist/src/db/schema.js.map +0 -1
  120. package/dist/src/db/types_client_rpc.d.ts +0 -157
  121. package/dist/src/db/types_client_rpc.d.ts.map +0 -1
  122. package/dist/src/db/types_client_rpc.js +0 -106
  123. package/dist/src/db/types_client_rpc.js.map +0 -1
  124. package/dist/src/db/types_db.d.ts +0 -236
  125. package/dist/src/db/types_db.d.ts.map +0 -1
  126. package/dist/src/db/types_db.js +0 -188
  127. package/dist/src/db/types_db.js.map +0 -1
  128. package/dist/src/exports/mysql.d.ts.map +0 -1
  129. package/dist/src/exports/mysql.js.map +0 -1
  130. package/dist/src/exports/postgres.d.ts.map +0 -1
  131. package/dist/src/exports/postgres.js.map +0 -1
  132. package/dist/src/exports/procedure.d.ts.map +0 -1
  133. package/dist/src/exports/procedure.js.map +0 -1
  134. package/dist/src/exports/types.d.ts.map +0 -1
  135. package/dist/src/exports/types.js.map +0 -1
  136. package/dist/src/helper.d.ts +0 -11
  137. package/dist/src/helper.d.ts.map +0 -1
  138. package/dist/src/helper.js +0 -45
  139. package/dist/src/helper.js.map +0 -1
  140. package/dist/src/logger.d.ts +0 -7
  141. package/dist/src/logger.d.ts.map +0 -1
  142. package/dist/src/logger.js +0 -47
  143. package/dist/src/logger.js.map +0 -1
  144. package/dist/src/router/index.d.ts +0 -4
  145. package/dist/src/router/index.d.ts.map +0 -1
  146. package/dist/src/router/index.js +0 -4
  147. package/dist/src/router/index.js.map +0 -1
  148. package/dist/src/router/procedure.d.ts +0 -204
  149. package/dist/src/router/procedure.d.ts.map +0 -1
  150. package/dist/src/router/procedure.js +0 -122
  151. package/dist/src/router/procedure.js.map +0 -1
  152. package/dist/src/router/router.d.ts +0 -88
  153. package/dist/src/router/router.d.ts.map +0 -1
  154. package/dist/src/router/router.js +0 -88
  155. package/dist/src/router/router.js.map +0 -1
  156. package/dist/src/server/hash.d.ts +0 -12
  157. package/dist/src/server/hash.d.ts.map +0 -1
  158. package/dist/src/server/hash.js +0 -20
  159. package/dist/src/server/hash.js.map +0 -1
  160. package/dist/src/server/hash.test.d.ts +0 -2
  161. package/dist/src/server/hash.test.d.ts.map +0 -1
  162. package/dist/src/server/hash.test.js +0 -43
  163. package/dist/src/server/hash.test.js.map +0 -1
  164. package/dist/src/server/index.d.ts +0 -9
  165. package/dist/src/server/index.d.ts.map +0 -1
  166. package/dist/src/server/index.js +0 -8
  167. package/dist/src/server/index.js.map +0 -1
  168. package/dist/src/server/overlap-checker.d.ts +0 -18
  169. package/dist/src/server/overlap-checker.d.ts.map +0 -1
  170. package/dist/src/server/overlap-checker.js +0 -247
  171. package/dist/src/server/overlap-checker.js.map +0 -1
  172. package/dist/src/server/sub_hash.d.ts +0 -23
  173. package/dist/src/server/sub_hash.d.ts.map +0 -1
  174. package/dist/src/server/sub_hash.js +0 -38
  175. package/dist/src/server/sub_hash.js.map +0 -1
  176. package/dist/src/server/subscription-manager-client.d.ts +0 -120
  177. package/dist/src/server/subscription-manager-client.d.ts.map +0 -1
  178. package/dist/src/server/subscription-manager-client.js +0 -207
  179. package/dist/src/server/subscription-manager-client.js.map +0 -1
  180. package/dist/src/server/subscription-manager-types.d.ts +0 -168
  181. package/dist/src/server/subscription-manager-types.d.ts.map +0 -1
  182. package/dist/src/server/subscription-manager-types.js +0 -94
  183. package/dist/src/server/subscription-manager-types.js.map +0 -1
  184. package/dist/src/server/subscription-manager-worker-entry.d.ts +0 -2
  185. package/dist/src/server/subscription-manager-worker-entry.d.ts.map +0 -1
  186. package/dist/src/server/subscription-manager-worker-entry.js +0 -127
  187. package/dist/src/server/subscription-manager-worker-entry.js.map +0 -1
  188. package/dist/src/server/subscription-manager-worker-protocol.d.ts +0 -40
  189. package/dist/src/server/subscription-manager-worker-protocol.d.ts.map +0 -1
  190. package/dist/src/server/subscription-manager-worker-protocol.js +0 -20
  191. package/dist/src/server/subscription-manager-worker-protocol.js.map +0 -1
  192. package/dist/src/server/subscription-manager.d.ts +0 -32
  193. package/dist/src/server/subscription-manager.d.ts.map +0 -1
  194. package/dist/src/server/subscription-manager.js +0 -249
  195. package/dist/src/server/subscription-manager.js.map +0 -1
  196. package/dist/src/server/subscription-manager.test.d.ts +0 -2
  197. package/dist/src/server/subscription-manager.test.d.ts.map +0 -1
  198. package/dist/src/server/subscription-manager.test.js +0 -610
  199. package/dist/src/server/subscription-manager.test.js.map +0 -1
  200. package/dist/src/server/subscription-worker.d.ts +0 -32
  201. package/dist/src/server/subscription-worker.d.ts.map +0 -1
  202. package/dist/src/server/subscription-worker.js +0 -190
  203. package/dist/src/server/subscription-worker.js.map +0 -1
  204. package/dist/src/server/supalive-server.d.ts +0 -158
  205. package/dist/src/server/supalive-server.d.ts.map +0 -1
  206. package/dist/src/server/supalive-server.js +0 -1048
  207. package/dist/src/server/supalive-server.js.map +0 -1
  208. package/dist/src/server/types_server.d.ts +0 -96
  209. package/dist/src/server/types_server.d.ts.map +0 -1
  210. package/dist/src/server/types_server.js +0 -36
  211. package/dist/src/server/types_server.js.map +0 -1
  212. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,247 +0,0 @@
1
- import { normalizeIdToBytes } from "../db/types_db";
2
- import { bytesEqual, utf8Decode } from "../db/bytes";
3
- import { jsonContains, jsonPathExists, jsonPathExtract } from "../db/query";
4
- export function mapReadEntryToRaw(entry) {
5
- if (entry.kind === "point") {
6
- return {
7
- kind: "point",
8
- tableId: entry.tableId,
9
- id: normalizeIdToBytes(entry.id),
10
- table: entry.table,
11
- };
12
- }
13
- else {
14
- return {
15
- kind: "range",
16
- tableId: entry.tableId,
17
- table: entry.table,
18
- predicate: entry.predicate,
19
- columns: entry.columns,
20
- offset: entry.offset,
21
- orderBy: entry.orderBy,
22
- limit: entry.limit,
23
- };
24
- }
25
- }
26
- export function mapReadSetToRaw(readSet) {
27
- return readSet.map(mapReadEntryToRaw);
28
- }
29
- export function mapWriteEntryToRaw(entry) {
30
- return {
31
- table: entry.table,
32
- tableId: entry.tableId,
33
- id: normalizeIdToBytes(entry.id),
34
- op: entry.op,
35
- data: entry.data,
36
- prevData: entry.prevData,
37
- };
38
- }
39
- export function mapWriteSetToRaw(writeSet) {
40
- return writeSet.map(mapWriteEntryToRaw);
41
- }
42
- export function evaluatePredicateAgainstRow(rowData, predicate) {
43
- switch (predicate.kind) {
44
- case "and": {
45
- let hasUnknown = false;
46
- for (const child of predicate.children) {
47
- const r = evaluatePredicateAgainstRow(rowData, child);
48
- if (r === "no")
49
- return "no";
50
- if (r === "unknown")
51
- hasUnknown = true;
52
- }
53
- return hasUnknown ? "unknown" : "yes";
54
- }
55
- case "or": {
56
- let hasUnknown = false;
57
- for (const child of predicate.children) {
58
- const r = evaluatePredicateAgainstRow(rowData, child);
59
- if (r === "yes")
60
- return "yes";
61
- if (r === "unknown")
62
- hasUnknown = true;
63
- }
64
- return hasUnknown ? "unknown" : "no";
65
- }
66
- case "leaf": {
67
- if (!(predicate.column in rowData))
68
- return "unknown";
69
- const val = rowData[predicate.column];
70
- switch (predicate.operator) {
71
- case "=": return val === predicate.value ? "yes" : "no";
72
- case "!=": return val !== predicate.value ? "yes" : "no";
73
- case ">": return val > predicate.value ? "yes" : "no";
74
- case ">=": return val >= predicate.value ? "yes" : "no";
75
- case "<": return val < predicate.value ? "yes" : "no";
76
- case "<=": return val <= predicate.value ? "yes" : "no";
77
- case "between":
78
- return val >= predicate.value &&
79
- val <= predicate.value2 ? "yes" : "no";
80
- case "like":
81
- case "contains":
82
- case "ilike":
83
- case "icontains": {
84
- if (typeof val !== "string" || typeof predicate.value !== "string")
85
- return "no";
86
- const haystack = (predicate.operator === "ilike" || predicate.operator === "icontains")
87
- ? val.toLowerCase() : val;
88
- const needle = (predicate.operator === "ilike" || predicate.operator === "icontains")
89
- ? predicate.value.toLowerCase() : predicate.value;
90
- const pattern = (predicate.operator === "contains" || predicate.operator === "icontains")
91
- ? `%${needle}%` : needle;
92
- const regex = new RegExp("^" + pattern.replace(/%/g, ".*").replace(/_/g, ".") + "$");
93
- return regex.test(haystack) ? "yes" : "no";
94
- }
95
- case "jsonContains": {
96
- const candidate = decodeJsonLeafValue(predicate);
97
- const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;
98
- if (target === undefined)
99
- return "no";
100
- return jsonContains(target, candidate) ? "yes" : "no";
101
- }
102
- case "jsonContainedBy": {
103
- const candidate = decodeJsonLeafValue(predicate);
104
- const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;
105
- if (target === undefined)
106
- return "no";
107
- return jsonContains(candidate, target) ? "yes" : "no";
108
- }
109
- case "jsonHasKey": {
110
- if (predicate.mode && Array.isArray(predicate.value)) {
111
- const paths = predicate.value;
112
- if (paths.length === 0)
113
- return "no";
114
- const verdict = predicate.mode === "all"
115
- ? paths.every(p => jsonPathExists(val, p))
116
- : paths.some(p => jsonPathExists(val, p));
117
- return verdict ? "yes" : "no";
118
- }
119
- if (predicate.raw) {
120
- return jsonPathExists(val, predicate.value) ? "yes" : "no";
121
- }
122
- const key = predicate.value;
123
- if (val === null || typeof val !== "object")
124
- return "no";
125
- if (Array.isArray(val))
126
- return val.includes(key) ? "yes" : "no";
127
- return key in val ? "yes" : "no";
128
- }
129
- case "jsonArrayContains": {
130
- const candidate = decodeJsonLeafValue(predicate);
131
- const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;
132
- if (!Array.isArray(target))
133
- return "no";
134
- return target.some(el => jsonContains(el, candidate)) ? "yes" : "no";
135
- }
136
- case "isNull": return val === null ? "yes" : "no";
137
- case "isNotNull": return val !== null ? "yes" : "no";
138
- default: return "unknown";
139
- }
140
- }
141
- }
142
- }
143
- function decodeJsonLeafValue(leaf) {
144
- if (!leaf.raw)
145
- return leaf.value;
146
- if (typeof leaf.value !== "string")
147
- return leaf.value;
148
- try {
149
- return JSON.parse(leaf.value);
150
- }
151
- catch {
152
- return leaf.value;
153
- }
154
- }
155
- function parseLogData(log) {
156
- if (log._parsedData !== undefined) {
157
- return log._parsedData;
158
- }
159
- const data = log.data.length > 0
160
- ? JSON.parse(utf8Decode(log.data))
161
- : null;
162
- log._parsedData = data;
163
- return data;
164
- }
165
- export function checkLogsAffectReadSet(logs, rawReadSet) {
166
- for (const log of logs) {
167
- for (const rawRead of rawReadSet) {
168
- if (!bytesEqual(log.tableId, rawRead.tableId))
169
- continue;
170
- const res = rawRead.kind === "point" ?
171
- checkPointReadOverlap(log, rawRead) :
172
- checkRangeReadOverlap(log, rawRead);
173
- if (res) {
174
- return true;
175
- }
176
- }
177
- }
178
- return false;
179
- }
180
- function checkPointReadOverlap(log, rawRead) {
181
- return bytesEqual(log.id, rawRead.id);
182
- }
183
- function checkRangeReadOverlap(log, rawRead) {
184
- const logData = parseLogData(log);
185
- // No envelope at all → can't reason, must conflict-out.
186
- if (!logData) {
187
- return true;
188
- }
189
- // Commit logs serialize the full WriteEntry (see PgDatabase.insertCommitLogs),
190
- // so extract the row state from it. Same prev-OR-post check as the
191
- // in-memory invalidator path.
192
- const op = logData.op ?? "update";
193
- const data = logData.data;
194
- const prevData = logData.prevData;
195
- return checkRowWriteAffectsRange(op, prevData, data, rawRead.predicate);
196
- }
197
- export function checkWriteSetAffectsReadSet(writeSet, rawReadSet) {
198
- for (const write of writeSet) {
199
- for (const rawRead of rawReadSet) {
200
- if (!bytesEqual(write.tableId, rawRead.tableId))
201
- continue;
202
- if (checkWriteAffectsRawReadEntry(write, rawRead)) {
203
- return true;
204
- }
205
- }
206
- }
207
- return false;
208
- }
209
- function checkWriteAffectsRawReadEntry(write, rawRead) {
210
- if (rawRead.kind === "point") {
211
- return bytesEqual(write.id, rawRead.id);
212
- }
213
- return checkRowWriteAffectsRange(write.op, write.prevData, write.data, rawRead.predicate);
214
- }
215
- /**
216
- * Evaluate whether a write affects a range subscription, given the row's
217
- * prior and post state. The write is considered affecting if EITHER side
218
- * matched the predicate — that catches:
219
- * - rows entering the result set (prev "no", post "yes")
220
- * - rows leaving the result set (prev "yes", post "no")
221
- * - rows changing while still in the set (prev "yes", post "yes")
222
- * Skipped only if both sides are a definite "no".
223
- *
224
- * When prevData is missing (e.g. inserts, or commit logs predating this
225
- * change), we fall back to conservative "unknown" on that side.
226
- */
227
- function checkRowWriteAffectsRange(op, prevData, data, predicate) {
228
- const prevVerdict = prevData
229
- ? evaluatePredicateAgainstRow(prevData, predicate)
230
- : (op === "insert" ? "no" : "unknown");
231
- let postVerdict;
232
- if (op === "delete") {
233
- postVerdict = "no";
234
- }
235
- else if (data) {
236
- // Merge over prevData so unchanged columns carry over — otherwise a
237
- // partial update (e.g. {title: "x"}) would be "unknown" on every
238
- // predicate column it doesn't touch.
239
- const post = prevData ? { ...prevData, ...data } : data;
240
- postVerdict = evaluatePredicateAgainstRow(post, predicate);
241
- }
242
- else {
243
- postVerdict = "unknown";
244
- }
245
- return prevVerdict !== "no" || postVerdict !== "no";
246
- }
247
- //# sourceMappingURL=overlap-checker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlap-checker.js","sourceRoot":"","sources":["../../../src/server/overlap-checker.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /** Compute stable hash using json-stable-stringify and SHA1. */
2
- export declare function getHashOf(input: unknown): Promise<string>;
3
- /**
4
- * Default identity literal used when neither a procedure-level
5
- * `queryIdentity` override nor a per-session user is available.
6
- */
7
- export declare const ANONYMOUS_IDENTITY = "anonymous";
8
- /**
9
- * Compute a subscription id from hash of procedure + input + queryIdentity.
10
- *
11
- * `queryIdentity` is the segmentation key for cache/subscriptions. By default
12
- * it is the authenticated user's id (so two users get distinct subscriptions
13
- * for the same query), but a procedure may override it to share cache/subs
14
- * across users (e.g. for a public, user-independent query).
15
- */
16
- export declare function generateSubscriptionId(procedure: string, input: unknown | string, queryIdentity: string): Promise<string>;
17
- /**
18
- * Compute cache key from query name + args + queryIdentity. The identity
19
- * participates so that user-specific results don't poison each other's
20
- * cache when a procedure does authorize per-user.
21
- */
22
- export declare function generateCacheKey(queryName: string, input: unknown | string, queryIdentity: string): Promise<string>;
23
- //# sourceMappingURL=sub_hash.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sub_hash.d.ts","sourceRoot":"","sources":["../../../src/server/sub_hash.ts"],"names":[],"mappings":"AAMA,gEAAgE;AAChE,wBAAsB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/D;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GAAG,MAAM,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GAAG,MAAM,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
@@ -1,38 +0,0 @@
1
- // Server-only hashing helpers. Kept off the `helper.ts` module so a browser
2
- // bundle that only imports `stableStringify` doesn't pull in `hash-wasm`.
3
- import { sha1 } from "hash-wasm";
4
- import { stableStringify } from "../helper";
5
- /** Compute stable hash using json-stable-stringify and SHA1. */
6
- export async function getHashOf(input) {
7
- const stableStr = typeof input === "string" ? input : stableStringify(input);
8
- return sha1(stableStr ?? "");
9
- }
10
- /**
11
- * Default identity literal used when neither a procedure-level
12
- * `queryIdentity` override nor a per-session user is available.
13
- */
14
- export const ANONYMOUS_IDENTITY = "anonymous";
15
- /**
16
- * Compute a subscription id from hash of procedure + input + queryIdentity.
17
- *
18
- * `queryIdentity` is the segmentation key for cache/subscriptions. By default
19
- * it is the authenticated user's id (so two users get distinct subscriptions
20
- * for the same query), but a procedure may override it to share cache/subs
21
- * across users (e.g. for a public, user-independent query).
22
- */
23
- export async function generateSubscriptionId(procedure, input, queryIdentity) {
24
- const inputStr = typeof input === 'string' ? input : stableStringify(input);
25
- const hash = await getHashOf(`${procedure}_${inputStr}_${queryIdentity}`);
26
- return `sub_${hash}`;
27
- }
28
- /**
29
- * Compute cache key from query name + args + queryIdentity. The identity
30
- * participates so that user-specific results don't poison each other's
31
- * cache when a procedure does authorize per-user.
32
- */
33
- export async function generateCacheKey(queryName, input, queryIdentity) {
34
- const argsStr = typeof input === 'string' ? input : stableStringify(input);
35
- const hash = await getHashOf(`${queryName}_${argsStr}_${queryIdentity}`);
36
- return `ck_${hash}`;
37
- }
38
- //# sourceMappingURL=sub_hash.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sub_hash.js","sourceRoot":"","sources":["../../../src/server/sub_hash.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAE1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAc;IAC5C,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAAiB,EACjB,KAAuB,EACvB,aAAqB;IAErB,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,SAAS,IAAI,QAAQ,IAAI,aAAa,EAAE,CAAC,CAAC;IAC1E,OAAO,OAAO,IAAI,EAAE,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,KAAuB,EACvB,aAAqB;IAErB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,SAAS,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC,CAAC;IACzE,OAAO,MAAM,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -1,120 +0,0 @@
1
- import * as types from "./subscription-manager-types";
2
- /**
3
- * Callback the app server registers to process invalidations that were
4
- * deferred during a sub-manager outage. When the sub-manager reconnects and
5
- * the buffered writeSets are flushed in one batched RPC, the resulting
6
- * `affected[]` is handed to this callback — which is expected to do the
7
- * same work as the normal per-mutation `reexecuteAffectedQuery` path.
8
- */
9
- export type AffectedHandler = (affected: types.AffectedSubscription[]) => Promise<void>;
10
- /**
11
- * Callback the app server registers to drive recovery on sub-manager
12
- * reconnect. Iterates `serverSubscriptions`, reads `sl:reg:<subId>` from
13
- * Redis, and re-registers each known sub. Resolves when complete; only then
14
- * does the client's buffer flush and gated calls release.
15
- */
16
- export type RecoveryDriver = () => Promise<void>;
17
- export interface SubManagerClientOptions {
18
- url: string;
19
- /**
20
- * Maximum number of buffered WriteEntry records held during an outage.
21
- * If exceeded, the buffer is dropped — the commit-log replay path during
22
- * the next register call will catch up any missed invalidations, at the
23
- * cost of a brief recompute spike. Default 50_000 entries.
24
- */
25
- invalidateBufferLimit?: number;
26
- }
27
- export declare const subscriptionManagerDataPack: {
28
- encode: (data: unknown) => string;
29
- decode: (data: string) => any;
30
- };
31
- /**
32
- * RPC client for the (single) sub-manager process.
33
- *
34
- * Design (Convex-inspired):
35
- * • The sub-manager is in-memory and ephemeral. There is no version
36
- * protocol, no client-side registration registry, no OUT_OF_SYNC
37
- * replay logic. All recovery is driven from the app server using
38
- * state it already has (`serverSubscriptions`) plus registration
39
- * records persisted to Redis at `sl:reg:<subId>`.
40
- *
41
- * • Out-of-order `updateSubscriptionReadSet` calls are filtered server
42
- * side using `lastSnapshotTs` (monotonic DB commit timestamp).
43
- *
44
- * • On rpc-websockets reconnect, the client:
45
- * 1. Transitions to `busy` (any in-flight `invalidateWriteset`
46
- * buffers its writeSet).
47
- * 2. Invokes the app server's `recoveryDriver` to re-register all
48
- * known subs.
49
- * 3. Flushes the buffer as one batched `invalidateWriteset` RPC and
50
- * hands the resulting `affected[]` to `affectedHandler`.
51
- * 4. Transitions to `ready`.
52
- *
53
- * • During an extended outage, the buffer is bounded; if exceeded, it
54
- * is dropped and we rely on the commit-log replay built into
55
- * `SubscriptionWorker.register()` to catch each sub up on the next
56
- * re-register.
57
- */
58
- export declare class SubManagerClient {
59
- private client;
60
- private state;
61
- private hasConnectedOnce;
62
- /** Resolves whenever state transitions to 'ready'. Replaced on each busy→ready cycle. */
63
- private readyPromise;
64
- private resolveReady;
65
- /** Writeset entries accumulated while state === 'busy'. Flushed as one RPC after recovery. */
66
- private bufferedWriteSets;
67
- private readonly bufferLimit;
68
- private bufferDroppedDuringOutage;
69
- private recoveryDriver?;
70
- private affectedHandler?;
71
- constructor(urlOrOptions: string | SubManagerClientOptions);
72
- /**
73
- * Wire up the app-server-driven recovery. Must be called before any
74
- * disconnect/reconnect cycle for buffered writeSets to be flushed and
75
- * subscriptions re-registered.
76
- */
77
- setRecoveryDriver(driver: RecoveryDriver): void;
78
- /**
79
- * Wire up the handler invoked when batched invalidate results land
80
- * after recovery. The handler is expected to drive
81
- * `reexecuteAffectedQuery` for each entry.
82
- */
83
- setAffectedHandler(handler: AffectedHandler): void;
84
- registerSubscription(params: types.RegisterSubscriptionParams): Promise<types.RegisterSubscriptionResult>;
85
- registerSubscriptionBatch(params: types.RegisterSubscriptionParams[]): Promise<types.RegisterSubscriptionResult[]>;
86
- updateSubscriptionReadSet(params: types.UpdateSubscriptionReadSetParams): Promise<types.UpdateSubscriptionReadSetResult>;
87
- unregisterSubscription(params: types.UnregisterSubscriptionParams): Promise<types.UnregisterSubscriptionResult>;
88
- unregisterSubscriptions(params: types.UnregisterSubscriptionsParams): Promise<types.UnregisterSubscriptionsResult>;
89
- /**
90
- * Sends the writeSet to the sub-manager for invalidation, OR buffers it
91
- * if the client is currently disconnected / recovering. Returns
92
- * `{ affected: [] }` while buffering — the actual `affected` from the
93
- * buffered batch is delivered via the registered `affectedHandler`
94
- * after recovery completes.
95
- */
96
- invalidateWriteset(params: types.InvalidateWritesetParams): Promise<types.InvalidateWritesetResult>;
97
- /**
98
- * Single point through which RPCs go. Throws on transport / server error.
99
- * `registerSubscription`, `updateSubscriptionReadSet`, and
100
- * `unregisterSubscription` are NOT gated on the ready state: during a
101
- * disconnect they will fail at the socket layer, and during recovery
102
- * (which itself uses these methods) gating would deadlock.
103
- */
104
- private call;
105
- private appendToBuffer;
106
- private flushBuffer;
107
- private markBusy;
108
- private markReady;
109
- private handleClose;
110
- private handleOpen;
111
- private runRecovery;
112
- /**
113
- * Test/inspection helpers.
114
- */
115
- /** @internal */
116
- isReady(): boolean;
117
- /** @internal */
118
- bufferSize(): number;
119
- }
120
- //# sourceMappingURL=subscription-manager-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscription-manager-client.d.ts","sourceRoot":"","sources":["../../../src/server/subscription-manager-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC;AAUtD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,QAAQ,EAAE,KAAK,CAAC,oBAAoB,EAAE,KACnC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAID,eAAO,MAAM,2BAA2B;mBACvB,OAAO;mBACP,MAAM;CACtB,CAAC;AAGF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,gBAAgB,CAAS;IAEjC,yFAAyF;IACzF,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,YAAY,CAAc;IAElC,8FAA8F;IAC9F,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,yBAAyB,CAAS;IAE1C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAE9B,YAAY,EAAE,MAAM,GAAG,uBAAuB;IAqB1D;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAI/C;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAM5C,oBAAoB,CACxB,MAAM,EAAE,KAAK,CAAC,0BAA0B,GACvC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;IAItC,yBAAyB,CAC7B,MAAM,EAAE,KAAK,CAAC,0BAA0B,EAAE,GACzC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC;IAIxC,yBAAyB,CAC7B,MAAM,EAAE,KAAK,CAAC,+BAA+B,GAC5C,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC;IAI3C,sBAAsB,CAC1B,MAAM,EAAE,KAAK,CAAC,4BAA4B,GACzC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC;IAIxC,uBAAuB,CAC3B,MAAM,EAAE,KAAK,CAAC,6BAA6B,GAC1C,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC;IAI/C;;;;;;OAMG;IACG,kBAAkB,CACtB,MAAM,EAAE,KAAK,CAAC,wBAAwB,GACrC,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC;IAU1C;;;;;;OAMG;YACW,IAAI;IASlB,OAAO,CAAC,cAAc;YAeR,WAAW;IAoBzB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;YAWJ,WAAW;IAkBzB;;OAEG;IACH,gBAAgB;IAChB,OAAO,IAAI,OAAO;IAClB,gBAAgB;IAChB,UAAU,IAAI,MAAM;CACrB"}
@@ -1,207 +0,0 @@
1
- import { Client } from "rpc-websockets";
2
- import * as types from "./subscription-manager-types";
3
- import { logger as baseLogger, logLevelOf } from "../logger";
4
- import { supaliveStringify } from "../helper";
5
- const logger = baseLogger.child({ name: "SUBS_MGR_CLIENT" }, { level: logLevelOf("SUB_MANAGER_CLIENT_LOG_LEVEL") });
6
- export const subscriptionManagerDataPack = {
7
- encode: (data) => supaliveStringify(data),
8
- decode: (data) => JSON.parse(data),
9
- };
10
- /**
11
- * RPC client for the (single) sub-manager process.
12
- *
13
- * Design (Convex-inspired):
14
- * • The sub-manager is in-memory and ephemeral. There is no version
15
- * protocol, no client-side registration registry, no OUT_OF_SYNC
16
- * replay logic. All recovery is driven from the app server using
17
- * state it already has (`serverSubscriptions`) plus registration
18
- * records persisted to Redis at `sl:reg:<subId>`.
19
- *
20
- * • Out-of-order `updateSubscriptionReadSet` calls are filtered server
21
- * side using `lastSnapshotTs` (monotonic DB commit timestamp).
22
- *
23
- * • On rpc-websockets reconnect, the client:
24
- * 1. Transitions to `busy` (any in-flight `invalidateWriteset`
25
- * buffers its writeSet).
26
- * 2. Invokes the app server's `recoveryDriver` to re-register all
27
- * known subs.
28
- * 3. Flushes the buffer as one batched `invalidateWriteset` RPC and
29
- * hands the resulting `affected[]` to `affectedHandler`.
30
- * 4. Transitions to `ready`.
31
- *
32
- * • During an extended outage, the buffer is bounded; if exceeded, it
33
- * is dropped and we rely on the commit-log replay built into
34
- * `SubscriptionWorker.register()` to catch each sub up on the next
35
- * re-register.
36
- */
37
- export class SubManagerClient {
38
- client;
39
- state = "busy";
40
- hasConnectedOnce = false;
41
- /** Resolves whenever state transitions to 'ready'. Replaced on each busy→ready cycle. */
42
- readyPromise;
43
- resolveReady;
44
- /** Writeset entries accumulated while state === 'busy'. Flushed as one RPC after recovery. */
45
- bufferedWriteSets = [];
46
- bufferLimit;
47
- bufferDroppedDuringOutage = false;
48
- recoveryDriver;
49
- affectedHandler;
50
- constructor(urlOrOptions) {
51
- const opts = typeof urlOrOptions === "string"
52
- ? { url: urlOrOptions }
53
- : urlOrOptions;
54
- this.bufferLimit = opts.invalidateBufferLimit ?? 50_000;
55
- this.readyPromise = new Promise((r) => { this.resolveReady = r; });
56
- this.client = new Client(opts.url, {
57
- dataPack: subscriptionManagerDataPack,
58
- });
59
- this.client.setAutoReconnect(true);
60
- this.client.setMaxReconnects(0);
61
- // Ensure the dataPack is set even if rpc-websockets doesn't pass it through to the Client constructor
62
- this.client.dataPack = subscriptionManagerDataPack;
63
- this.client.on("open", this.handleOpen.bind(this));
64
- this.client.on("close", this.handleClose.bind(this));
65
- this.client.on("error", (err) => logger.warn(err, "sub-manager client socket error"));
66
- }
67
- /**
68
- * Wire up the app-server-driven recovery. Must be called before any
69
- * disconnect/reconnect cycle for buffered writeSets to be flushed and
70
- * subscriptions re-registered.
71
- */
72
- setRecoveryDriver(driver) {
73
- this.recoveryDriver = driver;
74
- }
75
- /**
76
- * Wire up the handler invoked when batched invalidate results land
77
- * after recovery. The handler is expected to drive
78
- * `reexecuteAffectedQuery` for each entry.
79
- */
80
- setAffectedHandler(handler) {
81
- this.affectedHandler = handler;
82
- }
83
- // ─── RPC methods ────────────────────────────────────────────────────────
84
- async registerSubscription(params) {
85
- return this.call("registerSubscription", params, types.RegisterSubscriptionResultSchema);
86
- }
87
- async registerSubscriptionBatch(params) {
88
- return this.call("registerSubscriptionBatch", params, types.RegisterSubscriptionBatchResultSchema);
89
- }
90
- async updateSubscriptionReadSet(params) {
91
- return this.call("updateSubscriptionReadSet", params, types.UpdateSubscriptionReadSetResultSchema);
92
- }
93
- async unregisterSubscription(params) {
94
- return this.call("unregisterSubscription", params, types.UnregisterSubscriptionResultSchema);
95
- }
96
- async unregisterSubscriptions(params) {
97
- return this.call("unregisterSubscriptions", params, types.UnregisterSubscriptionsResultSchema);
98
- }
99
- /**
100
- * Sends the writeSet to the sub-manager for invalidation, OR buffers it
101
- * if the client is currently disconnected / recovering. Returns
102
- * `{ affected: [] }` while buffering — the actual `affected` from the
103
- * buffered batch is delivered via the registered `affectedHandler`
104
- * after recovery completes.
105
- */
106
- async invalidateWriteset(params) {
107
- if (this.state === "busy") {
108
- this.appendToBuffer(params.writeSet);
109
- return { affected: [] };
110
- }
111
- return this.call("invalidateWriteset", params, types.InvalidateWritesetResultSchema);
112
- }
113
- // ─── Internal ───────────────────────────────────────────────────────────
114
- /**
115
- * Single point through which RPCs go. Throws on transport / server error.
116
- * `registerSubscription`, `updateSubscriptionReadSet`, and
117
- * `unregisterSubscription` are NOT gated on the ready state: during a
118
- * disconnect they will fail at the socket layer, and during recovery
119
- * (which itself uses these methods) gating would deadlock.
120
- */
121
- async call(procName, params, resType) {
122
- const result = await this.client.call(procName, params);
123
- return resType.parse(result);
124
- }
125
- appendToBuffer(writeSet) {
126
- if (this.bufferedWriteSets.length + writeSet.length > this.bufferLimit) {
127
- if (!this.bufferDroppedDuringOutage) {
128
- logger.warn(`Invalidate buffer would exceed ${this.bufferLimit}; dropping buffered entries. ` +
129
- `Subscriptions will be caught up via commit-log replay on re-register.`);
130
- this.bufferDroppedDuringOutage = true;
131
- }
132
- this.bufferedWriteSets = [];
133
- return;
134
- }
135
- this.bufferedWriteSets.push(...writeSet);
136
- }
137
- async flushBuffer() {
138
- if (this.bufferedWriteSets.length === 0)
139
- return;
140
- const writeSet = this.bufferedWriteSets;
141
- this.bufferedWriteSets = [];
142
- this.bufferDroppedDuringOutage = false;
143
- try {
144
- const result = await this.call("invalidateWriteset", { writeSet }, types.InvalidateWritesetResultSchema);
145
- if (this.affectedHandler && result.affected.length > 0) {
146
- await this.affectedHandler(result.affected);
147
- }
148
- }
149
- catch (err) {
150
- logger.error(err, "Failed to flush invalidate buffer after recovery");
151
- }
152
- }
153
- markBusy() {
154
- if (this.state === "busy")
155
- return;
156
- this.state = "busy";
157
- this.readyPromise = new Promise((r) => { this.resolveReady = r; });
158
- }
159
- markReady() {
160
- if (this.state === "ready")
161
- return;
162
- this.state = "ready";
163
- this.resolveReady();
164
- }
165
- handleClose() {
166
- logger.info("sub-manager client: socket closed");
167
- this.markBusy();
168
- }
169
- handleOpen() {
170
- if (!this.hasConnectedOnce) {
171
- this.hasConnectedOnce = true;
172
- logger.info("sub-manager client: initial connect");
173
- this.markReady();
174
- return;
175
- }
176
- logger.info("sub-manager client: reconnected — starting recovery");
177
- void this.runRecovery();
178
- }
179
- async runRecovery() {
180
- // Stay 'busy' for the duration of recovery so concurrent
181
- // invalidateWriteset calls keep buffering.
182
- try {
183
- if (this.recoveryDriver) {
184
- await this.recoveryDriver();
185
- }
186
- else {
187
- logger.warn("sub-manager client: no recoveryDriver configured — skipping recovery step");
188
- }
189
- await this.flushBuffer();
190
- }
191
- catch (err) {
192
- logger.error(err, "Recovery failed; state will be marked ready anyway");
193
- }
194
- finally {
195
- logger.info("sub-manager client: recovery complete");
196
- this.markReady();
197
- }
198
- }
199
- /**
200
- * Test/inspection helpers.
201
- */
202
- /** @internal */
203
- isReady() { return this.state === "ready"; }
204
- /** @internal */
205
- bufferSize() { return this.bufferedWriteSets.length; }
206
- }
207
- //# sourceMappingURL=subscription-manager-client.js.map