Merge remote-tracking branch 'origin/feat/orm-diffs' into feat/orm-diffs

feat/orm-diffs
Niko PLP 15 hours ago
commit 479b29c153
  1. 2
      sdk/js/examples/multi-framework-signals/src/app/pages/index.astro
  2. 27
      sdk/js/signals/src/connector/initNg.ts
  3. 46
      sdk/js/signals/src/connector/ormConnectionHandler.ts
  4. 8
      sdk/js/web/src/index.ts

@ -27,7 +27,7 @@ const title = "Multi-framework app";
console.log(await ng.locales()); console.log(await ng.locales());
let info = await ng.client_info(); let info = await ng.client_info();
console.log(info.V0.details); console.log(info.V0.details);
initNg(ng); initNg(ng, event.session);
}, },
true, true,
[] []

@ -1,15 +1,20 @@
import * as NG from "@ng-org/lib-wasm"; import * as NG from "@ng-org/lib-wasm";
export let ng: typeof NG; type Session = {
session_id: unknown;
export function initNg( protected_store_id: unknown;
ngImpl: typeof NG, private_store_id: unknown;
session: { public_store_id: unknown;
session_id: unknown; };
protected_store_id: unknown;
private_store_id: unknown; let resolveNgSession: (value: { ng: typeof NG; session: Session }) => void;
public_store_id: unknown;
export const ngSession = new Promise<{ ng: typeof NG; session: Session }>(
(resolve) => {
resolveNgSession = resolve;
} }
) { );
ng = ngImpl;
export function initNg(ngImpl: typeof NG, session: Session) {
resolveNgSession({ ng: ngImpl, session });
} }

@ -1,7 +1,7 @@
import type { Diff as Patches, Scope } from "../types.ts"; import type { Diff as Patches, Scope } from "../types.ts";
import { applyDiff } from "./applyDiff.ts"; import { applyDiff } from "./applyDiff.ts";
import { ng } from "./initNg.ts"; import { ngSession } from "./initNg.ts";
import { import {
deepSignal, deepSignal,
@ -11,7 +11,6 @@ import {
import type { import type {
DeepPatch, DeepPatch,
DeepSignalObject, DeepSignalObject,
WatchPatchCallback,
WatchPatchEvent, WatchPatchEvent,
} from "@ng-org/alien-deepsignals"; } from "@ng-org/alien-deepsignals";
import type { ShapeType, BaseType } from "@ng-org/shex-orm"; import type { ShapeType, BaseType } from "@ng-org/shex-orm";
@ -27,7 +26,6 @@ export class OrmConnection<T extends BaseType> {
/*** Identifier as a combination of shape type and scope. Prevents duplications. */ /*** Identifier as a combination of shape type and scope. Prevents duplications. */
private identifier: string; private identifier: string;
ready: boolean; ready: boolean;
sessionId: number;
suspendDeepWatcher: boolean; suspendDeepWatcher: boolean;
readyPromise: Promise<void>; readyPromise: Promise<void>;
// Promise that resolves once initial data has been applied. // Promise that resolves once initial data has been applied.
@ -56,9 +54,6 @@ export class OrmConnection<T extends BaseType> {
idGenerator: this.generateSubjectIri, idGenerator: this.generateSubjectIri,
}); });
// TODO:
this.sessionId = 1;
// Schedule cleanup of the connection when the signal object is GC'd. // Schedule cleanup of the connection when the signal object is GC'd.
OrmConnection.cleanupSignalRegistry?.register( OrmConnection.cleanupSignalRegistry?.register(
this.signalObject, this.signalObject,
@ -74,15 +69,12 @@ export class OrmConnection<T extends BaseType> {
this.resolveReady = resolve; this.resolveReady = resolve;
}); });
new Promise(async () => { ngSession.then(({ ng, session }) => {
// Establish connection to wasm land.
await new Promise((resolve) => setTimeout(resolve, 100));
try { try {
ng.orm_start( ng.orm_start(
scope, scope,
shapeType, shapeType,
this.sessionId, session.session_id,
this.onBackendMessage this.onBackendMessage
); );
} catch (e) { } catch (e) {
@ -102,8 +94,6 @@ export class OrmConnection<T extends BaseType> {
shapeType: ShapeType<T>, shapeType: ShapeType<T>,
scope: Scope scope: Scope
): OrmConnection<T> { ): OrmConnection<T> {
// if (!ng) throw new Error("initNg was not called yet.");
const scopeKey = canonicalScope(scope); const scopeKey = canonicalScope(scope);
// Unique identifier for a given shape type and scope. // Unique identifier for a given shape type and scope.
@ -112,13 +102,15 @@ export class OrmConnection<T extends BaseType> {
// If we already have an object for this shape+scope, // If we already have an object for this shape+scope,
// return it and just increase the reference count. // return it and just increase the reference count.
// Otherwise, create new one. // Otherwise, create new one.
const connection = const existingConnection = OrmConnection.idToEntry.get(identifier);
OrmConnection.idToEntry.get(identifier) ?? if (existingConnection) {
new OrmConnection(shapeType, scope); existingConnection.refCount += 1;
return existingConnection;
connection.refCount += 1; } else {
const newConnection = new OrmConnection(shapeType, scope);
return connection; OrmConnection.idToEntry.set(identifier, newConnection);
return newConnection;
}
} }
public release() { public release() {
@ -135,12 +127,14 @@ export class OrmConnection<T extends BaseType> {
const ormPatches = deepPatchesToDiff(patches); const ormPatches = deepPatchesToDiff(patches);
ng.orm_update( ngSession.then(({ ng, session }) => {
this.scope, ng.orm_update(
this.shapeType.shape, this.scope,
ormPatches, this.shapeType.shape,
this.sessionId ormPatches,
); session.session_id
);
});
} }
private onBackendMessage(...message: any) { private onBackendMessage(...message: any) {

@ -51,9 +51,9 @@ function rpc( method:string, args?: any) : Promise<any> {
let callback = args[callback_idx]; let callback = args[callback_idx];
let new_args = args.slice(0, -1); let new_args = args.slice(0, -1);
parent.postMessage({ method, args:new_args, port: port2 }, config.origin, [port2]); parent.postMessage({ method, args:new_args, port: port2 }, config.origin, [port2]);
let unsub = new Promise(async (resolve, reject)=> { let unsub = new Promise((resolve, reject)=> {
let resolved = false; let resolved = false;
port1.onmessage = async (m) => { port1.onmessage = (m) => {
if (m.data.stream) { if (m.data.stream) {
if (!resolved) { if (!resolved) {
resolve(()=>{ resolve(()=>{
@ -61,10 +61,10 @@ function rpc( method:string, args?: any) : Promise<any> {
}); });
resolved = true; resolved = true;
} }
await (callback)(m.data.ret); (callback)(m.data.ret);
} else if (!m.data.ok) { } else if (!m.data.ok) {
if (!resolved) { if (!resolved) {
reject(new Error(m.data.ret)); reject(m.data.ret);
resolved= true; resolved= true;
} else { } else {
throw new Error(m.data.ret); throw new Error(m.data.ret);

Loading…
Cancel
Save