@powersync/service-sync-rules 0.27.0 → 0.29.0

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 (101) hide show
  1. package/LICENSE +3 -3
  2. package/dist/BaseSqlDataQuery.d.ts +9 -1
  3. package/dist/BaseSqlDataQuery.js +44 -2
  4. package/dist/BaseSqlDataQuery.js.map +1 -1
  5. package/dist/BucketDescription.d.ts +16 -0
  6. package/dist/BucketParameterQuerier.d.ts +19 -3
  7. package/dist/BucketParameterQuerier.js.map +1 -1
  8. package/dist/BucketSource.d.ts +72 -0
  9. package/dist/BucketSource.js +6 -0
  10. package/dist/BucketSource.js.map +1 -0
  11. package/dist/ExpressionType.d.ts +1 -0
  12. package/dist/ExpressionType.js.map +1 -1
  13. package/dist/SourceTableInterface.d.ts +1 -1
  14. package/dist/SqlBucketDescriptor.d.ts +40 -8
  15. package/dist/SqlBucketDescriptor.js +78 -10
  16. package/dist/SqlBucketDescriptor.js.map +1 -1
  17. package/dist/SqlDataQuery.d.ts +4 -3
  18. package/dist/SqlDataQuery.js +10 -30
  19. package/dist/SqlDataQuery.js.map +1 -1
  20. package/dist/SqlParameterQuery.d.ts +4 -4
  21. package/dist/SqlParameterQuery.js +9 -4
  22. package/dist/SqlParameterQuery.js.map +1 -1
  23. package/dist/SqlSyncRules.d.ts +55 -7
  24. package/dist/SqlSyncRules.js +126 -47
  25. package/dist/SqlSyncRules.js.map +1 -1
  26. package/dist/StaticSchema.js +2 -2
  27. package/dist/StaticSchema.js.map +1 -1
  28. package/dist/StaticSqlParameterQuery.d.ts +2 -2
  29. package/dist/StaticSqlParameterQuery.js +3 -2
  30. package/dist/StaticSqlParameterQuery.js.map +1 -1
  31. package/dist/TablePattern.js +2 -2
  32. package/dist/TablePattern.js.map +1 -1
  33. package/dist/TableValuedFunctionSqlParameterQuery.d.ts +2 -2
  34. package/dist/TableValuedFunctionSqlParameterQuery.js +11 -10
  35. package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  36. package/dist/TableValuedFunctions.d.ts +2 -2
  37. package/dist/TableValuedFunctions.js +38 -35
  38. package/dist/TableValuedFunctions.js.map +1 -1
  39. package/dist/compatibility.d.ts +39 -0
  40. package/dist/compatibility.js +54 -0
  41. package/dist/compatibility.js.map +1 -0
  42. package/dist/events/SqlEventDescriptor.d.ts +3 -1
  43. package/dist/events/SqlEventDescriptor.js +5 -3
  44. package/dist/events/SqlEventDescriptor.js.map +1 -1
  45. package/dist/events/SqlEventSourceQuery.d.ts +2 -1
  46. package/dist/events/SqlEventSourceQuery.js +3 -2
  47. package/dist/events/SqlEventSourceQuery.js.map +1 -1
  48. package/dist/index.d.ts +7 -0
  49. package/dist/index.js +7 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/json_schema.js +54 -1
  52. package/dist/json_schema.js.map +1 -1
  53. package/dist/request_functions.d.ts +24 -4
  54. package/dist/request_functions.js +68 -17
  55. package/dist/request_functions.js.map +1 -1
  56. package/dist/schema-generators/SchemaGenerator.js +2 -12
  57. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  58. package/dist/sql_filters.d.ts +25 -2
  59. package/dist/sql_filters.js +223 -119
  60. package/dist/sql_filters.js.map +1 -1
  61. package/dist/sql_functions.d.ts +13 -31
  62. package/dist/sql_functions.js +191 -114
  63. package/dist/sql_functions.js.map +1 -1
  64. package/dist/sql_support.d.ts +20 -0
  65. package/dist/sql_support.js +67 -14
  66. package/dist/sql_support.js.map +1 -1
  67. package/dist/streams/filter.d.ts +148 -0
  68. package/dist/streams/filter.js +426 -0
  69. package/dist/streams/filter.js.map +1 -0
  70. package/dist/streams/from_sql.d.ts +4 -0
  71. package/dist/streams/from_sql.js +375 -0
  72. package/dist/streams/from_sql.js.map +1 -0
  73. package/dist/streams/functions.d.ts +2 -0
  74. package/dist/streams/functions.js +38 -0
  75. package/dist/streams/functions.js.map +1 -0
  76. package/dist/streams/parameter.d.ts +67 -0
  77. package/dist/streams/parameter.js +2 -0
  78. package/dist/streams/parameter.js.map +1 -0
  79. package/dist/streams/stream.d.ts +40 -0
  80. package/dist/streams/stream.js +139 -0
  81. package/dist/streams/stream.js.map +1 -0
  82. package/dist/streams/utils.d.ts +1 -0
  83. package/dist/streams/utils.js +13 -0
  84. package/dist/streams/utils.js.map +1 -0
  85. package/dist/streams/variant.d.ts +122 -0
  86. package/dist/streams/variant.js +266 -0
  87. package/dist/streams/variant.js.map +1 -0
  88. package/dist/types/custom_sqlite_value.d.ts +38 -0
  89. package/dist/types/custom_sqlite_value.js +50 -0
  90. package/dist/types/custom_sqlite_value.js.map +1 -0
  91. package/dist/types/time.d.ts +33 -0
  92. package/dist/types/time.js +67 -0
  93. package/dist/types/time.js.map +1 -0
  94. package/dist/types.d.ts +53 -10
  95. package/dist/types.js +28 -2
  96. package/dist/types.js.map +1 -1
  97. package/dist/utils.d.ts +9 -6
  98. package/dist/utils.js +42 -17
  99. package/dist/utils.js.map +1 -1
  100. package/package.json +4 -4
  101. package/schema/sync_rules.json +80 -2
