@routier/core 0.0.1-alpha.2 → 0.0.1-alpha.3

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.
@@ -40,6 +40,8 @@ export type DbPluginEvent = {
40
40
  schemas: SchemaCollection;
41
41
  /** Unique id of the event. */
42
42
  id: string;
43
+ /** Source of the request */
44
+ source: "data-store" | "collection" | "view";
43
45
  };
44
46
  /**
45
47
  * Event for a specific plugin operation, extending the base event with an operation payload.
@@ -0,0 +1,11 @@
1
+ import { ISchemaSubscription, SchemaId, SubscriptionChanges } from "../types";
2
+ export declare class SchemaSubscription<T extends {}> implements ISchemaSubscription<T> {
3
+ private readonly id;
4
+ private readonly schemaId;
5
+ private readonly createdAt;
6
+ constructor(schemaId: SchemaId, signal?: AbortSignal);
7
+ send(changes: SubscriptionChanges<T>): void;
8
+ onMessage(callback: (changes: SubscriptionChanges<T>) => void): void;
9
+ dispose(): void;
10
+ [Symbol.dispose](): void;
11
+ }
@@ -2601,6 +2601,39 @@ class SchemaError extends Error {
2601
2601
  }
2602
2602
 
2603
2603
 
2604
+ }),
2605
+ "./src/performance/index.ts":
2606
+ /*!**********************************!*\
2607
+ !*** ./src/performance/index.ts ***!
2608
+ \**********************************/
2609
+ (function (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2610
+ __webpack_require__.r(__webpack_exports__);
2611
+ __webpack_require__.d(__webpack_exports__, {
2612
+ measure: () => (measure),
2613
+ now: () => (now)
2614
+ });
2615
+ const measurements = {};
2616
+ const now = () => {
2617
+ if (typeof performance !== 'undefined' && performance.now) {
2618
+ // Browser or modern Node.js
2619
+ return performance.now();
2620
+ }
2621
+ // Fallback for older environments
2622
+ return Date.now();
2623
+ };
2624
+ const measure = {
2625
+ start: (name) => {
2626
+ measurements[name] = now();
2627
+ },
2628
+ end: (name) => {
2629
+ const start = measurements[name];
2630
+ delete measurements[name];
2631
+ const delta = now() - start;
2632
+ console.log(`[ROUTIER] - Performance: ${name} took ${delta}`);
2633
+ }
2634
+ };
2635
+
2636
+
2604
2637
  }),
2605
2638
  "./src/schema/PropertyInfo.ts":
