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. 19
      sdk/js/signals/src/connector/initNg.ts
  3. 36
      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());
let info = await ng.client_info();
console.log(info.V0.details);
initNg(ng);
initNg(ng, event.session);
},
true,
[]

@ -1,15 +1,20 @@
import * as NG from "@ng-org/lib-wasm";
export let ng: typeof NG;
export function initNg(
ngImpl: typeof NG,
session: {
type Session = {
session_id: unknown;
protected_store_id: unknown;
private_store_id: unknown;
public_store_id: unknown;
};
let resolveNgSession: (value: { ng: typeof NG; session: Session }) => void;
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 { applyDiff } from "./applyDiff.ts";
import { ng } from "./initNg.ts";
import { ngSession } from "./initNg.ts";
import {
deepSignal,
@ -11,7 +11,6 @@ import {
import type {
DeepPatch,
DeepSignalObject,
WatchPatchCallback,
WatchPatchEvent,
} from "@ng-org/alien-deepsignals";
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. */
private identifier: string;
ready: boolean;
sessionId: number;
suspendDeepWatcher: boolean;
readyPromise: Promise<void>;
// Promise that resolves once initial data has been applied.
@ -56,9 +54,6 @@ export class OrmConnection<T extends BaseType> {
idGenerator: this.generateSubjectIri,
});
// TODO:
this.sessionId = 1;
// Schedule cleanup of the connection when the signal object is GC'd.
OrmConnection.cleanupSignalRegistry?.register(
this.signalObject,
@ -74,15 +69,12 @@ export class OrmConnection<T extends BaseType> {
this.resolveReady = resolve;
});
new Promise(async () => {
// Establish connection to wasm land.
await new Promise((resolve) => setTimeout(resolve, 100));
ngSession.then(({ ng, session }) => {
try {
ng.orm_start(
scope,
shapeType,
this.sessionId,
session.session_id,
this.onBackendMessage
);
} catch (e) {
@ -102,8 +94,6 @@ export class OrmConnection<T extends BaseType> {
shapeType: ShapeType<T>,
scope: Scope
): OrmConnection<T> {
// if (!ng) throw new Error("initNg was not called yet.");
const scopeKey = canonicalScope(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,
// return it and just increase the reference count.
// Otherwise, create new one.
const connection =
OrmConnection.idToEntry.get(identifier) ??
new OrmConnection(shapeType, scope);
connection.refCount += 1;
return connection;
const existingConnection = OrmConnection.idToEntry.get(identifier);
if (existingConnection) {
existingConnection.refCount += 1;
return existingConnection;
} else {
const newConnection = new OrmConnection(shapeType, scope);
OrmConnection.idToEntry.set(identifier, newConnection);
return newConnection;
}
}
public release() {
@ -135,12 +127,14 @@ export class OrmConnection<T extends BaseType> {
const ormPatches = deepPatchesToDiff(patches);
ngSession.then(({ ng, session }) => {
ng.orm_update(
this.scope,
this.shapeType.shape,
ormPatches,
this.sessionId
session.session_id
);
});
}
private onBackendMessage(...message: any) {

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

Loading…
Cancel
Save