@kubun/plugin-p2p 0.8.1 → 0.8.3
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/lib/context/group.d.ts +4 -0
- package/lib/context/group.js +1 -0
- package/lib/context/join.js +1 -1
- package/lib/context/sync.js +1 -1
- package/lib/context/types.d.ts +5 -5
- package/lib/groups/broadcast-codec.d.ts +3 -0
- package/lib/{spaces → groups}/broadcast-service.d.ts +33 -15
- package/lib/groups/broadcast-service.js +1 -0
- package/lib/{spaces → groups}/broadcast.d.ts +6 -6
- package/lib/groups/broadcast.js +1 -0
- package/lib/groups/events.d.ts +38 -0
- package/lib/{spaces → groups}/events.js +1 -1
- package/lib/{spaces → groups}/invite-payload.d.ts +2 -2
- package/lib/groups/join-utils.d.ts +13 -0
- package/lib/groups/join-utils.js +1 -0
- package/lib/{spaces → groups}/manager.d.ts +41 -39
- package/lib/groups/manager.js +1 -0
- package/lib/groups/mls-group-handle.d.ts +4 -0
- package/lib/groups/mls-group-handle.js +1 -0
- package/lib/groups/mls-state.d.ts +42 -0
- package/lib/groups/mls-state.js +1 -0
- package/lib/hub/connection-pool.d.ts +19 -0
- package/lib/hub/connection-pool.js +1 -0
- package/lib/hub/group-channel.d.ts +51 -0
- package/lib/hub/group-channel.js +1 -0
- package/lib/hub/receive-handler.d.ts +36 -0
- package/lib/hub/receive-handler.js +1 -0
- package/lib/hub/relay-manager.d.ts +37 -0
- package/lib/hub/relay-manager.js +1 -0
- package/lib/hub/send-handler.d.ts +28 -0
- package/lib/hub/send-handler.js +1 -0
- package/lib/index.d.ts +12 -10
- package/lib/index.js +1 -1
- package/lib/schema.d.ts +2 -2
- package/lib/schema.js +42 -42
- package/lib/sync/catalog-scope.js +1 -1
- package/lib/sync/peer-registry.js +1 -1
- package/lib/types.d.ts +55 -45
- package/package.json +17 -15
- package/lib/context/space.d.ts +0 -4
- package/lib/context/space.js +0 -1
- package/lib/spaces/broadcast-codec.d.ts +0 -3
- package/lib/spaces/broadcast-service.js +0 -1
- package/lib/spaces/broadcast.js +0 -1
- package/lib/spaces/events.d.ts +0 -38
- package/lib/spaces/group-handle.d.ts +0 -3
- package/lib/spaces/group-handle.js +0 -1
- package/lib/spaces/join-utils.d.ts +0 -19
- package/lib/spaces/join-utils.js +0 -1
- package/lib/spaces/manager.js +0 -1
- package/lib/spaces/mls-state.d.ts +0 -27
- package/lib/spaces/mls-state.js +0 -1
- /package/lib/{spaces → groups}/broadcast-codec.js +0 -0
- /package/lib/{spaces → groups}/invite-payload.js +0 -0
- /package/lib/{spaces → groups}/mls-json.d.ts +0 -0
- /package/lib/{spaces → groups}/mls-json.js +0 -0
package/lib/context/space.d.ts
DELETED
package/lib/context/space.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{HLC as e}from"@kubun/hlc";import{getGraphStore as a}from"@kubun/store-graph";import{getSpaceStore as t}from"@kubun/store-space";import{restoreGroupHandle as r}from"../spaces/group-handle.js";import{decodeFullJoinRequest as i,decodeInvitePayload as c,decodeJoinRequest as s,encodeInvitePayload as n}from"../spaces/invite-payload.js";import{createSpaceFromJoin as d}from"../spaces/join-utils.js";import{checkPeerAccess as l,normalizeCredential as o,toISO as p}from"./types.js";export function createSpaceContext(m,w){let D=null,g=null,u=()=>D??=t(w.stores),I=()=>g??=a(w.stores);return{spaceCreateSpace:async e=>{let a=await w.spaceManager.createSpace({stores:w.stores,identity:w.identity,name:e.name,description:e.description,createdBy:m.viewerDID}),t=await u(),r=await t.getSpace(a.spaceID);if(null==r)throw Error("Failed to create space");let i={id:r.id,name:r.name,description:r.description,createdBy:r.created_by,createdAt:p(r.created_at)};return await w.emitter.emit("spaceJoined",i),i},spaceGetSpaces:async()=>{let e=await u();return(await e.listSpaces()).map(e=>({id:e.id,name:e.name,description:e.description,createdBy:e.created_by,createdAt:p(e.created_at)}))},spaceGetSpace:async e=>{let a=await u(),t=await a.getSpace(e);return null==t?null:{id:t.id,name:t.name,description:t.description,createdBy:t.created_by,createdAt:p(t.created_at)}},spaceAddSpaceMember:async(e,a,t)=>{let r=await u();await r.addSpaceMember({space_id:e,member_did:a,role:t});let i=await r.getSpaceMember(e,a);if(null==i)throw Error("Failed to add space member");let c={spaceID:i.space_id,memberDID:i.member_did,role:i.role,createdAt:p(i.created_at)};return await w.emitter.emit("spaceMemberJoined",{...c,spaceID:c.spaceID}),c},spaceGetSpaceMembers:async e=>{let a=await u();return(await a.listSpaceMembers(e)).map(e=>({spaceID:e.space_id,memberDID:e.member_did,role:e.role,createdAt:p(e.created_at)}))},spaceCreateCircle:async e=>{let a=await w.spaceManager.createCircle({stores:w.stores,spaceID:e.spaceID,name:e.name,description:e.description}),t=await u(),r=await t.getCircle(a.circleID);if(null==r)throw Error("Failed to create circle");let i={id:r.id,spaceID:r.space_id,name:r.name,description:r.description,createdAt:p(r.created_at)};return await w.emitter.emit("circleCreated",{...i,spaceID:i.spaceID}),i},spaceGetCircles:async e=>{let a=await u();return(await a.listCirclesBySpace(e)).map(e=>({id:e.id,spaceID:e.space_id,name:e.name,description:e.description,createdAt:p(e.created_at)}))},spaceAddCircleMember:async(a,t,r)=>{let i=await u(),c=e.serialize(w.hlc.now());await i.addCircleMember({circle_id:a,member_did:t,role:r,hlc:c});let s=(await i.listCircleMembers(a)).find(e=>e.member_did===t);if(null==s)throw Error("Failed to add circle member");let n={circleID:s.circle_id,memberDID:s.member_did,role:s.role,createdAt:p(s.created_at)};return await w.emitter.emit("circleMemberAdded",{...n,circleID:n.circleID}),n},spaceCreateCatalog:async a=>{let t=await I(),r=w.runtime.getRandomID(),i=e.serialize(w.hlc.now());await t.createCatalog({id:r,owner_did:m.viewerDID,name:a.name,description:a.description??"",filter_criteria:JSON.parse(a.filterCriteria),hlc:i});let c=await t.getCatalog(r);if(null==c)throw Error("Failed to create catalog");return{id:c.id,ownerDID:c.owner_did,name:c.name,description:c.description,filterCriteria:JSON.stringify(c.filter_criteria),createdAt:p(c.created_at)}},spaceGetCatalogs:async e=>{let a=await I();if(null!=e)return(await a.listCatalogs(e)).map(e=>({id:e.id,ownerDID:e.owner_did,name:e.name,description:e.description,filterCriteria:JSON.stringify(e.filter_criteria),createdAt:p(e.created_at)}));let t=await u(),r=new Set((await t.listSpaces()).map(e=>e.created_by));return(await Promise.all(Array.from(r).map(e=>a.listCatalogs(e)))).flat().map(e=>({id:e.id,ownerDID:e.owner_did,name:e.name,description:e.description,filterCriteria:JSON.stringify(e.filter_criteria),createdAt:p(e.created_at)}))},spaceInviteToSpace:async(e,a)=>{l(m.viewerDID,w.identity.id,w.autoAcceptPeers);let t=await u(),i=w.identity,c=await t.getMLSState(e,i.id);if(null==c)throw Error(`No MLS state for space ${e}`);let d=await r({mlsState:c.mls_state,credential:o(c.credential),epoch:c.epoch,rootCapability:c.root_capability}),p=s(a),D=await w.spaceManager.inviteToSpace({stores:w.stores,spaceID:e,identity:i,groupHandle:d,recipientDID:p.did,recipientKeyPackage:p.publicPackage,permission:"member"}),g=await t.getSpace(e),I=n({spaceID:e,spaceName:g?.name??"",hubURLs:g?.hub_urls??[],invite:D.invite,welcomeMessage:D.welcomeMessage,ratchetTree:D.updatedGroupHandle.state.ratchetTree});return await w.emitter.emit("spaceMemberJoined",{spaceID:e,memberDID:p.did,role:"member",createdAt:new Date().toISOString()}),{invitePayload:I,spaceID:e,spaceName:g?.name??""}},spaceJoinSpace:async(e,a)=>{let t=w.identity,r=c(e),s=i(a),n={publicPackage:s.publicPackage,privatePackage:s.privatePackage,ownerDID:s.did};return await w.spaceManager.joinSpace({stores:w.stores,identity:t,spaceID:r.spaceID,invite:r.invite,keyPackageBundle:n,welcomeMessage:r.welcomeMessage,ratchetTree:r.ratchetTree}),await d({stores:w.stores,hlc:w.hlc,emitter:w.emitter,identity:t,invite:r})},spaceLeaveSpace:async e=>{let a=await u(),t=await a.getSpace(e),r=w.identity;return await w.spaceManager.leaveSpace({stores:w.stores,spaceID:e,identity:r}),null!=t&&await w.emitter.emit("spaceLeft",{id:t.id,name:t.name,description:t.description,createdBy:t.created_by,createdAt:p(t.created_at),spaceID:e}),{spaceID:e}},spaceRemoveSpaceMember:async(e,a)=>{let t=await u(),i=w.identity,c=await t.getMLSState(e,i.id);if(null==c)throw Error(`No MLS state for space ${e}`);let s=await r({mlsState:c.mls_state,credential:o(c.credential),epoch:c.epoch,rootCapability:c.root_capability});return await w.spaceManager.removeSpaceMember({stores:w.stores,spaceID:e,groupHandle:s,memberDID:a}),await w.emitter.emit("spaceMemberLeft",{spaceID:e,memberDID:a,role:"",createdAt:new Date().toISOString()}),{spaceID:e}},spaceUpdateSpace:async e=>{await w.spaceManager.updateSpace({stores:w.stores,spaceID:e.spaceID,update:{name:e.name,description:e.description}});let a=await u(),t=await a.getSpace(e.spaceID);if(null==t)throw Error(`Space ${e.spaceID} not found`);let r={id:t.id,name:t.name,description:t.description,createdBy:t.created_by,createdAt:p(t.created_at)};return await w.emitter.emit("spaceDataChanged",{...r,spaceID:e.spaceID}),r},spaceUpdateCircle:async e=>{await w.spaceManager.updateCircle({stores:w.stores,circleID:e.circleID,update:{name:e.name,description:e.description,catalogIDs:e.catalogIDs}});let a=await u(),t=await a.getCircle(e.circleID);if(null==t)throw Error(`Circle ${e.circleID} not found`);let r={id:t.id,spaceID:t.space_id,name:t.name,description:t.description,createdAt:p(t.created_at)};return null!=e.catalogIDs?await w.emitter.emit("circleCatalogsChanged",{...r,circleID:e.circleID}):await w.emitter.emit("circleDataChanged",{...r,circleID:e.circleID}),r},spaceUpdateCatalog:async a=>{let t=await I(),r={hlc:e.serialize(w.hlc.now())};null!=a.name&&(r.name=a.name),null!=a.filterCriteria&&(r.filter_criteria=JSON.parse(a.filterCriteria)),await t.updateCatalog(a.catalogID,r);let i=await t.getCatalog(a.catalogID);if(null==i)throw Error(`Catalog ${a.catalogID} not found`);return{id:i.id,ownerDID:i.owner_did,name:i.name,description:i.description,filterCriteria:JSON.stringify(i.filter_criteria),createdAt:p(i.created_at)}},spaceDeleteCatalog:async e=>{let a=await I();return await a.deleteCatalog(e),{deletedID:e}},spaceDeleteCircle:async e=>{let a=await u(),t=await a.getCircle(e);return await w.spaceManager.deleteCircle({stores:w.stores,circleID:e}),null!=t&&await w.emitter.emit("circleDeleted",{id:t.id,spaceID:t.space_id,name:t.name,description:t.description,createdAt:p(t.created_at)}),{deletedID:e}},spaceRemoveCircleMember:async(e,a)=>(await w.spaceManager.removeCircleMember({stores:w.stores,circleID:e,memberDID:a}),await w.emitter.emit("circleMemberRemoved",{circleID:e,memberDID:a,role:"",createdAt:new Date().toISOString()}),{circleID:e,memberDID:a})}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{EventEmitter as e}from"@enkaku/event";import{processBroadcast as r}from"./broadcast.js";import{deserializeBroadcast as a,serializeBroadcast as t}from"./broadcast-codec.js";import{restoreGroupHandle as s}from"./group-handle.js";import{replacer as o,reviver as c}from"./mls-json.js";import{serializeGroupState as i}from"./mls-state.js";export class BroadcastService extends e{#e;constructor(e){super(),this.#e={spaceStore:e.spaceStore,graphStore:e.graphStore}}async prepareSend(e){let{message:r,groupState:a}=e,c=t(r),p=await s(a),{message:d}=await p.encrypt(c),m=i(p);return{encrypted:new TextEncoder().encode(JSON.stringify(d,o)),updatedGroupState:m}}async processReceived(e){let{spaceID:t,encrypted:o,groupState:p}=e,d=await s(p),m=JSON.parse(new TextDecoder().decode(o),c),n=a(await d.decrypt(m)),w=await r(this.#e,n),S=i(d);return await this.emit("broadcast",{spaceID:t,message:n,applied:w}),{message:n,applied:w,updatedGroupState:S}}}
|
package/lib/spaces/broadcast.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{HLC as e}from"@kubun/hlc";function a(a,c){return e.compare(e.parse(a),e.parse(c))>0}export async function processBroadcast(e,c){let{spaceStore:t,graphStore:r}=e;switch(c.type){case"circle:create":{let e=await t.getCircle(c.circle.id);if(null!=e){if(!a(c.circle.hlc,e.hlc))return!1;return await t.updateCircle(c.circle.id,{name:c.circle.name,description:c.circle.description,catalog_ids:c.circle.catalogIDs,hlc:c.circle.hlc}),!0}return await t.createCircle({id:c.circle.id,space_id:c.circle.spaceID,name:c.circle.name,description:c.circle.description,catalog_ids:c.circle.catalogIDs,hlc:c.circle.hlc}),!0}case"circle:update":{let e=await t.getCircle(c.circleID);if(null==e||!a(c.update.hlc,e.hlc))return!1;return await t.updateCircle(c.circleID,{name:c.update.name,description:c.update.description,catalog_ids:c.update.catalogIDs,hlc:c.update.hlc}),!0}case"circle:delete":{let e=await t.getCircle(c.circleID);if(null==e||!a(c.hlc,e.hlc))return!1;return await t.deleteCircle(c.circleID),!0}case"member:add":return await t.addCircleMember({circle_id:c.member.circleID,member_did:c.member.memberDID,role:c.member.role,hlc:c.member.hlc}),!0;case"member:remove":return await t.removeCircleMember(c.circleID,c.memberDID),!0;case"catalog:create":{let e=await r.getCatalog(c.catalog.id);if(null!=e){if(!a(c.catalog.hlc,e.hlc))return!1;return await r.updateCatalog(c.catalog.id,{name:c.catalog.name,description:c.catalog.description,filter_criteria:c.catalog.filterCriteria,hlc:c.catalog.hlc}),!0}return await r.createCatalog({id:c.catalog.id,owner_did:c.catalog.ownerDID,name:c.catalog.name,description:c.catalog.description,filter_criteria:c.catalog.filterCriteria,hlc:c.catalog.hlc}),!0}case"catalog:update":{let e=await r.getCatalog(c.catalogID);if(null==e||!a(c.update.hlc,e.hlc))return!1;return await r.updateCatalog(c.catalogID,{name:c.update.name,description:c.update.description,filter_criteria:c.update.filterCriteria,hlc:c.update.hlc}),!0}case"catalog:delete":{let e=await r.getCatalog(c.catalogID);if(null==e||!a(c.hlc,e.hlc))return!1;return await r.deleteCatalog(c.catalogID),!0}case"space:update":{let e=await t.getSpace(c.spaceID);if(null==e||!a(c.update.hlc,e.hlc))return!1;return await t.updateSpace(c.spaceID,{name:c.update.name,description:c.update.description,hub_urls:c.update.hubURLs,hlc:c.update.hlc}),!0}}}
|
package/lib/spaces/events.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from '@enkaku/event';
|
|
2
|
-
import type { CircleData, CircleMemberData, SpaceData, SpaceMemberData } from '../index.js';
|
|
3
|
-
export type SpaceEventMap = {
|
|
4
|
-
spaceJoined: SpaceData;
|
|
5
|
-
spaceLeft: SpaceData & {
|
|
6
|
-
spaceID: string;
|
|
7
|
-
};
|
|
8
|
-
spaceDataChanged: SpaceData & {
|
|
9
|
-
spaceID: string;
|
|
10
|
-
};
|
|
11
|
-
spaceMemberJoined: SpaceMemberData & {
|
|
12
|
-
spaceID: string;
|
|
13
|
-
};
|
|
14
|
-
spaceMemberLeft: SpaceMemberData & {
|
|
15
|
-
spaceID: string;
|
|
16
|
-
};
|
|
17
|
-
circleCreated: CircleData & {
|
|
18
|
-
spaceID: string;
|
|
19
|
-
};
|
|
20
|
-
circleDeleted: CircleData & {
|
|
21
|
-
spaceID: string;
|
|
22
|
-
};
|
|
23
|
-
circleDataChanged: CircleData & {
|
|
24
|
-
circleID: string;
|
|
25
|
-
};
|
|
26
|
-
circleMemberAdded: CircleMemberData & {
|
|
27
|
-
circleID: string;
|
|
28
|
-
};
|
|
29
|
-
circleMemberRemoved: CircleMemberData & {
|
|
30
|
-
circleID: string;
|
|
31
|
-
};
|
|
32
|
-
circleCatalogsChanged: CircleData & {
|
|
33
|
-
circleID: string;
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
export type SpaceEventEmitter = EventEmitter<SpaceEventMap>;
|
|
37
|
-
export declare function createSpaceEventEmitter(): SpaceEventEmitter;
|
|
38
|
-
export declare function createFilteredGenerator<K extends keyof SpaceEventMap>(emitter: SpaceEventEmitter, eventName: K, filter?: (data: SpaceEventMap[K]) => boolean): AsyncGenerator<SpaceEventMap[K], void, void>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{restoreGroup as r}from"@enkaku/group";import{deserializeGroupState as o}from"./mls-state.js";export async function restoreGroupHandle(t){let{state:e,credential:n,rootCapability:m}=o(t);return r({state:e,credential:n,rootCapability:m})}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { OwnIdentity } from '@enkaku/token';
|
|
2
|
-
import type { StoreProvider } from '@kubun/db';
|
|
3
|
-
import { HLC } from '@kubun/hlc';
|
|
4
|
-
import type { SpaceData } from '../types.js';
|
|
5
|
-
import type { SpaceEventEmitter } from './events.js';
|
|
6
|
-
export type CreateSpaceFromJoinParams = {
|
|
7
|
-
stores: StoreProvider;
|
|
8
|
-
hlc: HLC;
|
|
9
|
-
emitter: SpaceEventEmitter;
|
|
10
|
-
identity: OwnIdentity;
|
|
11
|
-
invite: {
|
|
12
|
-
spaceID: string;
|
|
13
|
-
spaceName: string;
|
|
14
|
-
hubURLs: Array<string>;
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
export declare function createSpaceFromJoin(params: CreateSpaceFromJoinParams): Promise<{
|
|
18
|
-
space: SpaceData | null;
|
|
19
|
-
}>;
|
package/lib/spaces/join-utils.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{HLC as e}from"@kubun/hlc";import{getSpaceStore as a}from"@kubun/store-space";import{toISO as t}from"../context/types.js";export async function createSpaceFromJoin(c){let{stores:i,hlc:r,emitter:n,identity:p,invite:o}=c,s=await a(i);null==await s.getSpace(o.spaceID)&&await s.createSpace({id:o.spaceID,name:o.spaceName,description:"",created_by:p.id,hub_urls:o.hubURLs,hlc:e.serialize(r.now())});let l=await s.getSpace(o.spaceID),d=null!=l?{id:l.id,name:l.name,description:l.description,createdBy:l.created_by,createdAt:t(l.created_at)}:null;return null!=d&&await n.emit("spaceJoined",d),{space:d}}
|
package/lib/spaces/manager.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{commitInvite as e,createGroup as a,createInvite as t,processWelcome as i,removeMember as r}from"@enkaku/group";import{HLC as c}from"@kubun/hlc";import{getGraphStore as s}from"@kubun/store-graph";import{getSpaceStore as d}from"@kubun/store-space";import{serializeGroupState as l}from"./mls-state.js";export class SpaceManager{#e;#a;#t;constructor(e){this.#e=e.identity.id,this.#a=e.getRandomID,this.#t=new c({nodeID:e.identity.id})}async #i(e,a,t){let i=l(t),r=await d(e);await r.saveMLSState({space_id:a,device_id:this.#e,mls_state:i.mlsState,credential:i.credential,epoch:i.epoch,root_capability:i.rootCapability})}async createSpace(e){let t=this.#a(),{group:i}=await a(e.identity,t),r=await d(e.stores);return await r.createSpace({id:t,name:e.name,description:e.description??"",created_by:e.createdBy??e.identity.id,hub_urls:e.hubURLs??[],hlc:c.serialize(this.#t.now())}),await this.#i(e.stores,t,i),await r.addSpaceMember({space_id:t,member_did:e.identity.id,role:"admin"}),{spaceID:t,groupHandle:i}}async updateSpace(e){let a=c.serialize(this.#t.now()),t=await d(e.stores);return await t.updateSpace(e.spaceID,{name:e.update.name,description:e.update.description,hub_urls:e.update.hubURLs,hlc:a}),{broadcast:{type:"space:update",spaceID:e.spaceID,update:{...e.update,hlc:a}}}}async inviteToSpace(a){let{invite:i}=await t({group:a.groupHandle,identity:a.identity,recipientDID:a.recipientDID,permission:a.permission}),{commitMessage:r,welcomeMessage:c,newGroup:s}=await e(a.groupHandle,a.recipientKeyPackage);await this.#i(a.stores,a.spaceID,s);let l=await d(a.stores);return await l.addSpaceMember({space_id:a.spaceID,member_did:a.recipientDID,role:"admin"===a.permission?"admin":"member"}),{invite:i,welcomeMessage:c,commitMessage:r,updatedGroupHandle:s}}async joinSpace(e){let{group:a}=await i({identity:e.identity,invite:e.invite,welcome:e.welcomeMessage,keyPackageBundle:e.keyPackageBundle,ratchetTree:e.ratchetTree});await this.#i(e.stores,e.spaceID,a);let t=await d(e.stores);return await t.addSpaceMember({space_id:e.spaceID,member_did:e.identity.id,role:"member"}),{groupHandle:a}}async removeMember(e){let{commitMessage:a,newGroup:t}=await r(e.groupHandle,e.leafIndex);await this.#i(e.stores,e.spaceID,t);let i=await d(e.stores);return await i.removeSpaceMember(e.spaceID,e.memberDID),{commitMessage:a,updatedGroupHandle:t}}async removeSpaceMember(e){let a=e.groupHandle.findMemberLeafIndex(e.memberDID);if(null==a)throw Error(`Member ${e.memberDID} not found in MLS group`);let{commitMessage:t,newGroup:i}=await r(e.groupHandle,a);await this.#i(e.stores,e.spaceID,i);let c=await d(e.stores);return await c.removeSpaceMember(e.spaceID,e.memberDID),{commitMessage:t,updatedGroupHandle:i}}async leaveSpace(e){let a=await d(e.stores);await a.deleteMLSState(e.spaceID,this.#e),await a.removeSpaceMember(e.spaceID,e.identity.id)}async loadSpace(e,a){let t=await d(e),i=await t.getMLSState(a,this.#e);if(null!=i)return{epoch:i.epoch,credential:i.credential}}async createCircle(e){let a=this.#a(),t=c.serialize(this.#t.now()),i=e.catalogIDs??[],r=await d(e.stores);return await r.createCircle({id:a,space_id:e.spaceID,name:e.name,description:e.description??"",catalog_ids:i,hlc:t}),{circleID:a,broadcast:{type:"circle:create",circle:{id:a,spaceID:e.spaceID,name:e.name,description:e.description??"",catalogIDs:i,hlc:t}}}}async updateCircle(e){let a=c.serialize(this.#t.now()),t=[],i=await d(e.stores);if(null!=e.update.catalogIDs){let a=await i.getCircle(e.circleID),r=new Set(null!=a?a.catalog_ids:[]),c=e.update.catalogIDs.filter(e=>!r.has(e)),d=await s(e.stores);for(let e of(await Promise.all(c.map(e=>d.getCatalog(e)))))null!=e&&t.push({type:"catalog:create",catalog:{id:e.id,ownerDID:e.owner_did,name:e.name,description:e.description,filterCriteria:e.filter_criteria,hlc:e.hlc}})}await i.updateCircle(e.circleID,{name:e.update.name,description:e.update.description,catalog_ids:e.update.catalogIDs,hlc:a});let r={type:"circle:update",circleID:e.circleID,update:{...e.update,hlc:a}};return{broadcast:r,broadcasts:[r,...t]}}async deleteCircle(e){let a=c.serialize(this.#t.now()),t=await d(e.stores);return await t.deleteCircle(e.circleID),{broadcast:{type:"circle:delete",circleID:e.circleID,hlc:a}}}async addCircleMember(e){let a=await d(e.stores);if(!await a.isSpaceMember(e.spaceID,e.memberDID))throw Error(`${e.memberDID} is not a member of space ${e.spaceID}`);let t=c.serialize(this.#t.now());return await a.addCircleMember({circle_id:e.circleID,member_did:e.memberDID,role:e.role,hlc:t}),{broadcast:{type:"member:add",member:{circleID:e.circleID,memberDID:e.memberDID,role:e.role,hlc:t}}}}async removeCircleMember(e){let a=c.serialize(this.#t.now()),t=await d(e.stores);return await t.removeCircleMember(e.circleID,e.memberDID),{broadcast:{type:"member:remove",circleID:e.circleID,memberDID:e.memberDID,hlc:a}}}}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { type ClientState, type GroupHandle, type MemberCredential } from '@enkaku/group';
|
|
2
|
-
/**
|
|
3
|
-
* Serialized form of a GroupHandle for DB persistence.
|
|
4
|
-
* The MLS ClientState is opaque binary; the credential is JSON.
|
|
5
|
-
*/
|
|
6
|
-
export type SerializedGroupState = {
|
|
7
|
-
mlsState: Uint8Array;
|
|
8
|
-
credential: string;
|
|
9
|
-
epoch: number;
|
|
10
|
-
rootCapability: string;
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* Serialize a GroupHandle's state for persistence.
|
|
14
|
-
* The implementer must verify the serialization approach works
|
|
15
|
-
* with the installed version of ts-mls.
|
|
16
|
-
*/
|
|
17
|
-
export declare function serializeGroupState(group: GroupHandle): SerializedGroupState;
|
|
18
|
-
export type GroupState = {
|
|
19
|
-
state: ClientState;
|
|
20
|
-
credential: MemberCredential;
|
|
21
|
-
rootCapability: string;
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Deserialize persisted state back into GroupHandle constructor params.
|
|
25
|
-
* Returns the params needed to reconstruct a GroupHandle.
|
|
26
|
-
*/
|
|
27
|
-
export declare function deserializeGroupState(serialized: SerializedGroupState): GroupState;
|
package/lib/spaces/mls-state.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{decodeClientState as t,encodeClientState as e}from"@enkaku/group";export function serializeGroupState(t){return{mlsState:e(t.state),credential:JSON.stringify(t.credential),epoch:Number(t.epoch),rootCapability:t.rootCapability}}export function deserializeGroupState(e){let r=t(e.mlsState);if(null==r)throw Error("Could not decode ClientState");return{state:r,credential:JSON.parse(e.credential),rootCapability:e.rootCapability}}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|