@party-stack/foundry-ontology 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/lib/adapter/convertLoadSubsetOptions.d.ts +5 -0
  4. package/lib/adapter/convertLoadSubsetOptions.d.ts.map +1 -0
  5. package/lib/adapter/convertLoadSubsetOptions.js +90 -0
  6. package/lib/adapter/convertLoadSubsetOptions.js.map +1 -0
  7. package/lib/adapter/createAction.d.ts +9 -0
  8. package/lib/adapter/createAction.d.ts.map +1 -0
  9. package/lib/adapter/createAction.js +42 -0
  10. package/lib/adapter/createAction.js.map +1 -0
  11. package/lib/adapter/createObjectCollection.d.ts +23 -0
  12. package/lib/adapter/createObjectCollection.d.ts.map +1 -0
  13. package/lib/adapter/createObjectCollection.js +117 -0
  14. package/lib/adapter/createObjectCollection.js.map +1 -0
  15. package/lib/adapter/foundryCodec.d.ts +8 -0
  16. package/lib/adapter/foundryCodec.d.ts.map +1 -0
  17. package/lib/adapter/foundryCodec.js +108 -0
  18. package/lib/adapter/foundryCodec.js.map +1 -0
  19. package/lib/adapter/index.d.ts +3 -0
  20. package/lib/adapter/index.d.ts.map +1 -0
  21. package/lib/adapter/index.js +3 -0
  22. package/lib/adapter/index.js.map +1 -0
  23. package/lib/adapter/sync/ObjectSetSubscription.d.ts +35 -0
  24. package/lib/adapter/sync/ObjectSetSubscription.d.ts.map +1 -0
  25. package/lib/adapter/sync/ObjectSetSubscription.js +2 -0
  26. package/lib/adapter/sync/ObjectSetSubscription.js.map +1 -0
  27. package/lib/adapter/sync/ObjectSetWatcherManager.d.ts +11 -0
  28. package/lib/adapter/sync/ObjectSetWatcherManager.d.ts.map +1 -0
  29. package/lib/adapter/sync/ObjectSetWatcherManager.js +86 -0
  30. package/lib/adapter/sync/ObjectSetWatcherManager.js.map +1 -0
  31. package/lib/adapter/sync/effection-utils/useValueSignal.d.ts +4 -0
  32. package/lib/adapter/sync/effection-utils/useValueSignal.d.ts.map +1 -0
  33. package/lib/adapter/sync/effection-utils/useValueSignal.js +31 -0
  34. package/lib/adapter/sync/effection-utils/useValueSignal.js.map +1 -0
  35. package/lib/adapter/sync/useObjectSetWatcherConnection.d.ts +10 -0
  36. package/lib/adapter/sync/useObjectSetWatcherConnection.d.ts.map +1 -0
  37. package/lib/adapter/sync/useObjectSetWatcherConnection.js +184 -0
  38. package/lib/adapter/sync/useObjectSetWatcherConnection.js.map +1 -0
  39. package/lib/adapter/sync/useObjectSetWatcherSession.d.ts +9 -0
  40. package/lib/adapter/sync/useObjectSetWatcherSession.d.ts.map +1 -0
  41. package/lib/adapter/sync/useObjectSetWatcherSession.js +69 -0
  42. package/lib/adapter/sync/useObjectSetWatcherSession.js.map +1 -0
  43. package/lib/config/index.d.ts +10 -0
  44. package/lib/config/index.d.ts.map +1 -0
  45. package/lib/config/index.js +40 -0
  46. package/lib/config/index.js.map +1 -0
  47. package/lib/index.d.ts +3 -0
  48. package/lib/index.d.ts.map +1 -0
  49. package/lib/index.js +3 -0
  50. package/lib/index.js.map +1 -0
  51. package/lib/meta/createOntologyMetadataCollections.d.ts +7 -0
  52. package/lib/meta/createOntologyMetadataCollections.d.ts.map +1 -0
  53. package/lib/meta/createOntologyMetadataCollections.js +304 -0
  54. package/lib/meta/createOntologyMetadataCollections.js.map +1 -0
  55. package/lib/meta/index.d.ts +2 -0
  56. package/lib/meta/index.d.ts.map +1 -0
  57. package/lib/meta/index.js +2 -0
  58. package/lib/meta/index.js.map +1 -0
  59. package/lib/users/createUserCollection.d.ts +7 -0
  60. package/lib/users/createUserCollection.d.ts.map +1 -0
  61. package/lib/users/createUserCollection.js +93 -0
  62. package/lib/users/createUserCollection.js.map +1 -0
  63. package/lib/users/index.d.ts +2 -0
  64. package/lib/users/index.d.ts.map +1 -0
  65. package/lib/users/index.js +2 -0
  66. package/lib/users/index.js.map +1 -0
  67. package/lib/utils/AsyncIterable.d.ts +3 -0
  68. package/lib/utils/AsyncIterable.d.ts.map +1 -0
  69. package/lib/utils/AsyncIterable.js +27 -0
  70. package/lib/utils/AsyncIterable.js.map +1 -0
  71. package/lib/utils/chunk.d.ts +2 -0
  72. package/lib/utils/chunk.d.ts.map +1 -0
  73. package/lib/utils/chunk.js +8 -0
  74. package/lib/utils/chunk.js.map +1 -0
  75. package/lib/utils/client.d.ts +11 -0
  76. package/lib/utils/client.d.ts.map +1 -0
  77. package/lib/utils/client.js +22 -0
  78. package/lib/utils/client.js.map +1 -0
  79. package/package.json +67 -0
