@@ -15,6 +15,7 @@ import type {JsonNode, JsonNodeView} from '../nodes/types';
1515import type { Printable } from 'tree-dump/lib/types' ;
1616import type { NodeBuilder } from '../../json-crdt-patch' ;
1717import type { NodeApi } from './api/nodes' ;
18+ import { Extension } from '../extensions/Extension' ;
1819
1920export const UNDEFINED = new ConNode ( ORIGIN , undefined ) ;
2021
@@ -147,17 +148,21 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
147148 * session ID generated by {@link Model.sid}.
148149 * @returns A strictly typed model.
149150 */
150- public static readonly create = < S extends NodeBuilder > (
151+ public static readonly create = < S extends NodeBuilder , E extends Extension < any , any , any , any , any , any > [ ] > (
151152 schema ?: S ,
152153 sidOrClock : clock . ClockVector | number = Model . sid ( ) ,
153- ) : Model < SchemaToJsonNode < S > > => {
154+ options ?: { extensions ?: E } ,
155+ ) : Model < SchemaToJsonNode < S , E > > => {
154156 const cl =
155157 typeof sidOrClock === 'number'
156158 ? sidOrClock === SESSION . SERVER
157159 ? new clock . ServerClockVector ( SESSION . SERVER , 1 )
158160 : new clock . ClockVector ( sidOrClock , 1 )
159161 : sidOrClock ;
160- const model = new Model < SchemaToJsonNode < S > > ( cl ) ;
162+ const model = new Model < SchemaToJsonNode < S , E > > ( cl ) ;
163+ for ( const extension of options ?. extensions ?? [ ] ) {
164+ model . ext . register ( extension ) ;
165+ }
161166 if ( schema ) model . setSchema ( schema , true ) ;
162167 return model ;
163168 } ;
@@ -186,12 +191,16 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
186191 * @param sid Session ID to set for the model.
187192 * @returns An instance of a model.
188193 */
189- public static readonly load = < S extends NodeBuilder > (
194+ public static readonly load = < S extends NodeBuilder , E extends Extension < any , any , any , any , any , any > [ ] > (
190195 data : Uint8Array ,
191196 sid ?: number ,
192197 schema ?: S ,
193- ) : Model < SchemaToJsonNode < S > > => {
194- const model = decoder . decode ( data ) as unknown as Model < SchemaToJsonNode < S > > ;
198+ options ?: { extensions ?: E } ,
199+ ) : Model < SchemaToJsonNode < S , E > > => {
200+ const model = decoder . decode ( data ) as unknown as Model < SchemaToJsonNode < S , E > > ;
201+ for ( const extension of options ?. extensions ?? [ ] ) {
202+ model . ext . register ( extension ) ;
203+ }
195204 if ( schema ) model . setSchema ( schema , true ) ;
196205 if ( typeof sid === 'number' ) model . setSid ( sid ) ;
197206 return model ;
@@ -537,7 +546,7 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
537546 * session.
538547 * @returns Strictly typed model.
539548 */
540- public setSchema < S extends NodeBuilder > ( schema : S , useGlobalSession : boolean = true ) : Model < SchemaToJsonNode < S > > {
549+ public setSchema < S extends NodeBuilder > ( schema : S , useGlobalSession : boolean = true ) : Model < SchemaToJsonNode < S , [ ] > > {
541550 const c = this . clock ;
542551 const isNewDocument = c . time === 1 ;
543552 if ( isNewDocument ) {
0 commit comments