From 9e61e775cde8c6001c30499a8afa422ad44fc7dc Mon Sep 17 00:00:00 2001 From: Jackson Morgan Date: Sat, 29 Mar 2025 10:33:26 -0400 Subject: [PATCH] Partial implementation of nextgraph plugin --- .../src/NextGraphConnectedPlugin.ts | 32 +++++++++++++++---- .../NextGraphNotificationMessage.ts | 1 + .../src/resources/NextGraphResource.ts | 8 +++-- .../SolidNotificationSubscription.ts | 15 ++++----- .../src/resources/SolidResource.ts | 8 ++--- .../connected/src/SubscriptionCallbacks.ts | 5 +++ packages/connected/src/index.ts | 1 + 7 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 packages/connected-nextgraph/src/notifications/NextGraphNotificationMessage.ts create mode 100644 packages/connected/src/SubscriptionCallbacks.ts diff --git a/packages/connected-nextgraph/src/NextGraphConnectedPlugin.ts b/packages/connected-nextgraph/src/NextGraphConnectedPlugin.ts index 764fccd..b44f0db 100644 --- a/packages/connected-nextgraph/src/NextGraphConnectedPlugin.ts +++ b/packages/connected-nextgraph/src/NextGraphConnectedPlugin.ts @@ -1,6 +1,8 @@ import type { ConnectedContext, ConnectedPlugin } from "@ldo/connected"; import type { NextGraphUri } from "./types"; -import type { NextGraphResource } from "./resources/NextGraphResource"; +import { NextGraphResource } from "./resources/NextGraphResource"; +import ng from "nextgraph"; +import { isNextGraphUri } from "./util/isNextGraphUri"; export interface NextGraphConnectedContext { sessionId?: string; @@ -23,16 +25,34 @@ export interface NextGraphConnectedPlugin export const nextgGraphConnectedPlugin: NextGraphConnectedPlugin = { name: "nextgraph", - getResource: function (_uri: NextGraphUri): NextGraphResource { - throw new Error("Function not implemented."); + getResource: function ( + uri: NextGraphUri, + context: ConnectedContext, + ): NextGraphResource { + // NIKO: Do I need to split into "base?" Remind me again of why I need base? + return new NextGraphResource(uri, context); }, - createResource: function (): Promise { - throw new Error("Function not implemented."); + createResource: async function ( + context: ConnectedContext, + ): Promise { + const nuri: NextGraphUri = await ng.doc_create( + context.nextgraph.sessionId, + "Graph", + // NIKO: Can this always be "data:graph"? + "data:graph", + // NIKO: What are the options here again? + "protected", + // NIKO: What is this? Should it be changed? + "B381BvfdAFYPBkdhDrsqnMMg5pnJMWJgJbZobZErXZMA", + // NIKO: Can this always be "store"? + "store", + ); + return new NextGraphResource(nuri, context); }, isUriValid: function (uri: string): uri is NextGraphUri { - throw new Error("Function not implemented."); + return isNextGraphUri(uri); }, initialContext: { diff --git a/packages/connected-nextgraph/src/notifications/NextGraphNotificationMessage.ts b/packages/connected-nextgraph/src/notifications/NextGraphNotificationMessage.ts new file mode 100644 index 0000000..0b1d66a --- /dev/null +++ b/packages/connected-nextgraph/src/notifications/NextGraphNotificationMessage.ts @@ -0,0 +1 @@ +export interface NextGraphNotificationMessage {} diff --git a/packages/connected-nextgraph/src/resources/NextGraphResource.ts b/packages/connected-nextgraph/src/resources/NextGraphResource.ts index c6b8229..7b1d280 100644 --- a/packages/connected-nextgraph/src/resources/NextGraphResource.ts +++ b/packages/connected-nextgraph/src/resources/NextGraphResource.ts @@ -1,6 +1,7 @@ import type { ConnectedContext, ReadSuccess, + SubscriptionCallbacks, UpdateSuccess, } from "@ldo/connected"; import { @@ -14,6 +15,7 @@ import EventEmitter from "events"; import type { NextGraphConnectedPlugin } from "../NextGraphConnectedPlugin"; import ng from "nextgraph"; import type { DatasetChanges } from "@ldo/rdf-utils"; +import type { NextGraphNotificationMessage } from "../notifications/NextGraphNotificationMessage"; export class NextGraphResource extends (EventEmitter as new () => ResourceEventEmitter) @@ -77,11 +79,13 @@ export class NextGraphResource throw new Error("Method Not Implemented"); } - protected async onNotification(message: unknown) { + protected async onNotification(_message: unknown) { // TODO } - subscribeToNotifications(callbacks?: SubscriptionCallbacks): Promise { + subscribeToNotifications( + _callbacks?: SubscriptionCallbacks, + ): Promise { throw new Error("Method not implemented."); } diff --git a/packages/connected-solid/src/notifications/SolidNotificationSubscription.ts b/packages/connected-solid/src/notifications/SolidNotificationSubscription.ts index aa03496..9305fa3 100644 --- a/packages/connected-solid/src/notifications/SolidNotificationSubscription.ts +++ b/packages/connected-solid/src/notifications/SolidNotificationSubscription.ts @@ -1,4 +1,4 @@ -import type { ConnectedContext } from "@ldo/connected"; +import type { ConnectedContext, SubscriptionCallbacks } from "@ldo/connected"; import type { NotificationCallbackError } from "./results/NotificationErrors"; import { v4 } from "uuid"; import type { SolidContainer } from "../resources/SolidContainer"; @@ -6,12 +6,6 @@ import type { SolidLeaf } from "../resources/SolidLeaf"; import type { SolidNotificationMessage } from "./SolidNotificationMessage"; import type { SolidConnectedPlugin } from "../SolidConnectedPlugin"; -export interface SubscriptionCallbacks { - onNotification?: (message: SolidNotificationMessage) => void; - // TODO: make notification errors more specific - onNotificationError?: (error: Error) => void; -} - /** * @internal * Abstract class for notification subscription methods. @@ -20,7 +14,10 @@ export abstract class SolidNotificationSubscription { protected resource: SolidContainer | SolidLeaf; protected parentSubscription: (message: SolidNotificationMessage) => void; protected context: ConnectedContext; - protected subscriptions: Record = {}; + protected subscriptions: Record< + string, + SubscriptionCallbacks + > = {}; private isOpen: boolean = false; constructor( @@ -48,7 +45,7 @@ export abstract class SolidNotificationSubscription { * subscribeToNotifications */ async subscribeToNotifications( - subscriptionCallbacks?: SubscriptionCallbacks, + subscriptionCallbacks?: SubscriptionCallbacks, ): Promise { const subscriptionId = v4(); this.subscriptions[subscriptionId] = subscriptionCallbacks ?? {}; diff --git a/packages/connected-solid/src/resources/SolidResource.ts b/packages/connected-solid/src/resources/SolidResource.ts index b94a6cc..2f34fa7 100644 --- a/packages/connected-solid/src/resources/SolidResource.ts +++ b/packages/connected-solid/src/resources/SolidResource.ts @@ -6,6 +6,7 @@ import type { Resource, ResourceEventEmitter, ResourceSuccess, + SubscriptionCallbacks, Unfetched, } from "@ldo/connected"; import type { SolidContainerUri, SolidLeafUri } from "../types"; @@ -13,10 +14,7 @@ import EventEmitter from "events"; import type { SolidConnectedPlugin } from "../SolidConnectedPlugin"; import type { BatchedRequester } from "../requester/BatchedRequester"; import type { WacRule } from "../wac/WacRule"; -import type { - SolidNotificationSubscription, - SubscriptionCallbacks, -} from "../notifications/SolidNotificationSubscription"; +import type { SolidNotificationSubscription } from "../notifications/SolidNotificationSubscription"; import { Websocket2023NotificationSubscription } from "../notifications/Websocket2023NotificationSubscription"; import { getParentUri } from "../util/rdfUtils"; import { isReadSuccess } from "../requester/results/success/SolidReadSuccess"; @@ -784,7 +782,7 @@ export abstract class SolidResource * // ... From there you can wait for a file to be changed on the Pod. */ async subscribeToNotifications( - callbacks?: SubscriptionCallbacks, + callbacks?: SubscriptionCallbacks, ): Promise { return await this.notificationSubscription.subscribeToNotifications( callbacks, diff --git a/packages/connected/src/SubscriptionCallbacks.ts b/packages/connected/src/SubscriptionCallbacks.ts new file mode 100644 index 0000000..9b2dc08 --- /dev/null +++ b/packages/connected/src/SubscriptionCallbacks.ts @@ -0,0 +1,5 @@ +export interface SubscriptionCallbacks { + onNotification?: (message: NotificationMessage) => void; + // TODO: make notification errors more specific + onNotificationError?: (error: Error) => void; +} diff --git a/packages/connected/src/index.ts b/packages/connected/src/index.ts index 0ba6d2c..880cade 100644 --- a/packages/connected/src/index.ts +++ b/packages/connected/src/index.ts @@ -7,6 +7,7 @@ export * from "./InvalidIdentifierResource"; export * from "./ConnectedContext"; export * from "./methods"; export * from "./createConntectedLdoDataset"; +export * from "./SubscriptionCallbacks"; export * from "./util/splitChangesByGraph";