@graphprotocol/hypergraph 0.0.1 → 0.0.2
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.
- package/dist/connect/abis/MainVotingPlugin.json +1865 -0
- package/dist/connect/abis/PersonalSpaceAdminPlugin.json +531 -0
- package/dist/connect/abis.d.ts +115 -0
- package/dist/connect/abis.d.ts.map +1 -0
- package/dist/connect/abis.js +141 -0
- package/dist/connect/abis.js.map +1 -0
- package/dist/connect/auth-storage.d.ts +15 -0
- package/dist/connect/auth-storage.js +53 -0
- package/dist/connect/auth-storage.js.map +1 -0
- package/dist/connect/create-app-identity.d.ts +7 -0
- package/dist/connect/create-app-identity.js +15 -0
- package/dist/connect/create-app-identity.js.map +1 -0
- package/dist/connect/create-auth-url.d.ts +15 -0
- package/dist/connect/create-callback-params.d.ts +28 -0
- package/dist/connect/create-callback-params.d.ts.map +1 -1
- package/dist/connect/create-callback-params.js.map +1 -1
- package/dist/connect/create-identity-keys.d.ts +3 -0
- package/dist/connect/create-identity-keys.js +20 -0
- package/dist/connect/create-identity-keys.js.map +1 -0
- package/dist/connect/identity-encryption.d.ts +12 -0
- package/dist/connect/identity-encryption.d.ts.map +1 -1
- package/dist/connect/identity-encryption.js +187 -0
- package/dist/connect/identity-encryption.js.map +1 -0
- package/dist/connect/index.d.ts +11 -0
- package/dist/connect/index.d.ts.map +1 -1
- package/dist/connect/index.js +11 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/login.d.ts +22 -0
- package/dist/connect/login.d.ts.map +1 -1
- package/dist/connect/login.js +172 -0
- package/dist/connect/login.js.map +1 -0
- package/dist/connect/parse-auth-params.d.ts +14 -0
- package/dist/connect/parse-auth-params.d.ts.map +1 -0
- package/dist/connect/parse-auth-params.js +40 -0
- package/dist/connect/parse-auth-params.js.map +1 -0
- package/dist/connect/parse-callback-params.d.ts +13 -0
- package/dist/connect/parse-callback-params.d.ts.map +1 -1
- package/dist/connect/parse-callback-params.js +4 -1
- package/dist/connect/parse-callback-params.js.map +1 -1
- package/dist/connect/smart-account.d.ts +96 -0
- package/dist/connect/smart-account.d.ts.map +1 -0
- package/dist/connect/smart-account.js +761 -0
- package/dist/connect/smart-account.js.map +1 -0
- package/dist/connect/types.d.ts +2 -0
- package/dist/connect/types.d.ts.map +1 -1
- package/dist/connect/types.js.map +1 -1
- package/dist/entity/create.d.ts +8 -0
- package/dist/entity/create.js +51 -0
- package/dist/entity/create.js.map +1 -0
- package/dist/entity/decodedEntitiesCache.d.ts +23 -0
- package/dist/entity/decodedEntitiesCache.d.ts.map +1 -1
- package/dist/entity/decodedEntitiesCache.js +2 -0
- package/dist/entity/decodedEntitiesCache.js.map +1 -0
- package/dist/entity/delete.d.ts +12 -0
- package/dist/entity/delete.js +44 -0
- package/dist/entity/delete.js.map +1 -0
- package/dist/entity/entity.d.ts +18 -0
- package/dist/entity/entity.js +19 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/entityRelationParentsMap.d.ts +4 -0
- package/dist/entity/entityRelationParentsMap.js +2 -0
- package/dist/entity/entityRelationParentsMap.js.map +1 -0
- package/dist/entity/findMany.d.ts +22 -0
- package/dist/entity/findMany.d.ts.map +1 -1
- package/dist/entity/findMany.js +8 -8
- package/dist/entity/findMany.js.map +1 -1
- package/dist/entity/findOne.d.ts +8 -0
- package/dist/entity/findOne.js +31 -0
- package/dist/entity/findOne.js.map +1 -0
- package/dist/entity/getEntityRelations.d.ts +4 -0
- package/dist/entity/getEntityRelations.d.ts.map +1 -1
- package/dist/entity/getEntityRelations.js +35 -0
- package/dist/entity/getEntityRelations.js.map +1 -0
- package/dist/entity/hasValidTypesProperty.d.ts +2 -0
- package/dist/entity/hasValidTypesProperty.d.ts.map +1 -0
- package/dist/entity/hasValidTypesProperty.js +4 -0
- package/dist/entity/hasValidTypesProperty.js.map +1 -0
- package/dist/entity/index.d.ts +9 -0
- package/dist/entity/index.js +9 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/relationParentsMap.d.ts +4 -0
- package/dist/entity/relationParentsMap.js +2 -0
- package/dist/entity/relationParentsMap.js.map +1 -0
- package/dist/entity/removeRelation.d.ts +7 -0
- package/dist/entity/removeRelation.js +17 -0
- package/dist/entity/removeRelation.js.map +1 -0
- package/dist/entity/test.d.ts +2 -0
- package/dist/entity/test.d.ts.map +1 -0
- package/dist/entity/test.js +2 -0
- package/dist/entity/test.js.map +1 -0
- package/dist/entity/types.d.ts +8 -8
- package/dist/entity/update.d.ts +8 -0
- package/dist/entity/update.js +58 -0
- package/dist/entity/update.js.map +1 -0
- package/dist/entity/variant-schema.d.ts +247 -0
- package/dist/entity/variant-schema.d.ts.map +1 -0
- package/dist/entity/variant-schema.js +204 -0
- package/dist/entity/variant-schema.js.map +1 -0
- package/dist/identity/auth-storage.d.ts +6 -0
- package/dist/identity/auth-storage.d.ts.map +1 -1
- package/dist/identity/auth-storage.js +52 -0
- package/dist/identity/auth-storage.js.map +1 -0
- package/dist/identity/get-verified-identity.d.ts +7 -0
- package/dist/identity/get-verified-identity.d.ts.map +1 -1
- package/dist/identity/get-verified-identity.js +37 -0
- package/dist/identity/get-verified-identity.js.map +1 -0
- package/dist/identity/identity-encryption.d.ts +7 -0
- package/dist/identity/identity-encryption.js +120 -0
- package/dist/identity/identity-encryption.js.map +1 -0
- package/dist/identity/index.d.ts +7 -0
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +7 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/logout.d.ts +3 -0
- package/dist/identity/logout.js +9 -0
- package/dist/identity/logout.js.map +1 -0
- package/dist/identity/prove-ownership.d.ts +15 -0
- package/dist/identity/prove-ownership.d.ts.map +1 -1
- package/dist/identity/prove-ownership.js +90 -0
- package/dist/identity/prove-ownership.js.map +1 -0
- package/dist/identity/types.d.ts +37 -0
- package/dist/identity/types.d.ts.map +1 -0
- package/dist/identity/types.js +11 -0
- package/dist/identity/types.js.map +1 -0
- package/dist/inboxes/create-inbox.d.ts +22 -0
- package/dist/inboxes/create-inbox.js +76 -0
- package/dist/inboxes/create-inbox.js.map +1 -0
- package/dist/inboxes/get-list-inboxes.d.ts +20 -0
- package/dist/inboxes/get-list-inboxes.js +45 -0
- package/dist/inboxes/get-list-inboxes.js.map +1 -0
- package/dist/inboxes/index.d.ts +11 -0
- package/dist/inboxes/index.js +11 -0
- package/dist/inboxes/index.js.map +1 -0
- package/dist/inboxes/merge-messages.d.ts +6 -0
- package/dist/inboxes/merge-messages.js +23 -0
- package/dist/inboxes/merge-messages.js.map +1 -0
- package/dist/inboxes/message-encryption.d.ts +15 -0
- package/dist/inboxes/message-encryption.js +29 -0
- package/dist/inboxes/message-encryption.js.map +1 -0
- package/dist/inboxes/message-validation.d.ts +6 -0
- package/dist/inboxes/message-validation.d.ts.map +1 -1
- package/dist/inboxes/message-validation.js +53 -0
- package/dist/inboxes/message-validation.js.map +1 -0
- package/dist/inboxes/prepare-message.d.ts +2 -2
- package/dist/inboxes/prepare-message.js +78 -0
- package/dist/inboxes/prepare-message.js.map +1 -0
- package/dist/inboxes/recover-inbox-creator.d.ts +5 -0
- package/dist/inboxes/recover-inbox-creator.js +24 -0
- package/dist/inboxes/recover-inbox-creator.js.map +1 -0
- package/dist/inboxes/recover-inbox-message-signer.d.ts +4 -0
- package/dist/inboxes/recover-inbox-message-signer.js +32 -0
- package/dist/inboxes/recover-inbox-message-signer.js.map +1 -0
- package/dist/inboxes/send-message.d.ts +19 -0
- package/dist/inboxes/send-message.js +58 -0
- package/dist/inboxes/send-message.js.map +1 -0
- package/dist/inboxes/types.d.ts +4 -0
- package/dist/inboxes/types.d.ts.map +1 -0
- package/dist/inboxes/types.js +3 -0
- package/dist/inboxes/types.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/key/create-key.d.ts +11 -0
- package/dist/key/create-key.d.ts.map +1 -0
- package/dist/key/create-key.js +22 -0
- package/dist/key/create-key.js.map +1 -0
- package/dist/key/decrypt-key.d.ts +9 -0
- package/dist/key/decrypt-key.d.ts.map +1 -0
- package/dist/key/decrypt-key.js +16 -0
- package/dist/key/decrypt-key.js.map +1 -0
- package/dist/key/encrypt-key.d.ts +11 -0
- package/dist/key/encrypt-key.d.ts.map +1 -0
- package/dist/key/encrypt-key.js +20 -0
- package/dist/key/encrypt-key.js.map +1 -0
- package/dist/key/index.d.ts +5 -0
- package/dist/key/index.d.ts.map +1 -0
- package/dist/key/index.js +5 -0
- package/dist/key/index.js.map +1 -0
- package/dist/key/key-box.d.ts +19 -0
- package/dist/key/key-box.d.ts.map +1 -0
- package/dist/key/key-box.js +38 -0
- package/dist/key/key-box.js.map +1 -0
- package/dist/messages/decrypt-message.d.ts +7 -0
- package/dist/messages/decrypt-message.d.ts.map +1 -0
- package/dist/messages/decrypt-message.js +11 -0
- package/dist/messages/decrypt-message.js.map +1 -0
- package/dist/messages/encrypt-message.d.ts +7 -0
- package/dist/messages/encrypt-message.d.ts.map +1 -0
- package/dist/messages/encrypt-message.js +12 -0
- package/dist/messages/encrypt-message.js.map +1 -0
- package/dist/messages/index.d.ts +6 -0
- package/dist/messages/index.js +6 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/messages/serialize.d.ts +3 -0
- package/dist/messages/serialize.d.ts.map +1 -0
- package/dist/messages/serialize.js +30 -0
- package/dist/messages/serialize.js.map +1 -0
- package/dist/messages/signed-update-message.d.ts +23 -0
- package/dist/messages/signed-update-message.js +56 -0
- package/dist/messages/signed-update-message.js.map +1 -0
- package/dist/messages/types.d.ts +1268 -0
- package/dist/messages/types.d.ts.map +1 -1
- package/dist/messages/types.js +312 -0
- package/dist/messages/types.js.map +1 -0
- package/dist/space-events/accept-invitation.d.ts +9 -0
- package/dist/space-events/accept-invitation.js +28 -0
- package/dist/space-events/accept-invitation.js.map +1 -0
- package/dist/space-events/apply-event.d.ts +11 -0
- package/dist/space-events/apply-event.js +130 -0
- package/dist/space-events/apply-event.js.map +1 -0
- package/dist/space-events/create-inbox.d.ts +14 -0
- package/dist/space-events/create-inbox.js +41 -0
- package/dist/space-events/create-inbox.js.map +1 -0
- package/dist/space-events/create-invitation.d.ts +12 -0
- package/dist/space-events/create-invitation.js +30 -0
- package/dist/space-events/create-invitation.js.map +1 -0
- package/dist/space-events/create-space.d.ts +9 -0
- package/dist/space-events/create-space.js +29 -0
- package/dist/space-events/create-space.js.map +1 -0
- package/dist/space-events/delete-space.d.ts +10 -0
- package/dist/space-events/delete-space.js +30 -0
- package/dist/space-events/delete-space.js.map +1 -0
- package/dist/space-events/hash-event.d.ts +3 -0
- package/dist/space-events/hash-event.js +7 -0
- package/dist/space-events/hash-event.js.map +1 -0
- package/dist/space-events/index.d.ts +9 -0
- package/dist/space-events/index.js +9 -0
- package/dist/space-events/index.js.map +1 -0
- package/dist/space-events/types.d.ts +222 -0
- package/dist/space-events/types.d.ts.map +1 -0
- package/dist/space-events/types.js +102 -0
- package/dist/space-events/types.js.map +1 -0
- package/dist/space-info/decrypt-space-info.d.ts +7 -0
- package/dist/space-info/decrypt-space-info.js +18 -0
- package/dist/space-info/decrypt-space-info.js.map +1 -0
- package/dist/space-info/encrypt-and-sign-space-info.d.ts +17 -0
- package/dist/space-info/encrypt-and-sign-space-info.js +39 -0
- package/dist/space-info/encrypt-and-sign-space-info.js.map +1 -0
- package/dist/space-info/index.d.ts +4 -0
- package/dist/space-info/index.js +4 -0
- package/dist/space-info/index.js.map +1 -0
- package/dist/space-info/types.d.ts +6 -0
- package/dist/space-info/types.d.ts.map +1 -0
- package/dist/space-info/types.js +5 -0
- package/dist/space-info/types.js.map +1 -0
- package/dist/store-connect.d.ts +149 -0
- package/dist/store-connect.d.ts.map +1 -1
- package/dist/store-connect.js +289 -0
- package/dist/store-connect.js.map +1 -0
- package/dist/store.d.ts +158 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +354 -0
- package/dist/store.js.map +1 -0
- package/dist/type/type.d.ts +14 -0
- package/dist/type/type.d.ts.map +1 -1
- package/dist/type/type.js +25 -0
- package/dist/type/type.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/assertExhaustive.d.ts +2 -0
- package/dist/utils/assertExhaustive.d.ts.map +1 -0
- package/dist/utils/assertExhaustive.js +4 -0
- package/dist/utils/assertExhaustive.js.map +1 -0
- package/dist/utils/automergeId.d.ts +1 -1
- package/dist/utils/automergeId.d.ts.map +1 -1
- package/dist/utils/automergeId.js +1 -1
- package/dist/utils/automergeId.js.map +1 -1
- package/dist/utils/base58.d.ts +36 -0
- package/dist/utils/base58.d.ts.map +1 -0
- package/dist/utils/base58.js +62 -0
- package/dist/utils/base58.js.map +1 -0
- package/dist/utils/hexBytesAddressUtils.d.ts +4 -0
- package/dist/utils/hexBytesAddressUtils.d.ts.map +1 -0
- package/dist/utils/hexBytesAddressUtils.js +21 -0
- package/dist/utils/hexBytesAddressUtils.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/internal/base58Utils.d.ts +4 -0
- package/dist/utils/internal/base58Utils.d.ts.map +1 -0
- package/dist/utils/internal/base58Utils.js +40 -0
- package/dist/utils/internal/base58Utils.js.map +1 -0
- package/dist/utils/internal/deep-merge.d.ts +7 -0
- package/dist/utils/internal/deep-merge.d.ts.map +1 -0
- package/dist/utils/internal/deep-merge.js +33 -0
- package/dist/utils/internal/deep-merge.js.map +1 -0
- package/dist/utils/isRelationField.d.ts +3 -0
- package/dist/utils/isRelationField.d.ts.map +1 -0
- package/dist/utils/isRelationField.js +8 -0
- package/dist/utils/isRelationField.js.map +1 -0
- package/dist/utils/jsc.d.ts +49 -0
- package/dist/utils/jsc.d.ts.map +1 -0
- package/dist/utils/jsc.js +88 -0
- package/dist/utils/jsc.js.map +1 -0
- package/dist/utils/stringToUint8Array.d.ts +3 -0
- package/dist/utils/stringToUint8Array.d.ts.map +1 -0
- package/dist/utils/stringToUint8Array.js +9 -0
- package/dist/utils/stringToUint8Array.js.map +1 -0
- package/package.json +5 -2
- package/src/connect/abis/MainVotingPlugin.json +1865 -0
- package/src/connect/abis/PersonalSpaceAdminPlugin.json +531 -0
- package/src/connect/abis.ts +183 -0
- package/src/connect/create-callback-params.ts +4 -1
- package/src/connect/identity-encryption.ts +10 -14
- package/src/connect/index.ts +1 -1
- package/src/connect/login.ts +106 -18
- package/src/connect/parse-callback-params.ts +4 -1
- package/src/connect/smart-account.ts +915 -0
- package/src/connect/types.ts +2 -0
- package/src/entity/decodedEntitiesCache.ts +1 -1
- package/src/entity/findMany.ts +16 -14
- package/src/entity/getEntityRelations.ts +1 -1
- package/src/entity/types.ts +8 -8
- package/src/identity/auth-storage.ts +11 -1
- package/src/identity/get-verified-identity.ts +6 -1
- package/src/identity/index.ts +1 -1
- package/src/identity/prove-ownership.ts +52 -8
- package/src/inboxes/message-validation.ts +17 -2
- package/src/messages/types.ts +6 -0
- package/src/store-connect.ts +1 -52
- package/src/store.ts +78 -48
- package/src/type/type.ts +4 -2
- package/src/types.ts +19 -1
- package/src/utils/automergeId.ts +1 -1
- package/dist/connect/prove-ownership.d.ts.map +0 -1
- package/src/connect/prove-ownership.ts +0 -58
package/src/connect/types.ts
CHANGED
|
@@ -58,8 +58,10 @@ export type PublicAppIdentity = {
|
|
|
58
58
|
export type PrivateAppIdentity = IdentityKeys & {
|
|
59
59
|
address: string;
|
|
60
60
|
addressPrivateKey: string;
|
|
61
|
+
permissionId: string;
|
|
61
62
|
sessionToken: string;
|
|
62
63
|
sessionTokenExpires: Date;
|
|
64
|
+
accountAddress: string;
|
|
63
65
|
};
|
|
64
66
|
|
|
65
67
|
export class InvalidIdentityError {
|
|
@@ -5,7 +5,7 @@ export type QueryEntry = {
|
|
|
5
5
|
data: Array<Entity<AnyNoContext>>; // holds the decoded entities of this query and must be a stable reference and use the same reference for the `entities` array
|
|
6
6
|
listeners: Array<() => void>; // listeners to this query
|
|
7
7
|
isInvalidated: boolean;
|
|
8
|
-
include: { [K in keyof Schema.Schema.Type<AnyNoContext>]?: Record<string, never
|
|
8
|
+
include: { [K in keyof Schema.Schema.Type<AnyNoContext>]?: Record<string, Record<string, never>> };
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
export type DecodedEntitiesCacheEntry = {
|
package/src/entity/findMany.ts
CHANGED
|
@@ -239,7 +239,7 @@ export function findMany<const S extends AnyNoContext>(
|
|
|
239
239
|
handle: DocHandle<DocumentContent>,
|
|
240
240
|
type: S,
|
|
241
241
|
filter: EntityFilter<Schema.Schema.Type<S>> | undefined,
|
|
242
|
-
include: { [K in keyof Schema.Schema.Type<S>]?: Record<string, never
|
|
242
|
+
include: { [K in keyof Schema.Schema.Type<S>]?: Record<string, Record<string, never>> } | undefined,
|
|
243
243
|
): { entities: Readonly<Array<Entity<S>>>; corruptEntityIds: Readonly<Array<string>> } {
|
|
244
244
|
const decode = Schema.decodeUnknownSync(type);
|
|
245
245
|
// TODO: what's the right way to get the name of the type?
|
|
@@ -256,13 +256,13 @@ export function findMany<const S extends AnyNoContext>(
|
|
|
256
256
|
|
|
257
257
|
const evaluateFilter = <T>(fieldFilter: EntityFieldFilter<T>, fieldValue: T): boolean => {
|
|
258
258
|
// Handle NOT operator
|
|
259
|
-
if ('
|
|
260
|
-
return !evaluateFilter(fieldFilter.
|
|
259
|
+
if ('not' in fieldFilter && fieldFilter.not) {
|
|
260
|
+
return !evaluateFilter(fieldFilter.not, fieldValue);
|
|
261
261
|
}
|
|
262
262
|
|
|
263
263
|
// Handle OR operator
|
|
264
|
-
if ('
|
|
265
|
-
const orFilters = fieldFilter.
|
|
264
|
+
if ('or' in fieldFilter) {
|
|
265
|
+
const orFilters = fieldFilter.or;
|
|
266
266
|
if (Array.isArray(orFilters)) {
|
|
267
267
|
return orFilters.some((orFilter) => evaluateFilter(orFilter as EntityFieldFilter<T>, fieldValue));
|
|
268
268
|
}
|
|
@@ -337,13 +337,13 @@ export function findMany<const S extends AnyNoContext>(
|
|
|
337
337
|
|
|
338
338
|
const evaluateEntityFilter = (entityFilter: EntityFilter<Schema.Schema.Type<S>>, entity: Entity<S>): boolean => {
|
|
339
339
|
// handle top-level NOT operator
|
|
340
|
-
if ('
|
|
341
|
-
return !evaluateCrossFieldFilter(entityFilter.
|
|
340
|
+
if ('not' in entityFilter && entityFilter.not) {
|
|
341
|
+
return !evaluateCrossFieldFilter(entityFilter.not, entity);
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
// handle top-level OR operator
|
|
345
|
-
if ('
|
|
346
|
-
return entityFilter.
|
|
345
|
+
if ('or' in entityFilter && Array.isArray(entityFilter.or)) {
|
|
346
|
+
return entityFilter.or.some((orFilter) => evaluateCrossFieldFilter(orFilter, entity));
|
|
347
347
|
}
|
|
348
348
|
|
|
349
349
|
// evaluate regular field filters
|
|
@@ -374,15 +374,17 @@ export function findMany<const S extends AnyNoContext>(
|
|
|
374
374
|
|
|
375
375
|
const stableEmptyArray: Array<unknown> = [];
|
|
376
376
|
|
|
377
|
+
export type FindManySubscription<S extends AnyNoContext> = {
|
|
378
|
+
subscribe: (callback: () => void) => () => void;
|
|
379
|
+
getEntities: () => Readonly<Array<Entity<S>>>;
|
|
380
|
+
};
|
|
381
|
+
|
|
377
382
|
export function subscribeToFindMany<const S extends AnyNoContext>(
|
|
378
383
|
handle: DocHandle<DocumentContent>,
|
|
379
384
|
type: S,
|
|
380
385
|
filter: { [K in keyof Schema.Schema.Type<S>]?: EntityFieldFilter<Schema.Schema.Type<S>[K]> } | undefined,
|
|
381
|
-
include: { [K in keyof Schema.Schema.Type<S>]?: Record<string, never
|
|
382
|
-
): {
|
|
383
|
-
subscribe: (callback: () => void) => () => void;
|
|
384
|
-
getEntities: () => Readonly<Array<Entity<S>>>;
|
|
385
|
-
} {
|
|
386
|
+
include: { [K in keyof Schema.Schema.Type<S>]?: Record<string, Record<string, never>> } | undefined,
|
|
387
|
+
): FindManySubscription<S> {
|
|
386
388
|
const queryKey = filter ? canonicalize(filter) : 'all';
|
|
387
389
|
const decode = Schema.decodeUnknownSync(type);
|
|
388
390
|
// TODO: what's the right way to get the name of the type?
|
|
@@ -6,7 +6,7 @@ export const getEntityRelations = <const S extends AnyNoContext>(
|
|
|
6
6
|
entityId: string,
|
|
7
7
|
type: S,
|
|
8
8
|
doc: DocumentContent,
|
|
9
|
-
include: { [K in keyof Schema.Schema.Type<S>]?: Record<string, never
|
|
9
|
+
include: { [K in keyof Schema.Schema.Type<S>]?: Record<string, Record<string, never>> } | undefined,
|
|
10
10
|
) => {
|
|
11
11
|
const relations: Record<string, Entity<AnyNoContext>> = {};
|
|
12
12
|
for (const [fieldName, field] of Object.entries(type.fields)) {
|
package/src/entity/types.ts
CHANGED
|
@@ -55,8 +55,8 @@ export type EntityNumberFilter = {
|
|
|
55
55
|
is?: number;
|
|
56
56
|
greaterThan?: number;
|
|
57
57
|
lessThan?: number;
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
not?: EntityNumberFilter;
|
|
59
|
+
or?: EntityNumberFilter[];
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
export type EntityTextFilter = {
|
|
@@ -65,21 +65,21 @@ export type EntityTextFilter = {
|
|
|
65
65
|
endsWith?: string;
|
|
66
66
|
contains?: string;
|
|
67
67
|
equals?: string;
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
not?: EntityTextFilter;
|
|
69
|
+
or?: EntityTextFilter[];
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
export type CrossFieldFilter<T> = {
|
|
73
73
|
[K in keyof T]?: EntityFieldFilter<T[K]>;
|
|
74
74
|
} & {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
or?: Array<CrossFieldFilter<T>>;
|
|
76
|
+
not?: CrossFieldFilter<T>;
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
export type EntityFieldFilter<T> = {
|
|
80
80
|
is?: T;
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
not?: EntityFieldFilter<T>;
|
|
82
|
+
or?: Array<EntityFieldFilter<T>>;
|
|
83
83
|
} & (T extends boolean
|
|
84
84
|
? {
|
|
85
85
|
is?: boolean;
|
|
@@ -4,54 +4,64 @@ import type { Storage } from './types.js';
|
|
|
4
4
|
export const storeIdentity = (storage: Storage, identity: PrivateAppIdentity) => {
|
|
5
5
|
storage.setItem('hypergraph:app-identity-address', identity.address);
|
|
6
6
|
storage.setItem('hypergraph:app-identity-address-private-key', identity.addressPrivateKey);
|
|
7
|
+
storage.setItem('hypergraph:app-identity-account-address', identity.accountAddress);
|
|
7
8
|
storage.setItem('hypergraph:signature-public-key', identity.signaturePublicKey);
|
|
8
9
|
storage.setItem('hypergraph:signature-private-key', identity.signaturePrivateKey);
|
|
9
10
|
storage.setItem('hypergraph:encryption-public-key', identity.encryptionPublicKey);
|
|
10
11
|
storage.setItem('hypergraph:encryption-private-key', identity.encryptionPrivateKey);
|
|
11
12
|
storage.setItem('hypergraph:session-token', identity.sessionToken);
|
|
12
13
|
storage.setItem('hypergraph:session-token-expires', identity.sessionTokenExpires.toISOString());
|
|
14
|
+
storage.setItem('hypergraph:permission-id', identity.permissionId);
|
|
13
15
|
};
|
|
14
16
|
|
|
15
17
|
export const loadIdentity = (storage: Storage): PrivateAppIdentity | null => {
|
|
16
18
|
const address = storage.getItem('hypergraph:app-identity-address');
|
|
17
19
|
const addressPrivateKey = storage.getItem('hypergraph:app-identity-address-private-key');
|
|
20
|
+
const accountAddress = storage.getItem('hypergraph:app-identity-account-address');
|
|
18
21
|
const signaturePublicKey = storage.getItem('hypergraph:signature-public-key');
|
|
19
22
|
const signaturePrivateKey = storage.getItem('hypergraph:signature-private-key');
|
|
20
23
|
const encryptionPublicKey = storage.getItem('hypergraph:encryption-public-key');
|
|
21
24
|
const encryptionPrivateKey = storage.getItem('hypergraph:encryption-private-key');
|
|
22
25
|
const sessionToken = storage.getItem('hypergraph:session-token');
|
|
23
26
|
const sessionTokenExpires = storage.getItem('hypergraph:session-token-expires');
|
|
27
|
+
const permissionId = storage.getItem('hypergraph:permission-id');
|
|
24
28
|
if (
|
|
25
29
|
!address ||
|
|
26
30
|
!addressPrivateKey ||
|
|
31
|
+
!accountAddress ||
|
|
27
32
|
!signaturePublicKey ||
|
|
28
33
|
!signaturePrivateKey ||
|
|
29
34
|
!encryptionPublicKey ||
|
|
30
35
|
!encryptionPrivateKey ||
|
|
31
36
|
!sessionToken ||
|
|
32
|
-
!sessionTokenExpires
|
|
37
|
+
!sessionTokenExpires ||
|
|
38
|
+
!permissionId
|
|
33
39
|
) {
|
|
34
40
|
return null;
|
|
35
41
|
}
|
|
36
42
|
return {
|
|
37
43
|
address,
|
|
38
44
|
addressPrivateKey,
|
|
45
|
+
accountAddress,
|
|
39
46
|
signaturePublicKey,
|
|
40
47
|
signaturePrivateKey,
|
|
41
48
|
encryptionPublicKey,
|
|
42
49
|
encryptionPrivateKey,
|
|
43
50
|
sessionToken,
|
|
44
51
|
sessionTokenExpires: new Date(sessionTokenExpires),
|
|
52
|
+
permissionId,
|
|
45
53
|
};
|
|
46
54
|
};
|
|
47
55
|
|
|
48
56
|
export const wipeIdentity = (storage: Storage) => {
|
|
49
57
|
storage.removeItem('hypergraph:app-identity-address');
|
|
50
58
|
storage.removeItem('hypergraph:app-identity-address-private-key');
|
|
59
|
+
storage.removeItem('hypergraph:app-identity-account-address');
|
|
51
60
|
storage.removeItem('hypergraph:signature-public-key');
|
|
52
61
|
storage.removeItem('hypergraph:signature-private-key');
|
|
53
62
|
storage.removeItem('hypergraph:encryption-public-key');
|
|
54
63
|
storage.removeItem('hypergraph:encryption-private-key');
|
|
55
64
|
storage.removeItem('hypergraph:session-token');
|
|
56
65
|
storage.removeItem('hypergraph:session-token-expires');
|
|
66
|
+
storage.removeItem('hypergraph:permission-id');
|
|
57
67
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Schema from 'effect/Schema';
|
|
2
|
+
import type { Chain } from 'viem';
|
|
2
3
|
import * as Messages from '../messages/index.js';
|
|
3
4
|
import { store } from '../store.js';
|
|
4
5
|
import { verifyIdentityOwnership } from './prove-ownership.js';
|
|
@@ -6,6 +7,8 @@ import { verifyIdentityOwnership } from './prove-ownership.js';
|
|
|
6
7
|
export const getVerifiedIdentity = async (
|
|
7
8
|
accountAddress: string,
|
|
8
9
|
syncServerUri: string,
|
|
10
|
+
chain: Chain,
|
|
11
|
+
rpcUrl: string,
|
|
9
12
|
): Promise<{
|
|
10
13
|
accountAddress: string;
|
|
11
14
|
encryptionPublicKey: string;
|
|
@@ -32,9 +35,11 @@ export const getVerifiedIdentity = async (
|
|
|
32
35
|
resDecoded.signaturePublicKey,
|
|
33
36
|
resDecoded.accountProof,
|
|
34
37
|
resDecoded.keyProof,
|
|
38
|
+
chain,
|
|
39
|
+
rpcUrl,
|
|
35
40
|
))
|
|
36
41
|
) {
|
|
37
|
-
throw new Error('Invalid identity');
|
|
42
|
+
throw new Error('Invalid identity in getVerifiedIdentity');
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
store.send({
|
package/src/identity/index.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { type Hex, verifyMessage } from 'viem';
|
|
1
|
+
import { http, type Chain, type Hex, type WalletClient, createPublicClient, verifyMessage } from 'viem';
|
|
2
2
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
3
3
|
|
|
4
|
+
import type { SmartAccountClient } from 'permissionless';
|
|
4
5
|
import { publicKeyToAddress } from '../utils/index.js';
|
|
5
|
-
import type { IdentityKeys
|
|
6
|
+
import type { IdentityKeys } from './types.js';
|
|
6
7
|
|
|
7
8
|
export const getAccountProofMessage = (accountAddress: string, publicKey: string): string => {
|
|
8
9
|
return `This message proves I am the owner of the account ${accountAddress} and the public key ${publicKey}`;
|
|
@@ -12,15 +13,37 @@ export const getKeyProofMessage = (accountAddress: string, publicKey: string): s
|
|
|
12
13
|
return `The public key ${publicKey} is owned by the account ${accountAddress}`;
|
|
13
14
|
};
|
|
14
15
|
|
|
16
|
+
export const accountProofDomain = {
|
|
17
|
+
name: 'Hypergraph',
|
|
18
|
+
version: '1',
|
|
19
|
+
};
|
|
20
|
+
|
|
15
21
|
export const proveIdentityOwnership = async (
|
|
16
|
-
|
|
22
|
+
walletClient: WalletClient,
|
|
23
|
+
smartAccountClient: SmartAccountClient,
|
|
17
24
|
accountAddress: string,
|
|
18
25
|
keys: IdentityKeys,
|
|
19
26
|
): Promise<{ accountProof: string; keyProof: string }> => {
|
|
27
|
+
if (!smartAccountClient.account) {
|
|
28
|
+
throw new Error('Smart account client does not have an account');
|
|
29
|
+
}
|
|
30
|
+
if (!smartAccountClient.chain) {
|
|
31
|
+
throw new Error('Smart account client does not have a chain');
|
|
32
|
+
}
|
|
20
33
|
const publicKey = keys.signaturePublicKey;
|
|
21
|
-
const accountProofMessage = getAccountProofMessage(accountAddress, publicKey);
|
|
22
34
|
const keyProofMessage = getKeyProofMessage(accountAddress, publicKey);
|
|
23
|
-
|
|
35
|
+
|
|
36
|
+
const accountProof = await smartAccountClient.account.signTypedData({
|
|
37
|
+
message: {
|
|
38
|
+
message: getAccountProofMessage(accountAddress, publicKey),
|
|
39
|
+
},
|
|
40
|
+
types: {
|
|
41
|
+
Message: [{ name: 'message', type: 'string' }],
|
|
42
|
+
},
|
|
43
|
+
domain: accountProofDomain,
|
|
44
|
+
primaryType: 'Message',
|
|
45
|
+
});
|
|
46
|
+
console.log('accountProof', accountProof);
|
|
24
47
|
const account = privateKeyToAccount(keys.signaturePrivateKey as Hex);
|
|
25
48
|
const keyProof = await account.signMessage({ message: keyProofMessage });
|
|
26
49
|
return { accountProof, keyProof };
|
|
@@ -31,12 +54,33 @@ export const verifyIdentityOwnership = async (
|
|
|
31
54
|
publicKey: string,
|
|
32
55
|
accountProof: string,
|
|
33
56
|
keyProof: string,
|
|
57
|
+
chain: Chain,
|
|
58
|
+
rpcUrl: string,
|
|
34
59
|
): Promise<boolean> => {
|
|
35
|
-
const accountProofMessage = getAccountProofMessage(accountAddress, publicKey);
|
|
36
60
|
const keyProofMessage = getKeyProofMessage(accountAddress, publicKey);
|
|
37
|
-
const
|
|
61
|
+
const publicClient = createPublicClient({
|
|
62
|
+
chain,
|
|
63
|
+
transport: http(rpcUrl),
|
|
64
|
+
});
|
|
65
|
+
// console.log('publicClient', publicClient);
|
|
66
|
+
// console.log('rpcUrl', rpcUrl);
|
|
67
|
+
// console.log('chain', chain);
|
|
68
|
+
|
|
69
|
+
// console.log('accountProof', accountProof);
|
|
70
|
+
// console.log('accountAddress', accountAddress);
|
|
71
|
+
// console.log('publicKey', publicKey);
|
|
72
|
+
|
|
73
|
+
const accountProofMessage = getAccountProofMessage(accountAddress, publicKey);
|
|
74
|
+
const validAccountProof = await publicClient.verifyTypedData({
|
|
38
75
|
address: accountAddress as Hex,
|
|
39
|
-
message:
|
|
76
|
+
message: {
|
|
77
|
+
message: accountProofMessage,
|
|
78
|
+
},
|
|
79
|
+
types: {
|
|
80
|
+
Message: [{ name: 'message', type: 'string' }],
|
|
81
|
+
},
|
|
82
|
+
domain: accountProofDomain,
|
|
83
|
+
primaryType: 'Message',
|
|
40
84
|
signature: accountProof as Hex,
|
|
41
85
|
});
|
|
42
86
|
if (!validAccountProof) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Chain } from 'viem';
|
|
1
2
|
import * as Identity from '../identity/index.js';
|
|
2
3
|
import type * as Messages from '../messages/index.js';
|
|
3
4
|
import type { AccountInboxStorageEntry, SpaceInboxStorageEntry } from '../store.js';
|
|
@@ -8,6 +9,8 @@ export const validateSpaceInboxMessage = async (
|
|
|
8
9
|
inbox: SpaceInboxStorageEntry,
|
|
9
10
|
spaceId: string,
|
|
10
11
|
syncServerUri: string,
|
|
12
|
+
chain: Chain,
|
|
13
|
+
rpcUrl: string,
|
|
11
14
|
) => {
|
|
12
15
|
if (message.signature) {
|
|
13
16
|
if (inbox.authPolicy === 'anonymous') {
|
|
@@ -19,7 +22,12 @@ export const validateSpaceInboxMessage = async (
|
|
|
19
22
|
return false;
|
|
20
23
|
}
|
|
21
24
|
const signer = recoverSpaceInboxMessageSigner(message, spaceId, inbox.inboxId);
|
|
22
|
-
const verifiedIdentity = await Identity.getVerifiedIdentity(
|
|
25
|
+
const verifiedIdentity = await Identity.getVerifiedIdentity(
|
|
26
|
+
message.authorAccountAddress,
|
|
27
|
+
syncServerUri,
|
|
28
|
+
chain,
|
|
29
|
+
rpcUrl,
|
|
30
|
+
);
|
|
23
31
|
const isValid = signer === verifiedIdentity.signaturePublicKey;
|
|
24
32
|
if (!isValid) {
|
|
25
33
|
console.error('Invalid signature', signer, verifiedIdentity.signaturePublicKey);
|
|
@@ -39,6 +47,8 @@ export const validateAccountInboxMessage = async (
|
|
|
39
47
|
inbox: AccountInboxStorageEntry,
|
|
40
48
|
accountAddress: string,
|
|
41
49
|
syncServerUri: string,
|
|
50
|
+
chain: Chain,
|
|
51
|
+
rpcUrl: string,
|
|
42
52
|
) => {
|
|
43
53
|
if (message.signature) {
|
|
44
54
|
if (inbox.authPolicy === 'anonymous') {
|
|
@@ -50,7 +60,12 @@ export const validateAccountInboxMessage = async (
|
|
|
50
60
|
return false;
|
|
51
61
|
}
|
|
52
62
|
const signer = recoverAccountInboxMessageSigner(message, accountAddress, inbox.inboxId);
|
|
53
|
-
const verifiedIdentity = await Identity.getVerifiedIdentity(
|
|
63
|
+
const verifiedIdentity = await Identity.getVerifiedIdentity(
|
|
64
|
+
message.authorAccountAddress,
|
|
65
|
+
syncServerUri,
|
|
66
|
+
chain,
|
|
67
|
+
rpcUrl,
|
|
68
|
+
);
|
|
54
69
|
const isValid = signer === verifiedIdentity.signaturePublicKey;
|
|
55
70
|
if (!isValid) {
|
|
56
71
|
console.error('Invalid signature', signer, verifiedIdentity.signaturePublicKey);
|
package/src/messages/types.ts
CHANGED
|
@@ -41,6 +41,7 @@ export const KeyBoxWithKeyId = Schema.Struct({
|
|
|
41
41
|
export type KeyBoxWithKeyId = Schema.Schema.Type<typeof KeyBoxWithKeyId>;
|
|
42
42
|
|
|
43
43
|
export const IdentityKeyBox = Schema.Struct({
|
|
44
|
+
signer: Schema.String,
|
|
44
45
|
accountAddress: Schema.String,
|
|
45
46
|
ciphertext: Schema.String,
|
|
46
47
|
nonce: Schema.String,
|
|
@@ -60,6 +61,7 @@ export type RequestCreateSpaceEvent = Schema.Schema.Type<typeof RequestCreateSpa
|
|
|
60
61
|
|
|
61
62
|
export const RequestConnectCreateSpaceEvent = Schema.Struct({
|
|
62
63
|
type: Schema.Literal('connect-create-space-event'),
|
|
64
|
+
accountAddress: Schema.String,
|
|
63
65
|
spaceId: Schema.String,
|
|
64
66
|
event: CreateSpaceEvent,
|
|
65
67
|
keyBox: KeyBoxWithKeyId,
|
|
@@ -80,6 +82,7 @@ export const RequestCreateInvitationEvent = Schema.Struct({
|
|
|
80
82
|
export const RequestConnectAddAppIdentityToSpaces = Schema.Struct({
|
|
81
83
|
type: Schema.Literal('connect-add-app-identity-to-spaces'),
|
|
82
84
|
appIdentityAddress: Schema.String,
|
|
85
|
+
accountAddress: Schema.String,
|
|
83
86
|
spacesInput: Schema.Array(
|
|
84
87
|
Schema.Struct({
|
|
85
88
|
id: Schema.String,
|
|
@@ -240,6 +243,7 @@ export type RequestConnectCreateIdentity = Schema.Schema.Type<typeof RequestConn
|
|
|
240
243
|
export const RequestConnectCreateAppIdentity = Schema.Struct({
|
|
241
244
|
appId: Schema.String,
|
|
242
245
|
address: Schema.String,
|
|
246
|
+
accountAddress: Schema.String,
|
|
243
247
|
ciphertext: Schema.String,
|
|
244
248
|
nonce: Schema.String,
|
|
245
249
|
signaturePublicKey: Schema.String,
|
|
@@ -277,6 +281,7 @@ export const ResponseListSpaces = Schema.Struct({
|
|
|
277
281
|
spaces: Schema.Array(
|
|
278
282
|
Schema.Struct({
|
|
279
283
|
id: Schema.String,
|
|
284
|
+
name: Schema.String,
|
|
280
285
|
}),
|
|
281
286
|
),
|
|
282
287
|
});
|
|
@@ -347,6 +352,7 @@ export type ResponseAccountInbox = Schema.Schema.Type<typeof ResponseAccountInbo
|
|
|
347
352
|
export const ResponseSpace = Schema.Struct({
|
|
348
353
|
type: Schema.Literal('space'),
|
|
349
354
|
id: Schema.String,
|
|
355
|
+
name: Schema.String,
|
|
350
356
|
events: Schema.Array(SpaceEvent),
|
|
351
357
|
keyBoxes: Schema.Array(KeyBoxWithKeyId),
|
|
352
358
|
updates: Schema.optional(Updates),
|
package/src/store-connect.ts
CHANGED
|
@@ -90,7 +90,6 @@ type StoreEvent =
|
|
|
90
90
|
| { type: 'reset' }
|
|
91
91
|
| { type: 'addUpdateInFlight'; updateId: string }
|
|
92
92
|
| { type: 'removeUpdateInFlight'; updateId: string }
|
|
93
|
-
| { type: 'setSpaceFromList'; spaceId: string }
|
|
94
93
|
| { type: 'applyEvent'; spaceId: string; event: SpaceEvent; state: SpaceState }
|
|
95
94
|
| { type: 'updateConfirmed'; spaceId: string; clock: number }
|
|
96
95
|
| { type: 'applyUpdate'; spaceId: string; firstUpdateClock: number; lastUpdateClock: number }
|
|
@@ -127,6 +126,7 @@ type StoreEvent =
|
|
|
127
126
|
| {
|
|
128
127
|
type: 'setSpace';
|
|
129
128
|
spaceId: string;
|
|
129
|
+
name: string;
|
|
130
130
|
updates?: Updates;
|
|
131
131
|
events: SpaceEvent[];
|
|
132
132
|
inboxes?: SpaceInboxStorageEntry[];
|
|
@@ -177,57 +177,6 @@ export const store: Store<StoreContext, StoreEvent, GenericEventObject> = create
|
|
|
177
177
|
updatesInFlight: context.updatesInFlight.filter((id) => id !== event.updateId),
|
|
178
178
|
};
|
|
179
179
|
},
|
|
180
|
-
setSpaceFromList: (context, event: { spaceId: string }) => {
|
|
181
|
-
if (!context.repo) {
|
|
182
|
-
return context;
|
|
183
|
-
}
|
|
184
|
-
const existingSpace = context.spaces.find((s) => s.id === event.spaceId);
|
|
185
|
-
const lastUpdateClock = context.lastUpdateClock[event.spaceId] ?? -1;
|
|
186
|
-
const result = context.repo.findWithProgress(idToAutomergeId(event.spaceId) as AnyDocumentId);
|
|
187
|
-
|
|
188
|
-
// set it to ready to interact with the document
|
|
189
|
-
result.handle.doneLoading();
|
|
190
|
-
|
|
191
|
-
if (existingSpace) {
|
|
192
|
-
return {
|
|
193
|
-
...context,
|
|
194
|
-
spaces: context.spaces.map((existingSpace) => {
|
|
195
|
-
if (existingSpace.id === event.spaceId) {
|
|
196
|
-
const newSpace: SpaceStorageEntry = {
|
|
197
|
-
id: existingSpace.id,
|
|
198
|
-
events: existingSpace.events ?? [],
|
|
199
|
-
state: existingSpace.state,
|
|
200
|
-
keys: existingSpace.keys ?? [],
|
|
201
|
-
automergeDocHandle: result.handle,
|
|
202
|
-
inboxes: existingSpace.inboxes ?? [],
|
|
203
|
-
};
|
|
204
|
-
return newSpace;
|
|
205
|
-
}
|
|
206
|
-
return existingSpace;
|
|
207
|
-
}),
|
|
208
|
-
lastUpdateClock: {
|
|
209
|
-
...context.lastUpdateClock,
|
|
210
|
-
[event.spaceId]: lastUpdateClock,
|
|
211
|
-
},
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
return {
|
|
215
|
-
...context,
|
|
216
|
-
spaces: [
|
|
217
|
-
...context.spaces,
|
|
218
|
-
{
|
|
219
|
-
id: event.spaceId,
|
|
220
|
-
events: [],
|
|
221
|
-
state: undefined,
|
|
222
|
-
keys: [],
|
|
223
|
-
inboxes: [],
|
|
224
|
-
updates: [],
|
|
225
|
-
lastUpdateClock: -1,
|
|
226
|
-
automergeDocHandle: result.handle,
|
|
227
|
-
},
|
|
228
|
-
],
|
|
229
|
-
};
|
|
230
|
-
},
|
|
231
180
|
applyEvent: (context, event: { spaceId: string; event: SpaceEvent; state: SpaceState }) => {
|
|
232
181
|
return {
|
|
233
182
|
...context,
|