2606
2639
  /*!************************************!*\
@@ -2942,28 +2975,28 @@ __webpack_require__.r(__webpack_exports__);
2942
2975
  __webpack_require__.d(__webpack_exports__, {
2943
2976
  SchemaDefinition: () => (SchemaDefinition)
2944
2977
  });
2945
- /* ESM import */var _table_SchemaFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./table/SchemaFunction */ "./src/schema/table/SchemaFunction.ts");
2946
- /* ESM import */var _table_SchemaComputed__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./table/SchemaComputed */ "./src/schema/table/SchemaComputed.ts");
2947
- /* ESM import */var _property_base_SchemaBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./property/base/SchemaBase */ "./src/schema/property/base/SchemaBase.ts");
2948
- /* ESM import */var _PropertyInfo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PropertyInfo */ "./src/schema/PropertyInfo.ts");
2949
- /* ESM import */var _codegen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../codegen */ "./src/codegen/blocks.ts");
2950
- /* ESM import */var _codegen_handlers_EnrichmentHandlerBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../codegen/handlers/EnrichmentHandlerBuilder */ "./src/codegen/handlers/EnrichmentHandlerBuilder.ts");
2951
- /* ESM import */var _codegen_handlers_MergeHandlerBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../codegen/handlers/MergeHandlerBuilder */ "./src/codegen/handlers/MergeHandlerBuilder.ts");
2952
- /* ESM import */var _codegen_handlers_PrepareHandlerBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../codegen/handlers/PrepareHandlerBuilder */ "./src/codegen/handlers/PrepareHandlerBuilder.ts");
2953
- /* ESM import */var _codegen_handlers_StripHandlerBuilder__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../codegen/handlers/StripHandlerBuilder */ "./src/codegen/handlers/StripHandlerBuilder.ts");
2954
- /* ESM import */var _codegen_handlers_CloneHandlerBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../codegen/handlers/CloneHandlerBuilder */ "./src/codegen/handlers/CloneHandlerBuilder.ts");
2955
- /* ESM import */var _codegen_handlers_CompareHandlerBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../codegen/handlers/CompareHandlerBuilder */ "./src/codegen/handlers/CompareHandlerBuilder.ts");
2956
- /* ESM import */var _codegen_handlers_DeserializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../codegen/handlers/DeserializeHandlerBuilder */ "./src/codegen/handlers/DeserializeHandlerBuilder.ts");
2957
- /* ESM import */var _codegen_handlers_HashTypeHandlerBuilder__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../codegen/handlers/HashTypeHandlerBuilder */ "./src/codegen/handlers/HashTypeHandlerBuilder.ts");
2958
- /* ESM import */var _codegen_handlers_IdSelectorHandlerBuilder__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../codegen/handlers/IdSelectorHandlerBuilder */ "./src/codegen/handlers/IdSelectorHandlerBuilder.ts");
2959
- /* ESM import */var _codegen_handlers_HashHandlerBuilder__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../codegen/handlers/HashHandlerBuilder */ "./src/codegen/handlers/HashHandlerBuilder.ts");
2960
- /* ESM import */var _codegen_handlers_EnableChangeTrackingHandlerBuilder__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../codegen/handlers/EnableChangeTrackingHandlerBuilder */ "./src/codegen/handlers/EnableChangeTrackingHandlerBuilder.ts");
2961
- /* ESM import */var _codegen_handlers_FreezeHandlerBuilder__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../codegen/handlers/FreezeHandlerBuilder */ "./src/codegen/handlers/FreezeHandlerBuilder.ts");
2978
+ /* ESM import */var _table_SchemaFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./table/SchemaFunction */ "./src/schema/table/SchemaFunction.ts");
2979
+ /* ESM import */var _table_SchemaComputed__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./table/SchemaComputed */ "./src/schema/table/SchemaComputed.ts");
2980
+ /* ESM import */var _property_base_SchemaBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./property/base/SchemaBase */ "./src/schema/property/base/SchemaBase.ts");
2981
+ /* ESM import */var _PropertyInfo__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PropertyInfo */ "./src/schema/PropertyInfo.ts");
2982
+ /* ESM import */var _codegen__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../codegen */ "./src/codegen/blocks.ts");
2983
+ /* ESM import */var _codegen_handlers_EnrichmentHandlerBuilder__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../codegen/handlers/EnrichmentHandlerBuilder */ "./src/codegen/handlers/EnrichmentHandlerBuilder.ts");
2984
+ /* ESM import */var _codegen_handlers_MergeHandlerBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../codegen/handlers/MergeHandlerBuilder */ "./src/codegen/handlers/MergeHandlerBuilder.ts");
2985
+ /* ESM import */var _codegen_handlers_PrepareHandlerBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../codegen/handlers/PrepareHandlerBuilder */ "./src/codegen/handlers/PrepareHandlerBuilder.ts");
2986
+ /* ESM import */var _codegen_handlers_StripHandlerBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../codegen/handlers/StripHandlerBuilder */ "./src/codegen/handlers/StripHandlerBuilder.ts");
2987
+ /* ESM import */var _codegen_handlers_CloneHandlerBuilder__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../codegen/handlers/CloneHandlerBuilder */ "./src/codegen/handlers/CloneHandlerBuilder.ts");
2988
+ /* ESM import */var _codegen_handlers_CompareHandlerBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../codegen/handlers/CompareHandlerBuilder */ "./src/codegen/handlers/CompareHandlerBuilder.ts");
2989
+ /* ESM import */var _codegen_handlers_DeserializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../codegen/handlers/DeserializeHandlerBuilder */ "./src/codegen/handlers/DeserializeHandlerBuilder.ts");
2990
+ /* ESM import */var _codegen_handlers_HashTypeHandlerBuilder__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../codegen/handlers/HashTypeHandlerBuilder */ "./src/codegen/handlers/HashTypeHandlerBuilder.ts");
2991
+ /* ESM import */var _codegen_handlers_IdSelectorHandlerBuilder__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../codegen/handlers/IdSelectorHandlerBuilder */ "./src/codegen/handlers/IdSelectorHandlerBuilder.ts");
2992
+ /* ESM import */var _codegen_handlers_HashHandlerBuilder__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../codegen/handlers/HashHandlerBuilder */ "./src/codegen/handlers/HashHandlerBuilder.ts");
2993
+ /* ESM import */var _codegen_handlers_EnableChangeTrackingHandlerBuilder__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../codegen/handlers/EnableChangeTrackingHandlerBuilder */ "./src/codegen/handlers/EnableChangeTrackingHandlerBuilder.ts");
2994
+ /* ESM import */var _codegen_handlers_FreezeHandlerBuilder__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../codegen/handlers/FreezeHandlerBuilder */ "./src/codegen/handlers/FreezeHandlerBuilder.ts");
2962
2995
  /* ESM import */var _errors_SchemaError__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../errors/SchemaError */ "./src/errors/SchemaError.ts");