@@ -0,0 +1,86 @@
1
+ import { run, each, until } from "effection";
2
+ import { useValueSignal } from "./effection-utils/useValueSignal.js";
3
+ import { useObjectSetWatcherSession } from "./useObjectSetWatcherSession.js";
4
+ export class ObjectSetWatcherManager {
5
+ #task;
6
+ #objectSetSubscriptions;
7
+ #updateDesiredSubscriptions;
8
+ constructor(client) {
9
+ this.#objectSetSubscriptions = new Map();
10
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
11
+ const manager = this;
12
+ this.#task = run(function* () {
13
+ const desiredSubscriptions = yield* useValueSignal([]);
14
+ // eslint-disable-next-line @typescript-eslint/unbound-method
15
+ manager.#updateDesiredSubscriptions = desiredSubscriptions.update;
16
+ const messages = yield* useObjectSetWatcherSession(client.baseUrl, () => until(client.tokenProvider()), client.ontologyRid, desiredSubscriptions);
17
+ for (const message of yield* each(messages)) {
18
+ if (message.type === "change" || message.type === "refresh") {
19
+ const subscriptions = manager.#objectSetSubscriptions.get(message.subscriptionId);
20
+ subscriptions?.forEach((sub) => {
21
+ try {
22
+ sub(message);
23
+ }
24
+ catch (error) {
25
+ console.error("Error during subscription callback", error);
26
+ }
27
+ });
28
+ }
29
+ else {
30
+ for (const update of message.updates) {
31
+ const subscriptions = manager.#objectSetSubscriptions.get(update.subscriptionId);
32
+ subscriptions?.forEach((sub) => {
33
+ try {
34
+ sub({ type: "state", status: update.status });
35
+ }
36
+ catch (error) {
37
+ console.error("Error during subscription callback", error);
38
+ }
39
+ });
40
+ if (update.status === "error") {
41
+ desiredSubscriptions.update((subs) => subs.filter((sub) => sub.id === update.subscriptionId));
42
+ }
43
+ }
44
+ }
45
+ yield* each.next();
46
+ }
47
+ });
48
+ }
49
+ subscribe(objectSet, callback) {
50
+ const key = JSON.stringify(objectSet);
51
+ let existingSubscriptions = this.#objectSetSubscriptions.get(key);
52
+ if (!existingSubscriptions) {
53
+ existingSubscriptions = new Set();
54
+ this.#objectSetSubscriptions.set(key, existingSubscriptions);
55
+ this.#updateDesiredSubscriptions?.((subs) => [
56
+ ...subs,
57
+ { id: key, objectSet, propertySet: [], referenceSet: [] },
58
+ ]);
59
+ }
60
+ existingSubscriptions.add(callback);
61
+ return () => {
62
+ const deleted = existingSubscriptions.delete(callback);
63
+ if (deleted && existingSubscriptions.size === 0) {
64
+ this.#objectSetSubscriptions.delete(key);
65
+ this.#updateDesiredSubscriptions?.((subs) => subs.filter((sub) => sub.id === key));
66
+ }
67
+ };
68
+ }
69
+ async stop() {
70
+ if (this.#task) {
71
+ const task = this.#task;
72
+ this.#task = undefined;
73
+ await task.halt();
74
+ }
75
+ }
76
+ }
77
+ const cache = new WeakMap();
78
+ export function getObjectSetWatcherManager(client) {
79
+ let manager = cache.get(client);
80
+ if (!manager) {
81
+ manager = new ObjectSetWatcherManager(client);
82
+ cache.set(client, manager);
83
+ }
84
+ return manager;
85
+ }
86
+ //# sourceMappingURL=ObjectSetWatcherManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectSetWatcherManager.js","sourceRoot":"","sources":["../../../src/adapter/sync/ObjectSetWatcherManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Operation } from "effection";
2
+ import type { ValueSignal } from "@effectionx/signals";
3
+ export declare function useValueSignal<T>(initial: T): Operation<ValueSignal<T>>;
4
+ //# sourceMappingURL=useValueSignal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useValueSignal.d.ts","sourceRoot":"","sources":["../../../../src/adapter/sync/effection-utils/useValueSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,SAAS,EAAY,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA+BvE"}
@@ -0,0 +1,31 @@
1
+ import { createSignal, resource } from "effection";
2
+ // TODO: port this upstream.
3
+ export function useValueSignal(initial) {
4
+ return resource(function* (provide) {
5
+ const signal = createSignal();
6
+ const ref = { current: initial };
7
+ function set(value) {
8
+ if (value !== ref.current) {
9
+ ref.current = value;
10
+ signal.send(ref.current);
11
+ }
12
+ return ref.current;
13
+ }
14
+ try {
15
+ yield* provide({
16
+ [Symbol.iterator]: signal[Symbol.iterator],
17
+ set,
18
+ update(updater) {
19
+ return set(updater(ref.current));
20
+ },
21
+ valueOf() {
22
+ return ref.current;
23
+ },
24
+ });
25
+ }
26
+ finally {
27
+ signal.close();
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=useValueSignal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useValueSignal.js","sourceRoot":"","sources":["../../../../src/adapter/sync/effection-utils/useValueSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGnE,4BAA4B;AAE5B,MAAM,UAAU,cAAc,CAAI,OAAU;IACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO;QAC9B,MAAM,MAAM,GAAG,YAAY,EAAW,CAAC;QAEvC,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAEjC,SAAS,GAAG,CAAC,KAAQ;YACjB,IAAI,KAAK,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxB,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;gBAEpB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,GAAG,CAAC,OAAO,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACD,KAAK,CAAC,CAAC,OAAO,CAAC;gBACX,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC1C,GAAG;gBACH,MAAM,CAAC,OAAO;oBACV,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO;oBACH,OAAO,GAAG,CAAC,OAAO,CAAC;gBACvB,CAAC;aACJ,CAAC,CAAC;QACP,CAAC;gBAAS,CAAC;YACP,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Stream, Operation } from "effection";
2
+ import { ObjectSetSubscription, ObjectSetSubscriptionsMessage } from "./ObjectSetSubscription";
3
+ import type { ValueSignal } from "@effectionx/signals";
4
+ /**
5
+ * Creates a resources that tracks the lifetime of a single physical Object Set Watcher connection.
6
+ *
7
+ * Handles connection details, maintaining the connection with heartbeats, and shuttling messages.
8
+ */
9
+ export declare function useObjectSetWatcherConnection(baseUrl: string, token: string, ontologyRid: string, desiredSubscriptions: ValueSignal<ObjectSetSubscription[]>): Operation<Stream<ObjectSetSubscriptionsMessage, CloseEvent | void>>;
10
+ //# sourceMappingURL=useObjectSetWatcherConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObjectSetWatcherConnection.d.ts","sourceRoot":"","sources":["../../../src/adapter/sync/useObjectSetWatcherConnection.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgC,MAAM,EAAE,SAAS,EAAiB,MAAM,WAAW,CAAC;AAC3F,OAAO,EACH,qBAAqB,EACrB,6BAA6B,EAGhC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA0DvD;;;;GAIG;AACH,wBAAgB,6BAA6B,CACzC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,WAAW,CAAC,qBAAqB,EAAE,CAAC,GAC3D,SAAS,CAAC,MAAM,CAAC,6BAA6B,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAmJrE"}
@@ -0,0 +1,184 @@
1
+ /* eslint-disable require-yield */
2
+ /* eslint-disable react-hooks/rules-of-hooks */
3
+ import { invariant } from "@bobbyfidz/panic";
4
+ import { Pathnames, Urls } from "@bobbyfidz/urls";
5
+ import { map } from "@effectionx/stream-helpers";
6
+ import { useWebSocket } from "@effectionx/websocket";
7
+ import { resource, spawn, race, sleep, createChannel } from "effection";
8
+ const WEBSOCKET_HEARTBEAT_INTERVAL_MS = 45_000;
9
+ function bigIntToUuid(value) {
10
+ const decimalString = value.toString().padStart(32, "0");
11
+ return `${decimalString.substring(0, 8)}-${decimalString.substring(8, 12)}-${decimalString.substring(12, 16)}-${decimalString.substring(16, 20)}-${decimalString.substring(20)}`;
12
+ }
13
+ function uuidToBigInt(uuid) {
14
+ const decimalString = uuid.replace(/-/g, "");
15
+ return BigInt(decimalString);
16
+ }
17
+ function serializeRequest(requestId, request) {
18
+ return JSON.stringify({
19
+ id: bigIntToUuid(requestId),
20
+ // Strip out our internal subscription ids.
21
+ requests: request.map(({ objectSet, propertySet, referenceSet }) => ({
22
+ objectSet,
23
+ propertySet,
24
+ referenceSet,
25
+ })),
26
+ });
27
+ }
28
+ const parseMessages = map(function* (message) {
29
+ return JSON.parse(String(message.data));
30
+ });
31
+ /**
32
+ * We sometimes see duplicate primary keys in a single message (it seems like when there are multiple updates to the same object in a short period of time)
33
+ * which causes problems downstream, so we clean that up here.
34
+ */
35
+ function filterChangeMessages(updates) {
36
+ const reversedUpdates = [...updates].reverse();
37
+ const seen = new Set();
38
+ const filteredUpdates = [];
39
+ for (const update of reversedUpdates) {
40
+ switch (update.type) {
41
+ case "object": {
42
+ const primaryKey = update.object
43
+ .__primaryKey;
44
+ if (!seen.has(primaryKey)) {
45
+ filteredUpdates.push(update);
46
+ seen.add(primaryKey);
47
+ }
48
+ break;
49
+ }
50
+ case "reference": {
51
+ filteredUpdates.push(update);
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ return filteredUpdates;
57
+ }
58
+ /**
59
+ * Creates a resources that tracks the lifetime of a single physical Object Set Watcher connection.
60
+ *
61
+ * Handles connection details, maintaining the connection with heartbeats, and shuttling messages.
62
+ */
63
+ export function useObjectSetWatcherConnection(baseUrl, token, ontologyRid, desiredSubscriptions) {
64
+ return resource(function* (provide) {
65
+ const subscriptionMessages = createChannel();
66
+ const socket = yield* useWebSocket(Urls.extend(baseUrl, {
67
+ protocol: "wss:",
68
+ pathname: Pathnames.join("/api/v2/ontologySubscriptions/ontologies", ontologyRid, "streamSubscriptions"),
69
+ }).toString(), `Bearer-${token}`);
70
+ let latestRequestId = 0n;
71
+ let externalSubscriptionIdsToInternal;
72
+ function* sendSubscriptionRequest(request) {
73
+ const requestId = latestRequestId + 1n;
74
+ latestRequestId = requestId;
75
+ // Open a subscription before sending our request to make sure we don't miss it on the way back.
76
+ const messages = yield* parseMessages(socket);
77
+ socket.send(serializeRequest(requestId, request));
78
+ while (true) {
79
+ const nextMessage = yield* messages.next();
80
+ if (nextMessage.done) {
81
+ break;
82
+ }
83
+ const message = nextMessage.value;
84
+ if (message.type === "subscribeResponses") {
85
+ const messageRequestId = uuidToBigInt(message.id);
86
+ if (messageRequestId > requestId) {
87
+ // A newer message than ours arrived which will have the latest state, so we can stop waiting.
88
+ break;
89
+ }
90
+ if (messageRequestId === requestId) {
91
+ externalSubscriptionIdsToInternal = new Map();
92
+ const updates = [];
93
+ for (let i = 0; i < message.responses.length; i++) {
94
+ const subscriptionRequest = request[i];
95
+ const subscriptionResponse = message.responses[i];
96
+ switch (subscriptionResponse.type) {
97
+ case "success": {
98
+ externalSubscriptionIdsToInternal.set(subscriptionResponse.id, subscriptionRequest.id);
99
+ updates.push({ subscriptionId: subscriptionRequest.id, status: "open" });
100
+ break;
101
+ }
102
+ case "qos": {
103
+ updates.push({ subscriptionId: subscriptionRequest.id, status: "qos" });
104
+ break;
105
+ }
106
+ case "error": {
107
+ updates.push({ subscriptionId: subscriptionRequest.id, status: "error" });
108
+ break;
109
+ }
110
+ }
111
+ }
112
+ return { type: "state", updates };
113
+ }
114
+ }
115
+ }
116
+ }
117
+ void (yield* spawn(function* () {
118
+ const request = desiredSubscriptions.valueOf();
119
+ const response = yield* sendSubscriptionRequest(request);
120
+ if (response) {
121
+ yield* subscriptionMessages.send(response);
122
+ }
123
+ const desiredSubscriptionsUpdates = yield* desiredSubscriptions;
124
+ while (true) {
125
+ const nextEvent = yield* race([
126
+ desiredSubscriptionsUpdates.next(),
127
+ sleep(WEBSOCKET_HEARTBEAT_INTERVAL_MS),
128
+ ]);
129
+ if (nextEvent && nextEvent.done) {
130
+ break;
131
+ }
132
+ // TODO: figure out if we can heartbeat with a smaller payload.
133
+ const request = nextEvent ? nextEvent.value : desiredSubscriptions.valueOf();
134
+ const response = yield* sendSubscriptionRequest(request);
135
+ if (response) {
136
+ yield* subscriptionMessages.send(response);
137
+ }
138
+ }
139
+ }));
140
+ void (yield* spawn(function* () {
141
+ const messages = yield* parseMessages(socket);
142
+ while (true) {
143
+ const nextMessage = yield* messages.next();
144
+ if (nextMessage.done) {
145
+ yield* subscriptionMessages.close(nextMessage.value);
146
+ break;
147
+ }
148
+ const message = nextMessage.value;
149
+ switch (message.type) {
150
+ case "objectSetChanged": {
151
+ const subscriptionId = externalSubscriptionIdsToInternal?.get(message.id);
152
+ invariant(subscriptionId, "Subscription id could not be found, this should never happen.");
153
+ yield* subscriptionMessages.send({
154
+ type: "change",
155
+ subscriptionId,
156
+ updates: filterChangeMessages(message.updates),
157
+ });
158
+ break;
159
+ }
160
+ case "refreshObjectSet": {
161
+ const subscriptionId = externalSubscriptionIdsToInternal?.get(message.id);
162
+ invariant(subscriptionId, "Subscription id could not be found, this should never happen.");
163
+ yield* subscriptionMessages.send({
164
+ type: "refresh",
165
+ subscriptionId,
166
+ objectType: message.objectType,
167
+ });
168
+ break;
169
+ }
170
+ case "subscriptionClosed": {
171
+ const subscriptionId = externalSubscriptionIdsToInternal?.get(message.id);
172
+ invariant(subscriptionId, "Subscription id could not be found, this should never happen.");
173
+ yield* subscriptionMessages.send({
174
+ type: "state",
175
+ updates: [{ subscriptionId, status: "closed" }],
176
+ });
177
+ }
178
+ }
179
+ }
180
+ }));
181
+ yield* provide(subscriptionMessages);
182
+ });
183
+ }
184
+ //# sourceMappingURL=useObjectSetWatcherConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObjectSetWatcherConnection.js","sourceRoot":"","sources":["../../../src/adapter/sync/useObjectSetWatcherConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Operation, Stream } from "effection";
2
+ import { ObjectSetSubscription, ObjectSetSubscriptionsMessage } from "./ObjectSetSubscription";
3
+ import type { ValueSignal } from "@effectionx/signals";
4
+ /**
5
+ * Creates a resources that maintains a logical Object Set Watcher session regardless
6
+ * of blips in network connectivity.
7
+ */
8
+ export declare function useObjectSetWatcherSession(baseUrl: string, tokenProvider: () => Operation<string>, ontologyRid: string, desiredSubscriptions: ValueSignal<ObjectSetSubscription[]>): Operation<Stream<ObjectSetSubscriptionsMessage, void>>;
9
+ //# sourceMappingURL=useObjectSetWatcherSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObjectSetWatcherSession.d.ts","sourceRoot":"","sources":["../../../src/adapter/sync/useObjectSetWatcherSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAkC,MAAM,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,SAAS,CAAC,MAAM,CAAC,EACtC,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,WAAW,CAAC,qBAAqB,EAAE,CAAC,GAC3D,SAAS,CAAC,MAAM,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC,CAwExD"}
@@ -0,0 +1,69 @@
1
+ /* eslint-disable react-hooks/rules-of-hooks */
2
+ import { createChannel, resource, scoped, sleep, spawn } from "effection";
3
+ import { useObjectSetWatcherConnection } from "./useObjectSetWatcherConnection";
4
+ /**
5
+ * Creates a resources that maintains a logical Object Set Watcher session regardless
6
+ * of blips in network connectivity.
7
+ */
8
+ export function useObjectSetWatcherSession(baseUrl, tokenProvider, ontologyRid, desiredSubscriptions) {
9
+ return resource(function* (provide) {
10
+ // TODO: turn off connection after a while if there are 0 object sets we are subscribed to.
11
+ const subscriptionMessages = createChannel();
12
+ void (yield* spawn(function* () {
13
+ while (true) {
14
+ // TODO: wait until we have > 0 object sets we are subscribed to and have auth.
15
+ try {
16
+ yield* scoped(function* () {
17
+ const connection = yield* useObjectSetWatcherConnection(baseUrl, yield* tokenProvider(), ontologyRid, desiredSubscriptions);
18
+ const messages = yield* connection;
19
+ while (true) {
20
+ const nextMessage = yield* messages.next();
21
+ if (nextMessage.done) {
22
+ // TODO: capture code here and adjust behavior accordingly.
23
+ yield* subscriptionMessages.send({
24
+ type: "state",
25
+ updates: desiredSubscriptions
26
+ .valueOf()
27
+ .map(({ id }) => ({ subscriptionId: id, status: "closed" })),
28
+ });
29
+ break;
30
+ }
31
+ const message = nextMessage.value;
32
+ if (message.type === "state" &&
33
+ message.updates.some((update) => update.status === "qos")) {
34
+ // TODO: gracefully roll-over to a new connection while we hang onto the old one.
35
+ yield* subscriptionMessages.send({
36
+ type: "state",
37
+ updates: desiredSubscriptions
38
+ .valueOf()
39
+ .map(({ id }) => ({ subscriptionId: id, status: "qos" })),
40
+ });
41
+ break;
42
+ }
43
+ yield* subscriptionMessages.send(message);
44
+ }
45
+ });
46
+ }
47
+ catch (error) {
48
+ console.error("Error in connection", error);
49
+ // TODO: capture error here and adjust behavior accordingly. it seems like browsers
50
+ // mostly just close rather than erroring, but Node.js might error before closing.
51
+ yield* subscriptionMessages.send({
52
+ type: "state",
53
+ updates: desiredSubscriptions
54
+ .valueOf()
55
+ .map(({ id }) => ({ subscriptionId: id, status: "closed" })),
56
+ });
57
+ }
58
+ // TODO: smart reconnection logic here:
59
+ // - if quit because disconnected from network, wait until we're back online
60
+ // - if quit because of qos, wait w/ some jitter so we don't overload the server
61
+ // - if quit because of auth we'll yield at top of loop for a new token
62
+ // - if quit because 0 queries we'll yield at top of loop for queries
63
+ yield* sleep(5_000);
64
+ }
65
+ }));
66
+ yield* provide(subscriptionMessages);
67
+ });
68
+ }
69
+ //# sourceMappingURL=useObjectSetWatcherSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObjectSetWatcherSession.js","sourceRoot":"","sources":["../../../src/adapter/sync/useObjectSetWatcherSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { OntologyConfig, OntologyConfigAdapter } from "@party-stack/ontology";
2
+ export interface FoundryOntologyConfigAdapterOpts {
3
+ foundryUrl: string;
4
+ foundryOntologyRid: string;
5
+ foundryClientId: string;
6
+ foundryRedirectUrl: string;
7
+ }
8
+ export declare const foundryOntologyConfigAdapter: OntologyConfigAdapter<FoundryOntologyConfigAdapterOpts | undefined>;
9
+ export type FoundryOntologyConfig = OntologyConfig<FoundryOntologyConfigAdapterOpts>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAMnF,MAAM,WAAW,gCAAgC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AA+BD,eAAO,MAAM,4BAA4B,EAAE,qBAAqB,CAC5D,gCAAgC,GAAG,SAAS,CAW/C,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,gCAAgC,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { performLocalOAuthFlow } from "@bobbyfidz/local-oauth-flow";
2
+ import { invariant } from "@bobbyfidz/panic";
3
+ import { createFoundryMetaOntologyAdapter } from "../meta/createOntologyMetadataCollections.js";
4
+ import { createOntologyClient } from "../utils/client.js";
5
+ const DEFAULT_FOUNDRY_SCOPES = ["api:read-data", "offline_access"];
6
+ async function createFoundryOntologyClient(config) {
7
+ const { accessToken } = await performLocalOAuthFlow({
8
+ issuerUrl: `${config.foundryUrl}/multipass/api`,
9
+ authorizationUrl: `${config.foundryUrl}/multipass/api/oauth2/authorize`,
10
+ tokenUrl: `${config.foundryUrl}/multipass/api/oauth2/token`,
11
+ clientId: config.foundryClientId,
12
+ redirectUrl: config.foundryRedirectUrl,
13
+ scopes: DEFAULT_FOUNDRY_SCOPES,
14
+ });
15
+ return createOntologyClient({
16
+ baseUrl: config.foundryUrl,
17
+ ontologyRid: config.foundryOntologyRid,
18
+ tokenProvider: () => Promise.resolve(accessToken),
19
+ });
20
+ }
21
+ function getDefaultEnvValue(key) {
22
+ const value = process.env[key] ??
23
+ process.env[`NEXT_PUBLIC_${key}`] ??
24
+ process.env[`VITE_PUBLIC_${key}`] ??
25
+ process.env[`EXPO_PUBLIC_${key}`];
26
+ invariant(value);
27
+ return value;
28
+ }
29
+ export const foundryOntologyConfigAdapter = {
30
+ createAdapter: async (opts) => {
31
+ const client = await createFoundryOntologyClient({
32
+ foundryUrl: opts?.foundryUrl ?? getDefaultEnvValue("FOUNDRY_URL"),
33
+ foundryOntologyRid: opts?.foundryOntologyRid ?? getDefaultEnvValue("FOUNDRY_ONTOLOGY_RID"),
34
+ foundryClientId: opts?.foundryClientId ?? getDefaultEnvValue("FOUNDRY_CLIENT_ID"),
35
+ foundryRedirectUrl: opts?.foundryRedirectUrl ?? getDefaultEnvValue("FOUNDRY_REDIRECT_URL"),
36
+ });
37
+ return createFoundryMetaOntologyAdapter({ client });
38
+ },
39
+ };
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,gCAAgC,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAuB,MAAM,oBAAoB,CAAC;AAE/E,MAAM,sBAAsB,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AASnE,KAAK,UAAU,2BAA2B,CACtC,MAAwC;IAExC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,qBAAqB,CAAC;QAChD,SAAS,EAAE,GAAG,MAAM,CAAC,UAAU,gBAAgB;QAC/C,gBAAgB,EAAE,GAAG,MAAM,CAAC,UAAU,iCAAiC;QACvE,QAAQ,EAAE,GAAG,MAAM,CAAC,UAAU,6BAA6B;QAC3D,QAAQ,EAAE,MAAM,CAAC,eAAe;QAChC,WAAW,EAAE,MAAM,CAAC,kBAAkB;QACtC,MAAM,EAAE,sBAAsB;KACjC,CAAC,CAAC;IAEH,OAAO,oBAAoB,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC,UAAU;QAC1B,WAAW,EAAE,MAAM,CAAC,kBAAkB;QACtC,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;KACpD,CAAC,CAAC;AACP,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACnC,MAAM,KAAK,GACP,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;IACtC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAErC;IACA,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;YAC7C,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,kBAAkB,CAAC,aAAa,CAAC;YACjE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,IAAI,kBAAkB,CAAC,sBAAsB,CAAC;YAC1F,eAAe,EAAE,IAAI,EAAE,eAAe,IAAI,kBAAkB,CAAC,mBAAmB,CAAC;YACjF,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,IAAI,kBAAkB,CAAC,sBAAsB,CAAC;SAC7F,CAAC,CAAC;QACH,OAAO,gCAAgC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;CACJ,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./utils/client";
2
+ export * from "./adapter";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./utils/client";
2
+ export * from "./adapter";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { OntologyAdapter } from "@party-stack/ontology";
2
+ import type { OntologyClient } from "../utils/client.js";
3
+ export interface CreateOntologyMetadataCollectionsOpts {
4
+ client: OntologyClient;
5
+ }
6
+ export declare function createFoundryMetaOntologyAdapter(opts: CreateOntologyMetadataCollectionsOpts): OntologyAdapter;
7
+ //# sourceMappingURL=createOntologyMetadataCollections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createOntologyMetadataCollections.d.ts","sourceRoot":"","sources":["../../src/meta/createOntologyMetadataCollections.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAGR,eAAe,EAMlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,qCAAqC;IAClD,MAAM,EAAE,cAAc,CAAC;CAC1B;AAOD,wBAAgB,gCAAgC,CAC5C,IAAI,EAAE,qCAAqC,GAC5C,eAAe,CAiEjB"}