@@ -0,0 +1,375 @@
1
+ import { SqlRuleError } from '../errors.js';
2
+ import { isSelectStatement } from '../utils.js';
3
+ import { andFilters, checkUnsupportedFeatures, isClauseError, isParameterMatchClause, isParameterValueClause, isRowValueClause, isStaticValueClause, orFilters } from '../sql_support.js';
4
+ import { TablePattern } from '../TablePattern.js';
5
+ import { TableQuerySchema } from '../TableQuerySchema.js';
6
+ import { SqlTools } from '../sql_filters.js';
7
+ import { BaseSqlDataQuery } from '../BaseSqlDataQuery.js';
8
+ import { ExpressionType } from '../ExpressionType.js';
9
+ import { SyncStream } from './stream.js';
10
+ import { And, CompareRowValueWithStreamParameter, EvaluateSimpleCondition, ExistsOperator, InOperator, Not, Or, OverlapOperator, Subquery } from './filter.js';
11
+ import { parse } from 'pgsql-ast-parser';
12
+ import { STREAM_FUNCTIONS } from './functions.js';
13
+ import { CompatibilityEdition } from '../compatibility.js';
14
+ export function syncStreamFromSql(descriptorName, sql, options) {
15
+ const compiler = new SyncStreamCompiler(descriptorName, sql, options);
16
+ return [compiler.compile(), compiler.errors];
17
+ }
18
+ class SyncStreamCompiler {
19
+ descriptorName;
20
+ sql;
21
+ options;
22
+ errors;
23
+ constructor(descriptorName, sql, options) {
24
+ this.descriptorName = descriptorName;
25
+ this.sql = sql;
26
+ this.options = options;
27
+ this.errors = [];
28
+ }
29
+ compile() {
30
+ if (this.options.compatibility.edition < CompatibilityEdition.SYNC_STREAMS) {
31
+ throw new SqlRuleError('Sync streams require edition 2 or later. Try adding a `config: {edition: 2} block to the end of the file.`', this.sql);
32
+ }
33
+ const [stmt, ...illegalRest] = parse(this.sql, { locationTracking: true });
34
+ // TODO: Share more of this code with SqlDataQuery
35
+ if (illegalRest.length > 0) {
36
+ throw new SqlRuleError('Only a single SELECT statement is supported', this.sql, illegalRest[0]?._location);
37
+ }
38
+ const { query, tableRef, alias, querySchema, sourceTable } = this.checkValidSelectStatement(stmt);
39
+ const tools = new SqlTools({
40
+ table: alias,
41
+ parameterTables: [],
42
+ valueTables: [alias],
43
+ sql: this.sql,
44
+ schema: querySchema,
45
+ parameterFunctions: STREAM_FUNCTIONS,
46
+ compatibilityContext: this.options.compatibility,
47
+ supportsParameterExpressions: true,
48
+ supportsExpandingParameters: true // needed for table.column IN (subscription.parameters() -> ...)
49
+ });
50
+ tools.checkSpecificNameCase(tableRef);
51
+ let filter = this.whereClauseToFilters(tools, query.where);
52
+ filter = filter.toDisjunctiveNormalForm(tools);
53
+ const stream = new SyncStream(this.descriptorName, new BaseSqlDataQuery(this.compileDataQuery(tools, query, alias, sourceTable)));
54
+ stream.subscribedToByDefault = this.options.auto_subscribe ?? false;
55
+ if (filter.isValid(tools)) {
56
+ stream.variants = filter.compileVariants(this.descriptorName);
57
+ }
58
+ this.errors.push(...tools.errors);
59
+ return stream;
60
+ }
61
+ compileDataQuery(tools, query, alias, sourceTable) {
62
+ let hasId = false;
63
+ let hasWildcard = false;
64
+ let extractors = [];
65
+ const querySchema = tools.schema;
66
+ for (let column of query.columns ?? []) {
67
+ const name = tools.getOutputName(column);
68
+ if (name != '*') {
69
+ const clause = tools.compileRowValueExtractor(column.expr);
70
+ if (isClauseError(clause)) {
71
+ // Error logged already
72
+ continue;
73
+ }
74
+ extractors.push({
75
+ extract: (tables, output) => {
76
+ output[name] = clause.evaluate(tables);
77
+ },
78
+ getTypes(schema, into) {
79
+ const def = clause.getColumnDefinition(schema);
80
+ into[name] = { name, type: def?.type ?? ExpressionType.NONE, originalType: def?.originalType };
81
+ }
82
+ });
83
+ }
84
+ else {
85
+ extractors.push({
86
+ extract: (tables, output) => {
87
+ const row = tables[alias];
88
+ for (let key in row) {
89
+ if (key.startsWith('_')) {
90
+ continue;
91
+ }
92
+ output[key] ??= row[key];
93
+ }
94
+ },
95
+ getTypes(schema, into) {
96
+ for (let column of schema.getColumns(alias)) {
97
+ into[column.name] ??= column;
98
+ }
99
+ }
100
+ });
101
+ }
102
+ if (name == 'id') {
103
+ hasId = true;
104
+ }
105
+ else if (name == '*') {
106
+ hasWildcard = true;
107
+ if (querySchema == null) {
108
+ // Not performing schema-based validation - assume there is an id
109
+ hasId = true;
110
+ }
111
+ else {
112
+ const idType = querySchema.getColumn(alias, 'id')?.type ?? ExpressionType.NONE;
113
+ if (!idType.isNone()) {
114
+ hasId = true;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ if (!hasId) {
120
+ const error = new SqlRuleError(`Query must return an "id" column`, this.sql, query.columns?.[0]._location);
121
+ if (hasWildcard) {
122
+ // Schema-based validations are always warnings
123
+ error.type = 'warning';
124
+ }
125
+ tools.errors.push(error);
126
+ }
127
+ return {
128
+ sourceTable,
129
+ table: alias,
130
+ sql: this.sql,
131
+ columns: query.columns ?? [],
132
+ descriptorName: this.descriptorName,
133
+ tools,
134
+ extractors,
135
+ // Streams don't have traditional parameters, and parameters aren't used in the rest of the stream implementation.
136
+ // Instead, we represent parameters as an array in stream variants.
137
+ bucketParameters: []
138
+ };
139
+ }
140
+ checkUnsupportedFeatures(stmt) {
141
+ this.errors.push(...checkUnsupportedFeatures(this.sql, stmt));
142
+ }
143
+ whereClauseToFilters(tools, clause) {
144
+ // We need to handle some functions specially here:
145
+ // 1. IN subqueries are not allowed in regular data queries, so we handle them here instead of relying on SqlTools
146
+ // 2. Since IN operators can be composed with other operators using AND and OR, we need to handle those operators
147
+ // as well.
148
+ // Apart from that we can rely on compileClause
149
+ if (clause != null) {
150
+ if (clause.type == 'binary') {
151
+ let operator, scalarCombinator;
152
+ if (clause.op == 'AND') {
153
+ operator = And;
154
+ scalarCombinator = andFilters;
155
+ }
156
+ else if (clause.op == 'OR') {
157
+ operator = Or;
158
+ scalarCombinator = orFilters;
159
+ }
160
+ else if (clause.op == 'IN' || clause.op == 'NOT IN') {
161
+ const filter = this.compileInOperator(tools, clause);
162
+ return clause.op == 'NOT IN' ? new Not(clause._location ?? null, filter) : filter;
163
+ }
164
+ else if (clause.op == '&&') {
165
+ return this.compileOverlapOperator(tools, clause);
166
+ }
167
+ // Try to combine AND and OR operators on a scalar level first, without introducing more filters.
168
+ if (operator && scalarCombinator) {
169
+ const left = this.whereClauseToFilters(tools, clause.left);
170
+ const right = this.whereClauseToFilters(tools, clause.right);
171
+ if (left instanceof EvaluateSimpleCondition && right instanceof EvaluateSimpleCondition) {
172
+ let directCombination;
173
+ try {
174
+ directCombination = scalarCombinator(left.expression, right.expression);
175
+ }
176
+ catch (e) {
177
+ // Left and right might be a combination of row and parameter values that can't be combined like this. Ok,
178
+ // we can represent thas as separate filter instances.
179
+ }
180
+ if (directCombination && isScalarExpression(directCombination)) {
181
+ return new EvaluateSimpleCondition(clause._location ?? null, directCombination);
182
+ }
183
+ }
184
+ return new operator(clause._location ?? null, left, right);
185
+ }
186
+ }
187
+ else if (clause.type == 'unary') {
188
+ if (clause.op == 'NOT') {
189
+ const inner = this.whereClauseToFilters(tools, clause.operand);
190
+ if (inner instanceof EvaluateSimpleCondition) {
191
+ // We can just negate that directly.
192
+ return inner.negate(tools);
193
+ }
194
+ else {
195
+ return new Not(clause._location ?? null, inner);
196
+ }
197
+ }
198
+ }
199
+ }
200
+ const regularClause = tools.compileClause(clause);
201
+ return compiledClauseToFilter(tools, clause?._location ?? null, regularClause);
202
+ }
203
+ compileInOperator(tools, clause) {
204
+ // There are different kinds of `IN` operators we support in stream definitions:
205
+ //
206
+ // 1. Left row clause, right subquery: `WHERE issue_in IN (SELECT id FROM issue WHERE owner_id = request.user())`
207
+ // 2. Left parameter clause, right subquery: `WHERE request.user_id() IN (SELECT * FROM user_id FROM users WHERE is_admin)`.
208
+ // 3. Left parameter clause, right row data: `WHERE request.user() IN comments.tagged_users`.
209
+ // 4. Left row clause, right parameter data: `WHERE id IN subscription_parameters.ids`.
210
+ // 5. Left and right both row clauses, both parameter clauses, or mix or static and row/parameter clauses.
211
+ const left = tools.compileClause(clause.left);
212
+ const location = clause._location ?? null;
213
+ if (isClauseError(left)) {
214
+ return recoverErrorClause(tools);
215
+ }
216
+ if (clause.right.type == 'select') {
217
+ if (!isScalarExpression(left)) {
218
+ if (!isClauseError(left)) {
219
+ tools.error('This may contain values derived from the source row to sync or a value derived from stream parameters, but never both.', clause.left);
220
+ }
221
+ return recoverErrorClause(tools);
222
+ }
223
+ const subqueryResult = this.compileSubquery(clause.right);
224
+ if (!subqueryResult) {
225
+ return recoverErrorClause(tools);
226
+ }
227
+ const [subquery, subqueryTools] = subqueryResult;
228
+ if (isStaticValueClause(left)) {
229
+ tools.error('For IN subqueries, the left operand must either depend on the row to sync or stream parameters.', clause.left);
230
+ return recoverErrorClause(tools);
231
+ }
232
+ if (isParameterValueClause(left)) {
233
+ // Case 2: We can't implement this as an actual IN operator because we need to use exact parameter lookups (so
234
+ // we can't, for instance, resolve `SELECT * FROM users WHERE is_admin` via parameter data sets). Since the
235
+ // left clause doesn't depend on row data however, we can push it down into the subquery where it would be
236
+ // introduced as a parameter: `EXISTS (SELECT _ FROM users WHERE is_admin AND user_id = request.user_id())`.
237
+ const additionalClause = subqueryTools.parameterMatchClause(subquery.column, left);
238
+ subquery.addFilter(compiledClauseToFilter(subqueryTools, null, additionalClause));
239
+ return new ExistsOperator(location, subquery);
240
+ }
241
+ else {
242
+ // Case 1
243
+ return new InOperator(location, left, subquery);
244
+ }
245
+ }
246
+ const right = tools.compileClause(clause.right);
247
+ // For cases 3-5, we can actually use SqlTools.compileClause. Case 3 and 4 are handled specially in there and return
248
+ // a ParameterMatchClause, which we can translate via CompareRowValueWithStreamParameter. Case 5 is either a row-value
249
+ // or a parameter-value clause which we can wrap in EvaluateSimpleCondition.
250
+ const combined = tools.compileInClause(clause.left, left, clause.right, right);
251
+ return compiledClauseToFilter(tools, location, combined);
252
+ }
253
+ compileOverlapOperator(tools, clause) {
254
+ const left = tools.compileClause(clause.left);
255
+ const location = clause._location ?? null;
256
+ if (isClauseError(left)) {
257
+ return recoverErrorClause(tools);
258
+ }
259
+ if (clause.right.type == 'select') {
260
+ if (!isRowValueClause(left)) {
261
+ if (!isClauseError(left)) {
262
+ tools.error('The left-hand side of an && operator must be derived from the row to sync..', clause.left);
263
+ }
264
+ return recoverErrorClause(tools);
265
+ }
266
+ const subqueryResult = this.compileSubquery(clause.right);
267
+ if (!subqueryResult) {
268
+ return recoverErrorClause(tools);
269
+ }
270
+ const [subquery] = subqueryResult;
271
+ return new OverlapOperator(location, left, subquery);
272
+ }
273
+ const right = tools.compileClause(clause.right);
274
+ // For cases 3-5, we can actually uses SqlTools.compileClause. Case 3 and 4 are handled specially in there and return
275
+ // a ParameterMatchClause, which we can translate via CompareRowValueWithStreamParameter. Case 5 is either a row-value
276
+ // or a parameter-value clause which we can wrap in EvaluateSimpleCondition.
277
+ const combined = tools.compileOverlapClause(clause.left, left, clause.right, right);
278
+ return compiledClauseToFilter(tools, location, combined);
279
+ }
280
+ compileSubquery(stmt) {
281
+ // A subquery is similar to a data query in legacy sync rules. Importantly, despite being an expression, subqueries
282
+ // can't reference columns from the outer query! The syntax is always `SELECT <single column> FROM <table> WHERE
283
+ // <compiled clause>`.
284
+ let validated;
285
+ try {
286
+ validated = this.checkValidSelectStatement(stmt);
287
+ }
288
+ catch (e) {
289
+ if (e instanceof SqlRuleError) {
290
+ this.errors.push(e);
291
+ }
292
+ return undefined;
293
+ }
294
+ const { query, alias, querySchema, tableRef, sourceTable } = validated;
295
+ // Create a new tools instance for this - the subquery does not have access to the outer one.
296
+ const tools = new SqlTools({
297
+ table: alias,
298
+ parameterTables: [],
299
+ valueTables: [alias],
300
+ sql: this.sql,
301
+ schema: querySchema,
302
+ supportsParameterExpressions: true,
303
+ compatibilityContext: this.options.compatibility,
304
+ parameterFunctions: STREAM_FUNCTIONS
305
+ });
306
+ tools.checkSpecificNameCase(tableRef);
307
+ if (query.columns?.length != 1) {
308
+ tools.error('This subquery must return exactly one column', query);
309
+ }
310
+ const column = tools.compileRowValueExtractor(query.columns?.[0]?.expr);
311
+ if (isClauseError(column)) {
312
+ return;
313
+ }
314
+ const where = tools.compileClause(query.where);
315
+ this.errors.push(...tools.errors);
316
+ return [new Subquery(sourceTable, column, compiledClauseToFilter(tools, query.where?._location, where)), tools];
317
+ }
318
+ checkValidSelectStatement(stmt) {
319
+ if (!isSelectStatement(stmt)) {
320
+ throw new SqlRuleError('Only SELECT statements are supported', this.sql, stmt._location);
321
+ }
322
+ if (stmt.from == null || stmt.from.length != 1 || stmt.from[0].type != 'table') {
323
+ throw new SqlRuleError('Must SELECT from a single table', this.sql, stmt);
324
+ }
325
+ this.checkUnsupportedFeatures(stmt);
326
+ const tableRef = stmt.from?.[0].name;
327
+ if (tableRef?.name == null) {
328
+ throw new SqlRuleError('Must SELECT from a single table', this.sql, stmt.from?.[0]._location);
329
+ }
330
+ const alias = tableRef.alias ?? tableRef.name;
331
+ const sourceTable = new TablePattern(tableRef.schema ?? this.options.defaultSchema, tableRef.name);
332
+ let querySchema = undefined;
333
+ const schema = this.options.schema;
334
+ if (schema) {
335
+ const tables = schema.getTables(sourceTable);
336
+ if (tables.length == 0) {
337
+ const e = new SqlRuleError(`Table ${sourceTable.schema}.${sourceTable.tablePattern} not found`, this.sql, stmt.from?.[0]?._location);
338
+ e.type = 'warning';
339
+ this.errors.push(e);
340
+ }
341
+ else {
342
+ querySchema = new TableQuerySchema(tables, alias);
343
+ }
344
+ }
345
+ return {
346
+ query: stmt,
347
+ tableRef,
348
+ alias,
349
+ querySchema,
350
+ sourceTable
351
+ };
352
+ }
353
+ }
354
+ function isScalarExpression(clause) {
355
+ return isRowValueClause(clause) || isStaticValueClause(clause) || isParameterValueClause(clause);
356
+ }
357
+ function recoverErrorClause(tools) {
358
+ // An error has already been logged.
359
+ return new EvaluateSimpleCondition(null, tools.compileClause(null));
360
+ }
361
+ function compiledClauseToFilter(tools, location, regularClause) {
362
+ if (isScalarExpression(regularClause)) {
363
+ return new EvaluateSimpleCondition(location ?? null, regularClause);
364
+ }
365
+ else if (isParameterMatchClause(regularClause)) {
366
+ return new CompareRowValueWithStreamParameter(location ?? null, regularClause);
367
+ }
368
+ else if (isClauseError(regularClause)) {
369
+ return recoverErrorClause(tools);
370
+ }
371
+ else {
372
+ throw new Error('Unknown clause type');
373
+ }
374
+ }
375
+ //# sourceMappingURL=from_sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from_sql.js","sourceRoot":"","sources":["../../src/streams/from_sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { SqlParameterFunction } from '../request_functions.js';
2
+ export declare const STREAM_FUNCTIONS: Record<string, Record<string, SqlParameterFunction>>;
@@ -0,0 +1,38 @@
1
+ import { globalRequestParameterFunctions, parameterFunctions, request_user_id } from '../request_functions.js';
2
+ export const STREAM_FUNCTIONS = {
3
+ subscription: {
4
+ ...parameterFunctions({
5
+ schema: 'subscription',
6
+ extractJsonString: function (v) {
7
+ return v.rawStreamParameters ?? '{}';
8
+ },
9
+ extractJsonParsed: function (v) {
10
+ return v.streamParameters ?? {};
11
+ },
12
+ sourceDescription: 'Unauthenticated subscription parameters as JSON',
13
+ sourceDocumentation: 'parameters passed by the client for this stream as a JSON string. These parameters are not authenticated - any value can be passed in by the client.',
14
+ usesAuthenticatedRequestParameters: false,
15
+ usesUnauthenticatedRequestParameters: true
16
+ })
17
+ },
18
+ connection: {
19
+ ...globalRequestParameterFunctions('connection')
20
+ },
21
+ auth: {
22
+ user_id: request_user_id,
23
+ ...parameterFunctions({
24
+ schema: 'auth',
25
+ extractJsonString: function (v) {
26
+ return v.rawTokenPayload;
27
+ },
28
+ extractJsonParsed: function (v) {
29
+ return v.tokenParameters;
30
+ },
31
+ sourceDescription: 'JWT payload as JSON',
32
+ sourceDocumentation: 'JWT payload as a JSON string. This is always validated against trusted keys',
33
+ usesAuthenticatedRequestParameters: true,
34
+ usesUnauthenticatedRequestParameters: false
35
+ })
36
+ }
37
+ };
38
+ //# sourceMappingURL=functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/streams/functions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,EAClB,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,CAAC,MAAM,gBAAgB,GAAyD;IACpF,YAAY,EAAE;QACZ,GAAG,kBAAkB,CAAC;YACpB,MAAM,EAAE,cAAc;YACtB,iBAAiB,EAAE,UAAU,CAAoB;gBAC/C,OAAO,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC;YACvC,CAAC;YACD,iBAAiB,EAAE,UAAU,CAAoB;gBAC/C,OAAO,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC;YAClC,CAAC;YACD,iBAAiB,EAAE,iDAAiD;YACpE,mBAAmB,EACjB,sJAAsJ;YACxJ,kCAAkC,EAAE,KAAK;YACzC,oCAAoC,EAAE,IAAI;SAC3C,CAAC;KACH;IACD,UAAU,EAAE;QACV,GAAG,+BAA+B,CAAC,YAAY,CAAC;KACjD;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,eAAe;QACxB,GAAG,kBAAkB,CAAC;YACpB,MAAM,EAAE,MAAM;YACd,iBAAiB,EAAE,UAAU,CAAoB;gBAC/C,OAAO,CAAC,CAAC,eAAe,CAAC;YAC3B,CAAC;YACD,iBAAiB,EAAE,UAAU,CAAoB;gBAC/C,OAAO,CAAC,CAAC,eAAe,CAAC;YAC3B,CAAC;YACD,iBAAiB,EAAE,qBAAqB;YACxC,mBAAmB,EAAE,6EAA6E;YAClG,kCAAkC,EAAE,IAAI;YACxC,oCAAoC,EAAE,KAAK;SAC5C,CAAC;KACH;CACF,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { ParameterLookup } from '../BucketParameterQuerier.js';
2
+ import { SourceTableInterface } from '../SourceTableInterface.js';
3
+ import { TablePattern } from '../TablePattern.js';
4
+ import { ParameterValueSet, RequestParameters, SqliteJsonValue, SqliteRow, SqliteValue, TableRow } from '../types.js';
5
+ /**
6
+ * A source of parameterization, causing data from the source table to be distributed into multiple buckets instead of
7
+ * a single one.
8
+ *
9
+ * Parameters are introduced when the select statement defining the stream has a where clause with elements where:
10
+ *
11
+ * 1. Values in the row to sync are compared against request parameters: {@link CompareRowValueWithStreamParameter}.
12
+ * 2. Values in the row to sync are compared against a subquery: {@link InOperator}.
13
+ */
14
+ export interface BucketParameter {
15
+ lookup: StaticLookup | EqualsRowInSubqueryLookup | OverlapsSubqueryLookup;
16
+ /**
17
+ * Given a row in the table the stream is selecting from, return all possible instantiations of this parameter that
18
+ * would match the row.
19
+ *
20
+ * This is used to assign rows to buckets. For instance, considering the query
21
+ * `SELECT * FROM asset WHERE owner = request.user_id()`, we would introduce a parameter. For that parameter,
22
+ * `filterRow(assetRow)` would return `assetRow.owner`.
23
+ * When a user connects, {@link StaticLookup.fromRequest} would return the user ID from the token. A matching bucket would
24
+ * then contain the oplog data for assets with the matching `owner` column.
25
+ */
26
+ filterRow(row: TableRow): SqliteJsonValue[];
27
+ }
28
+ export interface SubqueryEvaluator {
29
+ parameterTable: TablePattern;
30
+ lookupsForParameterRow(sourceTable: SourceTableInterface, row: SqliteRow): SubqueryLookups | null;
31
+ lookupsForRequest(params: RequestParameters): ParameterLookup[];
32
+ }
33
+ export interface SubqueryLookups {
34
+ lookups: ParameterLookup[];
35
+ /**
36
+ * The value that the single column in the subquery evaluated to.
37
+ */
38
+ value: SqliteJsonValue;
39
+ }
40
+ /**
41
+ * An association of rows to subscription parameters that does not depend on a subquery.
42
+ */
43
+ export interface StaticLookup {
44
+ type: 'static';
45
+ /**
46
+ * The value this lookup evaluates to for a specific request.
47
+ *
48
+ * This is typically a singleton array, e.g. the user's id in `WHERE owner_id = token.user_id()`. To desugar `IN`
49
+ * queries on parameter data, this can also return multiple values though: `WHERE owner_id IN subscription.parameters() -> 'user_ids'`.
50
+ */
51
+ fromRequest(parameters: ParameterValueSet): SqliteValue[];
52
+ }
53
+ /**
54
+ * An association of rows that is matched if a value in the source row is contained in the results of a subquery.
55
+ */
56
+ export interface EqualsRowInSubqueryLookup {
57
+ type: 'in';
58
+ subquery: SubqueryEvaluator;
59
+ }
60
+ /**
61
+ * An association of rows that is matched if a source-row value (interpreted as a JSON array) overlaps with rows
62
+ * contained in the results of a subqery.
63
+ */
64
+ export interface OverlapsSubqueryLookup {
65
+ type: 'overlap';
66
+ subquery: SubqueryEvaluator;
67
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parameter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter.js","sourceRoot":"","sources":["../../src/streams/parameter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { BaseSqlDataQuery } from '../BaseSqlDataQuery.js';
2
+ import { BucketPriority } from '../BucketDescription.js';
3
+ import { PendingQueriers } from '../BucketParameterQuerier.js';
4
+ import { BucketSource, BucketSourceType } from '../BucketSource.js';
5
+ import { ColumnDefinition } from '../ExpressionType.js';
6
+ import { SourceTableInterface } from '../SourceTableInterface.js';
7
+ import { GetQuerierOptions } from '../SqlSyncRules.js';
8
+ import { TablePattern } from '../TablePattern.js';
9
+ import { EvaluatedParametersResult, EvaluateRowOptions, EvaluationResult, SourceSchema, SqliteRow } from '../types.js';
10
+ import { StreamVariant } from './variant.js';
11
+ export declare class SyncStream implements BucketSource {
12
+ name: string;
13
+ subscribedToByDefault: boolean;
14
+ priority: BucketPriority;
15
+ variants: StreamVariant[];
16
+ data: BaseSqlDataQuery;
17
+ constructor(name: string, data: BaseSqlDataQuery);
18
+ get type(): BucketSourceType;
19
+ pushBucketParameterQueriers(result: PendingQueriers, options: GetQuerierOptions): void;
20
+ private queriersForSubscription;
21
+ hasDynamicBucketQueries(): boolean;
22
+ tableSyncsData(table: SourceTableInterface): boolean;
23
+ tableSyncsParameters(table: SourceTableInterface): boolean;
24
+ getSourceTables(): Set<TablePattern>;
25
+ resolveResultSets(schema: SourceSchema, tables: Record<string, Record<string, ColumnDefinition>>): void;
26
+ debugRepresentation(): {
27
+ name: string;
28
+ type: string;
29
+ variants: any[];
30
+ data: {
31
+ table: TablePattern;
32
+ columns: string[];
33
+ };
34
+ };
35
+ debugWriteOutputTables(result: Record<string, {
36
+ query: string;
37
+ }[]>): void;
38
+ evaluateParameterRow(sourceTable: SourceTableInterface, row: SqliteRow): EvaluatedParametersResult[];
39
+ evaluateRow(options: EvaluateRowOptions): EvaluationResult[];
40
+ }