2963
- /* ESM import */var _codegen_handlers_SerializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../codegen/handlers/SerializeHandlerBuilder */ "./src/codegen/handlers/SerializeHandlerBuilder.ts");
2964
- /* ESM import */var _utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities */ "./src/utilities/uuid.ts");
2965
- /* ESM import */var _utilities__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../utilities */ "./src/utilities/strings.ts");
2966
- /* ESM import */var _types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./types */ "./src/schema/types.ts");
2996
+ /* ESM import */var _codegen_handlers_SerializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../codegen/handlers/SerializeHandlerBuilder */ "./src/codegen/handlers/SerializeHandlerBuilder.ts");
2997
+ /* ESM import */var _utilities__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../utilities */ "./src/utilities/strings.ts");
2998
+ /* ESM import */var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types */ "./src/schema/types.ts");
2999
+ /* ESM import */var _communication_broadcast__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./communication/broadcast */ "./src/schema/communication/broadcast.ts");
2967
3000
 
2968
3001
 
2969
3002
 
@@ -2985,54 +3018,10 @@ __webpack_require__.d(__webpack_exports__, {
2985
3018
 
2986
3019
 
2987
3020
 
2988
- // This is intented to run the "OnMessage" event whenever we "send". For context
2989
- // when we make a change, we query to see if we have any changes. We need to run a fetch because we could have
2990
- // many db sets
2991
- class CollectionSubscription {
2992
- _channel;
2993
- _id = (0,_utilities__WEBPACK_IMPORTED_MODULE_0__.uuid)();
2994
- _callback = null;
2995
- constructor(id, signal) {
2996
- // The id is the computed id from the collection. We need a static id so we can communicate across different
2997
- // instances of a data store
2998
- this._channel = new BroadcastChannel(`__routier-unidirectional-subscription-channel-${id}`);
2999
- this._channel.onmessage = (event) => {
3000
- const message = event.data;
3001
- if (message.id === this._id) {
3002
- return;
3003
- }
3004
- if (this._callback != null) {
3005
- this._callback(message.changes);
3006
- }
3007
- };
3008
- if (signal) {
3009
- signal.addEventListener("abort", () => {
3010
- this[Symbol.dispose]();
3011
- }, { once: true });
3012
- }
3013
- }
3014
- send(changes) {
3015
- const message = {
3016
- id: this._id,
3017
- changes
3018
- };
3019
- this._channel.postMessage(message);
3020
- }
3021
- onMessage(callback) {
3022
- this._callback = callback;
3023
- }
3024
- dispose() {
3025
- this[Symbol.dispose]();
3026
- }
3027
- [Symbol.dispose]() {
3028
- this._channel.onmessage = null;
3029
- this._channel.close();
3030
- this._channel = null;
3031
- }
3032
- }
3033
- class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODULE_1__.SchemaBase {
3021
+
3022
+ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODULE_0__.SchemaBase {
3034
3023
  instance;
3035
- type = _types__WEBPACK_IMPORTED_MODULE_2__.SchemaTypes.Definition;
3024
+ type = _types__WEBPACK_IMPORTED_MODULE_1__.SchemaTypes.Definition;
3036
3025
  collectionName;
3037
3026
  constructor(collectionName, schema) {
3038
3027
  super();
@@ -3043,8 +3032,8 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3043
3032
  }
3044
3033
  modify(builder) {
3045
3034
  const b = {
3046
- function: (fn, injected) => new _table_SchemaFunction__WEBPACK_IMPORTED_MODULE_3__.SchemaFunction(fn, injected),
3047
- computed: (fn, injected) => new _table_SchemaComputed__WEBPACK_IMPORTED_MODULE_4__.SchemaComputed(fn, injected)
3035
+ function: (fn, injected) => new _table_SchemaFunction__WEBPACK_IMPORTED_MODULE_2__.SchemaFunction(fn, injected),
3036
+ computed: (fn, injected) => new _table_SchemaComputed__WEBPACK_IMPORTED_MODULE_3__.SchemaComputed(fn, injected)
3048
3037
  };
3049
3038
  const r = builder(b);
3050
3039
  return new SchemaDefinition(this.collectionName, { ...this.instance, ...r });
@@ -3056,7 +3045,7 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3056
3045
  const properties = [];
3057
3046
  for (let i = 0; i < explore.length; i++) {
3058
3047
  const item = explore[i];
3059
- if (item.instance.type === _types__WEBPACK_IMPORTED_MODULE_2__.SchemaTypes.Definition) {
3048
+ if (item.instance.type === _types__WEBPACK_IMPORTED_MODULE_1__.SchemaTypes.Definition) {
3060
3049
  explore.push({
3061
3050
  path: null,
3062
3051
  instance: item.instance.instance,
@@ -3071,8 +3060,8 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3071
3060
  const previousParent = item.parents.length === 0
3072
3061
  ? null
3073
3062
  : item.parents[item.parents.length - 1].propertyInfo;
3074
- if (propertyInstance.type === _types__WEBPACK_IMPORTED_MODULE_2__.SchemaTypes.Object) {
3075
- const propertyInfo = new _PropertyInfo__WEBPACK_IMPORTED_MODULE_5__.PropertyInfo(propertyInstance, key, previousParent);
3063
+ if (propertyInstance.type === _types__WEBPACK_IMPORTED_MODULE_1__.SchemaTypes.Object) {
3064
+ const propertyInfo = new _PropertyInfo__WEBPACK_IMPORTED_MODULE_4__.PropertyInfo(propertyInstance, key, previousParent);
3076
3065
  explore.push({
3077
3066
  path: [item.path, key].filter((w) => w != null).join("."),
3078
3067
  instance: propertyInstance.instance,
@@ -3089,7 +3078,7 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3089
3078
  previousParent.children.push(propertyInfo);
3090
3079
  continue;
3091
3080
  }
3092
- const childPrimitivePropertyInfo = new _PropertyInfo__WEBPACK_IMPORTED_MODULE_5__.PropertyInfo(item.instance[key], key, previousParent);
3081
+ const childPrimitivePropertyInfo = new _PropertyInfo__WEBPACK_IMPORTED_MODULE_4__.PropertyInfo(item.instance[key], key, previousParent);
3093
3082
  if (previousParent === null) {
3094
3083
  properties.push(childPrimitivePropertyInfo);
3095
3084
  continue;
@@ -3179,19 +3168,19 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3179
3168
  const schema = this;
3180
3169
  const properties = [];
3181
3170
  const propertyMap = new Map();
3182
- const enrichmentHandlerBuilder = new _codegen_handlers_EnrichmentHandlerBuilder__WEBPACK_IMPORTED_MODULE_6__.EnrichmentHandlerBuilder();
3183
- const mergeHandlerFactory = new _codegen_handlers_MergeHandlerBuilder__WEBPACK_IMPORTED_MODULE_7__.MergeHandlerBuilder();
3184
- const prepareHandlerBuilder = new _codegen_handlers_PrepareHandlerBuilder__WEBPACK_IMPORTED_MODULE_8__.PrepareHandlerBuilder();
3185
- const stripHandlerBuilder = new _codegen_handlers_StripHandlerBuilder__WEBPACK_IMPORTED_MODULE_9__.StripHandlerBuilder();
3186
- const cloneHandlerBuilder = new _codegen_handlers_CloneHandlerBuilder__WEBPACK_IMPORTED_MODULE_10__.CloneHandlerBuilder();
3187
- const compareHandlerBuilder = new _codegen_handlers_CompareHandlerBuilder__WEBPACK_IMPORTED_MODULE_11__.CompareHandlerBuilder();
3188
- const deserializeHandlerBuilder = new _codegen_handlers_DeserializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_12__.DeserializeHandlerBuilder();
3189
- const hashTypeHandlerBuilder = new _codegen_handlers_HashTypeHandlerBuilder__WEBPACK_IMPORTED_MODULE_13__.HashTypeHandlerBuilder();
3190
- const idSelectorHandlerBuilder = new _codegen_handlers_IdSelectorHandlerBuilder__WEBPACK_IMPORTED_MODULE_14__.IdSelectorHandlerBuilder();
3191
- const hashHandlerBuilder = new _codegen_handlers_HashHandlerBuilder__WEBPACK_IMPORTED_MODULE_15__.HashHandlerBuilder();
3192
- const enableChangeTrackingHandlerBuilder = new _codegen_handlers_EnableChangeTrackingHandlerBuilder__WEBPACK_IMPORTED_MODULE_16__.EnableChangeTrackingHandlerBuilder();
3193
- const freezeHandlerBuilder = new _codegen_handlers_FreezeHandlerBuilder__WEBPACK_IMPORTED_MODULE_17__.FreezeHandlerBuilder();
3194
- const serializeHandlerBuilder = new _codegen_handlers_SerializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_18__.SerializeHandlerBuilder();
3171
+ const enrichmentHandlerBuilder = new _codegen_handlers_EnrichmentHandlerBuilder__WEBPACK_IMPORTED_MODULE_5__.EnrichmentHandlerBuilder();
3172
+ const mergeHandlerFactory = new _codegen_handlers_MergeHandlerBuilder__WEBPACK_IMPORTED_MODULE_6__.MergeHandlerBuilder();
3173
+ const prepareHandlerBuilder = new _codegen_handlers_PrepareHandlerBuilder__WEBPACK_IMPORTED_MODULE_7__.PrepareHandlerBuilder();
3174
+ const stripHandlerBuilder = new _codegen_handlers_StripHandlerBuilder__WEBPACK_IMPORTED_MODULE_8__.StripHandlerBuilder();
3175
+ const cloneHandlerBuilder = new _codegen_handlers_CloneHandlerBuilder__WEBPACK_IMPORTED_MODULE_9__.CloneHandlerBuilder();
3176
+ const compareHandlerBuilder = new _codegen_handlers_CompareHandlerBuilder__WEBPACK_IMPORTED_MODULE_10__.CompareHandlerBuilder();
3177
+ const deserializeHandlerBuilder = new _codegen_handlers_DeserializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_11__.DeserializeHandlerBuilder();
3178
+ const hashTypeHandlerBuilder = new _codegen_handlers_HashTypeHandlerBuilder__WEBPACK_IMPORTED_MODULE_12__.HashTypeHandlerBuilder();
3179
+ const idSelectorHandlerBuilder = new _codegen_handlers_IdSelectorHandlerBuilder__WEBPACK_IMPORTED_MODULE_13__.IdSelectorHandlerBuilder();
3180
+ const hashHandlerBuilder = new _codegen_handlers_HashHandlerBuilder__WEBPACK_IMPORTED_MODULE_14__.HashHandlerBuilder();
3181
+ const enableChangeTrackingHandlerBuilder = new _codegen_handlers_EnableChangeTrackingHandlerBuilder__WEBPACK_IMPORTED_MODULE_15__.EnableChangeTrackingHandlerBuilder();
3182
+ const freezeHandlerBuilder = new _codegen_handlers_FreezeHandlerBuilder__WEBPACK_IMPORTED_MODULE_16__.FreezeHandlerBuilder();
3183
+ const serializeHandlerBuilder = new _codegen_handlers_SerializeHandlerBuilder__WEBPACK_IMPORTED_MODULE_17__.SerializeHandlerBuilder();
3195
3184
  const enricher = enrichmentHandlerBuilder.build();
3196
3185
  const merge = mergeHandlerFactory.build();
3197
3186
  const prepare = prepareHandlerBuilder.build();
@@ -3205,15 +3194,15 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3205
3194
  const enableChangeTrackingHandler = enableChangeTrackingHandlerBuilder.build();
3206
3195
  const freezeHandler = freezeHandlerBuilder.build();
3207
3196
  const serializeHandler = serializeHandlerBuilder.build();
3208
- const changeTrackingCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3197
+ const changeTrackingCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3209
3198
  changeTrackingCodeBuilder.raw(`function ${this.createChangeTracker.toString()}`);
3210
3199
  changeTrackingCodeBuilder.slot("declarations").variable("enableChangeTracking").value('createChangeTracker()');
3211
3200
  changeTrackingCodeBuilder.slot("assignment");
3212
3201
  changeTrackingCodeBuilder.slot("return").raw('\treturn enableChangeTracking(entity);');
3213
- const freezeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3202
+ const freezeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3214
3203
  freezeCodeBuilder.slot("assignment");
3215
3204
  freezeCodeBuilder.slot("return").raw('\treturn Object.freeze(entity);');
3216
- const enricherCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3205
+ const enricherCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3217
3206
  const enricherFunctionRoot = enricherCodeBuilder.factory("factory", { name: "factory" }).parameters({ name: "collectionName", value: this.collectionName });
3218
3207
  const enricherFunctionBody = enricherFunctionRoot.function(undefined, { name: "function" }).parameters("entity", "changeTrackingType").return();
3219
3208
  enricherFunctionBody.raw(`function ${this.createChangeTracker.toString()}`);
@@ -3224,7 +3213,7 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3224
3213
  enricherFunctionBody.slot("ifs");
3225
3214
  enricherFunctionBody.slot("tracking").if('changeTrackingType === "immutable"', { name: "freeze" });
3226
3215
  enricherFunctionBody.raw('\treturn enableChangeTracking(enriched);');
3227
- const mergeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3216
+ const mergeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3228
3217
  const mergeFunctionRoot = mergeCodeBuilder.factory("factory", { name: "factory" }).parameters({ name: "collectionName", value: this.collectionName });
3229
3218
  const mergeFunctionBody = mergeFunctionRoot.function(undefined, { name: "function" }).parameters("destination", "source").return();
3230
3219
  const pauseFunctionBody = mergeFunctionBody.function("pause")
@@ -3243,34 +3232,34 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3243
3232
  unpause();
3244
3233
 
3245
3234
  return destination;`);
3246
- const prepareCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3235
+ const prepareCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3247
3236
  prepareCodeBuilder.slot("result");
3248
3237
  prepareCodeBuilder.slot("assignments");
3249
3238
  prepareCodeBuilder.slot("return").raw(` return result;`);
3250
- const stripCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3239
+ const stripCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3251
3240
  stripCodeBuilder.slot("result");
3252
3241
  stripCodeBuilder.slot("return").raw(` return result;`);
3253
- const cloneCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3242
+ const cloneCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3254
3243
  cloneCodeBuilder.slot("result");
3255
3244
  cloneCodeBuilder.slot("return").raw(` return result;`);
3256
- const compareCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3245
+ const compareCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3257
3246
  compareCodeBuilder.slot("result");
3258
3247
  compareCodeBuilder.slot("return").raw(` return result;`);
3259
- const deserializeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3248
+ const deserializeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3260
3249
  deserializeCodeBuilder.slot("result");
3261
3250
  deserializeCodeBuilder.slot("if");
3262
3251
  deserializeCodeBuilder.slot("return").raw(` return result;`);
3263
- const serializeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3252
+ const serializeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3264
3253
  serializeCodeBuilder.slot("result");
3265
3254
  serializeCodeBuilder.slot("if");
3266
3255
  serializeCodeBuilder.slot("return").raw(` return result;`);
3267
- const idSelectorCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3256
+ const idSelectorCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3268
3257
  idSelectorCodeBuilder.slot("result");
3269
3258
  idSelectorCodeBuilder.slot("return").raw(` return result;`);
3270
- const hashTypeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3259
+ const hashTypeCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3271
3260
  hashTypeCodeBuilder.slot("ifs");
3272
3261
  hashTypeCodeBuilder.slot("return").raw(` return "Ids";`);
3273
- const hashCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_19__.CodeBuilder();
3262
+ const hashCodeBuilder = new _codegen__WEBPACK_IMPORTED_MODULE_18__.CodeBuilder();
3274
3263
  hashCodeBuilder.slot("functions").raw(`
3275
3264
  function stringifyDate(d) {
3276
3265
 
@@ -3296,7 +3285,7 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3296
3285
  hashCodeBuilder.raw(` return result;`);
3297
3286
  const idProperties = [];
3298
3287
  const allPropertyNamesAndPaths = [];
3299
- let hashType = _types__WEBPACK_IMPORTED_MODULE_2__.HashType.Ids;
3288
+ let hashType = _types__WEBPACK_IMPORTED_MODULE_1__.HashType.Ids;
3300
3289
  let hasIdentities = false;
3301
3290
  let hasIdentityKeys = false;
3302
3291
  this._iterate(schema, (property) => {
@@ -3352,12 +3341,12 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3352
3341
  const idPropertyNames = idProperties.map(w => w.name);
3353
3342
  const getId = (entity) => {
3354
3343
  if (idPropertyNames.length > 1) {
3355
- return hashFunction(entity, _types__WEBPACK_IMPORTED_MODULE_2__.HashType.Ids);
3344
+ return hashFunction(entity, _types__WEBPACK_IMPORTED_MODULE_1__.HashType.Ids);
3356
3345
  }
3357
3346
  return getIdsFunction(entity)[0];
3358
3347
  };
3359
3348
  const getProperty = (id) => propertyMap.get(id);
3360
- const id = (0,_utilities__WEBPACK_IMPORTED_MODULE_20__.hash)([...allPropertyNamesAndPaths, this.collectionName].join(","));
3349
+ const id = (0,_utilities__WEBPACK_IMPORTED_MODULE_19__.hash)([...allPropertyNamesAndPaths, this.collectionName].join(","));
3361
3350
  const paths = new Set(properties.map(x => x.getAssignmentPath()));
3362
3351
  // memoize this by the validProperties
3363
3352
  // TODO: See if we can generate a function to do this and eliminate loops
@@ -3374,7 +3363,7 @@ class SchemaDefinition extends _property_base_SchemaBase__WEBPACK_IMPORTED_MODUL
3374
3363
  return item;
3375
3364
  };
3376
3365
  return {
3377
- createSubscription: (signal) => new CollectionSubscription(id, signal),
3366
+ createSubscription: (signal) => new _communication_broadcast__WEBPACK_IMPORTED_MODULE_20__.SchemaSubscription(id, signal),
3378
3367
  getId,
3379
3368
  getProperty,
3380
3369
  properties,
@@ -3493,6 +3482,124 @@ const s = {
3493
3482
  };
3494
3483
 
3495
3484
 
3485
+ }),
3486
+ "./src/schema/communication/broadcast.ts":
3487
+ /*!***********************************************!*\
3488
+ !*** ./src/schema/communication/broadcast.ts ***!
3489
+ \***********************************************/
3490
+ (function (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3491
+ __webpack_require__.r(__webpack_exports__);
3492
+ __webpack_require__.d(__webpack_exports__, {
3493
+ SchemaSubscription: () => (SchemaSubscription)
3494
+ });
3495
+ /* ESM import */var _performance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../performance */ "./src/performance/index.ts");
3496
+ /* ESM import */var _utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utilities */ "./src/utilities/uuid.ts");
3497
+
3498
+
3499
+ const registry = {};
3500
+ const getChannelRegistry = (schemaId) => {
3501
+ if (registry[schemaId]) {
3502
+ return registry[schemaId];
3503
+ }
3504
+ const channel = new SchemaChannel(schemaId);
3505
+ registry[schemaId] = channel;
3506
+ return channel;
3507
+ };
3508
+ // Must have a sender and receiver. Sender cannot listen for it's own message
3509
+ class SchemaChannel {
3510
+ sender;
3511
+ receiver;
3512
+ constructor(schemaId) {
3513
+ this.sender = new SchemaChannelSender(schemaId);
3514
+ this.receiver = new SchemaChannelReceiver(schemaId);
3515
+ }
3516
+ }
3517
+ class SchemaChannelSender {
3518
+ broadcastChannel;
3519
+ constructor(schemaId) {
3520
+ this.broadcastChannel = new BroadcastChannel(`__routier-schema-subscription-channel:${schemaId}`);
3521
+ }
3522
+ send(changes) {
3523
+ this.broadcastChannel.postMessage(changes);
3524
+ }
3525
+ }
3526
+ class SchemaChannelReceiver {
3527
+ broadcastChannel;
3528
+ subscriptions = [];
3529
+ constructor(schemaId) {
3530
+ this.broadcastChannel = new BroadcastChannel(`__routier-schema-subscription-channel:${schemaId}`);
3531
+ this.broadcastChannel.onmessage = (e) => {
3532
+ // We can't send to the same instance it is not possbile
3533
+ const stampedChanges = e.data;
3534
+ for (let i = 0, length = this.subscriptions.length; i < length; i++) {
3535
+ const subscription = this.subscriptions[i];
3536
+ subscription.action(stampedChanges);
3537
+ }
3538
+ };
3539
+ }
3540
+ addListener(id, listener) {
3541
+ this.subscriptions.push(new SubscriptionListener(id, listener));
3542
+ }
3543
+ removeListeners(id) {
3544
+ this.subscriptions = this.subscriptions.filter(w => w.id !== id);
3545
+ }
3546
+ }
3547
+ class SubscriptionListener {
3548
+ id;
3549
+ listener;
3550
+ constructor(id, listener) {
3551
+ this.id = id;
3552
+ this.listener = listener;
3553
+ }
3554
+ action(changes) {
3555
+ this.listener(changes);
3556
+ }
3557
+ }
3558
+ class SchemaSubscription {
3559
+ id;
3560
+ schemaId;
3561
+ createdAt;
3562
+ constructor(schemaId, signal) {
3563
+ this.createdAt = (0,_performance__WEBPACK_IMPORTED_MODULE_0__.now)();
3564
+ this.id = (0,_utilities__WEBPACK_IMPORTED_MODULE_1__.uuid)(8);
3565
+ this.schemaId = schemaId;
3566
+ signal?.addEventListener("abort", () => {
3567
+ this.dispose();
3568
+ }, { once: true });
3569
+ }
3570
+ send(changes) {
3571
+ const regisry = getChannelRegistry(this.schemaId);
3572
+ // Send message to all listeners.
3573
+ // Since we create a new listener when we do onMessage,
3574
+ // we don't need to worry about sending to ourselves, it
3575
+ // can't happen
3576
+ regisry.sender.send({
3577
+ data: changes,
3578
+ timestamp: (0,_performance__WEBPACK_IMPORTED_MODULE_0__.now)()
3579
+ });
3580
+ }
3581
+ onMessage(callback) {
3582
+ const regisry = getChannelRegistry(this.schemaId);
3583
+ // Link the callback to an instance
3584
+ regisry.receiver.addListener(this.id, ({ data, timestamp }) => {
3585
+ if (timestamp < this.createdAt) {
3586
+ // Sent before the receiver was even created
3587
+ return;
3588
+ }
3589
+ callback(data);
3590
+ });
3591
+ }
3592
+ dispose() {
3593
+ this[Symbol.dispose]();
3594
+ }
3595
+ [Symbol.dispose]() {
3596
+ const regisry = getChannelRegistry(this.schemaId);
3597
+ // Remove listeners for this instance only
3598
+ regisry.receiver.removeListeners(this.id);
3599
+ }
3600
+ }
3601
+
3602
+
3496
3603
  }),
3497
3604
  "./src/schema/property/base/SchemaBase.ts":
3498
3605
  /*!************************************************!*\