temporary: use orm sets at root level for objects

feat/orm-diffs
Laurin Weger 14 hours ago
parent dbb4e3d7ce
commit aa0acfa197
No known key found for this signature in database
GPG Key ID: 9B372BB0B792770F
  1. 2
      sdk/js/examples/multi-framework-signals/src/frontends/react/HelloWorld.tsx
  2. 4
      sdk/js/examples/multi-framework-signals/src/frontends/svelte/HelloWorld.svelte
  3. 14
      sdk/js/signals/src/connector/ormConnectionHandler.ts
  4. 2
      sdk/js/signals/src/frontendAdapters/react/useShape.ts
  5. 6
      sdk/js/signals/src/frontendAdapters/svelte/useShape.svelte.ts

@ -4,7 +4,7 @@ import flattenObject from "../utils/flattenObject";
import { TestObjectShapeType } from "../../shapes/orm/testShape.shapeTypes";
export function HelloWorldReact() {
const state = useShape(TestObjectShapeType);
const state = useShape(TestObjectShapeType)?.entries().next();
// @ts-expect-error
window.reactState = state;

@ -20,7 +20,9 @@
cur[keys[keys.length - 1]] = value;
}
const flatEntries = $derived(
$shapeObject ? flattenObject($shapeObject as any) : []
$shapeObject
? flattenObject($shapeObject.entries().next() || ({} as any))
: []
);
$effect(() => {
(window as any).svelteState = $shapeObject;

@ -21,7 +21,7 @@ export class OrmConnection<T extends BaseType> {
readonly shapeType: ShapeType<T>;
readonly scope: Scope;
readonly signalObject: DeepSignalObject<T | {}>;
readonly signalObject: DeepSignalObject<Set<T>>;
private refCount: number;
/*** Identifier as a combination of shape type and scope. Prevents duplications. */
private identifier: string;
@ -49,7 +49,7 @@ export class OrmConnection<T extends BaseType> {
this.ready = false;
this.suspendDeepWatcher = false;
this.identifier = `${shapeType.shape}::${canonicalScope(scope)}`;
this.signalObject = deepSignal<T | {}>(new Set(), {
this.signalObject = deepSignal<Set<T>>(new Set(), {
addIdToObjects: true,
idGenerator: this.generateSubjectIri,
});
@ -62,7 +62,7 @@ export class OrmConnection<T extends BaseType> {
);
// Add listener to deep signal object to report changes back to wasm land.
watchDeepSignal(this.signalObject as T, this.onSignalObjectUpdate);
watchDeepSignal<Set<T>>(this.signalObject, this.onSignalObjectUpdate);
// Initialize per-entry readiness promise that resolves in setUpConnection
this.readyPromise = new Promise<void>((resolve) => {
@ -79,7 +79,7 @@ export class OrmConnection<T extends BaseType> {
this.onBackendMessage
);
} catch (e) {
console.error(e)
console.error(e);
}
});
}
@ -123,7 +123,7 @@ export class OrmConnection<T extends BaseType> {
}
}
private onSignalObjectUpdate({ patches }: WatchPatchEvent<T>) {
private onSignalObjectUpdate({ patches }: WatchPatchEvent<Set<T>>) {
if (this.suspendDeepWatcher || !this.ready || !patches.length) return;
const ormPatches = deepPatchesToDiff(patches);
@ -153,7 +153,9 @@ export class OrmConnection<T extends BaseType> {
this.suspendDeepWatcher = true;
batch(() => {
// Convert arrays to sets and apply to signalObject (we only have sets but can only transport arrays).
Object.assign(this.signalObject, recurseArrayToSet(initialData)!);
for (const newItem of recurseArrayToSet(initialData)) {
this.signalObject.add(newItem);
}
});
queueMicrotask(() => {

@ -31,7 +31,7 @@ const useShape = <T extends BaseType>(
};
}, []);
if ("id" in shapeSignalRef.current.signalObject)
if ("@id" in shapeSignalRef.current.signalObject)
return shapeSignalRef.current.signalObject;
else return null;
};

@ -91,7 +91,7 @@ export interface UseShapeRuneResult<T = any> extends UseDeepSignalResult<T> {
export function useShapeRune<T extends BaseType>(
shape: ShapeType<T>,
scope?: Scope
): UseShapeRuneResult<T | {}> {
): UseShapeRuneResult<Set<T>> {
const { signalObject: rootSignal, stop } = createSignalObjectForShape(
shape,
scope
@ -101,8 +101,8 @@ export function useShapeRune<T extends BaseType>(
onDestroy(stop);
// rootSignal is already a deepSignal proxy root (object returned by createSignalObjectForShape)
const ds = useDeepSignal<T>(rootSignal as T);
return { root: rootSignal, ...ds } as UseShapeRuneResult<T>;
const ds = useDeepSignal<Set<T>>(rootSignal as Set<T>);
return { root: rootSignal, ...ds } as UseShapeRuneResult<Set<T>>;
}
export default useShapeRune;

Loading…
Cancel
Save