Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 0 additions & 25 deletions CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,27 +1,2 @@
# Default all files to the eng reviewers team
* @ceramicnetwork/eng-reviewers

# Pick two reviewers for each top level directory:
# the owner and someone from the eng-reviewers team.
/.github/ @smrz2001 @ceramicnetwork/eng-reviewers
/anchor-service/ @nathanielc @ceramicnetwork/eng-reviewers
/anchor-remote/ @nathanielc @ceramicnetwork/eng-reviewers
/api-server/ @dav1do @ceramicnetwork/eng-reviewers
/api/ @dav1do @ceramicnetwork/eng-reviewers
/beetle/ @nathanielc @ceramicnetwork/eng-reviewers
/ci-scripts/ @smrz2001 @ceramicnetwork/eng-reviewers
/core/ @nathanielc @ceramicnetwork/eng-reviewers
/event/ @nathanielc @ceramicnetwork/eng-reviewers
/flight/ @nathanielc @ceramicnetwork/eng-reviewers
/fpm/ @smrz2001 @ceramicnetwork/eng-reviewers
/kubo-rpc-server/ @nathanielc @ceramicnetwork/eng-reviewers
/kubo-rpc/ @nathanielc @ceramicnetwork/eng-reviewers
/metrics/ @dav1do @ceramicnetwork/eng-reviewers
/migrations/ @dav1do @ceramicnetwork/eng-reviewers
/olap/ @nathanielc @ceramicnetwork/eng-reviewers
/one/ @stbrody @ceramicnetwork/eng-reviewers
/p2p/ @nathanielc @ceramicnetwork/eng-reviewers
/recon/ @nathanielc @ceramicnetwork/eng-reviewers
/service/ @dav1do @ceramicnetwork/eng-reviewers
/store/ @dav1do @ceramicnetwork/eng-reviewers
/validation/ @dav1do @ceramicnetwork/eng-reviewers
4 changes: 2 additions & 2 deletions sdk/packages/model-instance-client/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ import type { DocumentState, UnknownContent } from './types.js'
export type CreateSingletonParams = {
/** The model's stream ID */
model: StreamID
/** The controller of the stream (DID string or literal string) */
controller: DIDString | string

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is losing the ability for the user to set the controller DID string explicitly, but maybe that's fine? Almost everyone is going to be using did-session anyway so maybe that doesn't really matter as a feature

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I think that should be ok.

I could have left the DID strings in but that would have meant leaving it to callers to check whether the DID had a parent PKH and then to pass that in, which felt risky.

/** The controller of the stream */
controller: DID
/** A unique value to ensure determinism of the event */
uniqueValue?: Uint8Array
}
Expand Down
7 changes: 3 additions & 4 deletions sdk/packages/model-instance-client/src/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
type EncodedDeterministicInitEventPayload,
type JSONPatchOperation,
} from '@ceramic-sdk/model-instance-protocol'
import type { DIDString } from '@didtools/codecs'
import type { DID } from 'dids'
import type { CID } from 'multiformats/cid'

Expand Down Expand Up @@ -57,7 +56,7 @@ export async function createInitEvent<
const { content, controller, ...headerParams } = params
const header = createInitHeader({
...headerParams,
controller: controller.id,
controller,
unique: false, // non-deterministic event
})
return await createSignedInitEvent(controller, content, header)
Expand All @@ -77,7 +76,7 @@ export async function createInitEvent<
*/
export function getDeterministicInitEventPayload(
model: StreamID,
controller: DIDString | string,
controller: DID,
uniqueValue?: Uint8Array,
): DeterministicInitEventPayload {
return {
Expand All @@ -100,7 +99,7 @@ export function getDeterministicInitEventPayload(
*/
export function getDeterministicInitEvent(
model: StreamID,
controller: DIDString | string,
controller: DID,
uniqueValue?: Uint8Array,
): EncodedDeterministicInitEventPayload {
const { header } = getDeterministicInitEventPayload(
Expand Down
12 changes: 8 additions & 4 deletions sdk/packages/model-instance-client/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import {
DocumentInitEventHeader,
type JSONPatchOperation,
} from '@ceramic-sdk/model-instance-protocol'
import { type DIDString, asDIDString } from '@didtools/codecs'
import { asDIDString } from '@didtools/codecs'
import type { DID } from 'dids'
import jsonpatch from 'fast-json-patch'
import type { CID } from 'multiformats/cid'

Expand Down Expand Up @@ -38,8 +39,8 @@ export type CreateInitHeaderParams = {
/** CID of specific model version to use when validating this instance.
* When empty the the init commit of the model is used */
modelVersion?: CID
/** The DID string or literal string representing the controller of the document. */
controller: DIDString | string
/** The controller of the document. */
controller: DID
/** A unique value to ensure determinism, or a boolean to indicate uniqueness type. */
unique?: Uint8Array | boolean
/** Optional context for the document. */
Expand Down Expand Up @@ -68,8 +69,11 @@ export type CreateInitHeaderParams = {
export function createInitHeader(
params: CreateInitHeaderParams,
): DocumentInitEventHeader {
const did = params.controller.hasParent
? params.controller.parent
: params.controller.id
const header: DocumentInitEventHeader = {
controllers: [asDIDString(params.controller)],
controllers: [asDIDString(did)],
model: params.model,
sep: 'model',
}
Expand Down
32 changes: 22 additions & 10 deletions sdk/packages/model-instance-client/test/lib.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,27 @@ const authenticatedDID = await getAuthenticatedDID(new Uint8Array(32))
describe('getDeterministicInitEventPayload()', () => {
test('returns the deterministic event payload without unique value by default', () => {
const model = randomStreamID()
const event = getDeterministicInitEventPayload(model, 'did:key:123')
const event = getDeterministicInitEventPayload(model, authenticatedDID)
expect(event.data).toBeNull()
expect(event.header.controllers).toEqual(['did:key:123'])
expect(event.header.controllers).toEqual([
'did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp',
])
expect(event.header.model).toBe(model)
expect(event.header.unique).toBeUndefined()
})

test('returns the deterministic event payload with the provided unique value', () => {
const model = randomStreamID()
const unique = new Uint8Array([0, 1, 2])
const event = getDeterministicInitEventPayload(model, 'did:key:123', unique)
const event = getDeterministicInitEventPayload(
model,
authenticatedDID,
unique,
)
expect(event.data).toBeNull()
expect(event.header.controllers).toEqual(['did:key:123'])
expect(event.header.controllers).toEqual([
'did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp',
])
expect(event.header.model).toBe(model)
expect(event.header.unique).toBe(unique)
})
Expand All @@ -50,19 +58,23 @@ describe('getDeterministicInitEventPayload()', () => {
describe('getDeterministicInitEvent()', () => {
test('returns the deterministic event without unique value by default', () => {
const model = randomStreamID()
const event = getDeterministicInitEvent(model, 'did:key:123')
const event = getDeterministicInitEvent(model, authenticatedDID)
expect(event.data).toBeNull()
expect(event.header.controllers).toEqual(['did:key:123'])
expect(event.header.controllers).toEqual([
'did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp',
])
expect(equals(event.header.model, model.bytes)).toBe(true)
expect(event.header.unique).toBeUndefined()
})

test('returns the deterministic event with the provided unique value', () => {
const model = randomStreamID()
const unique = new Uint8Array([0, 1, 2])
const event = getDeterministicInitEvent(model, 'did:key:123', unique)
const event = getDeterministicInitEvent(model, authenticatedDID, unique)
expect(event.data).toBeNull()
expect(event.header.controllers).toEqual(['did:key:123'])
expect(event.header.controllers).toEqual([
'did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp',
])
expect(equals(event.header.model, model.bytes)).toBe(true)
expect(event.header.unique).toBe(unique)
})
Expand Down Expand Up @@ -145,7 +157,7 @@ describe('ModelInstanceClient', () => {
describe('getEvent() method', () => {
test('gets a MID event by commit ID', async () => {
const streamID = randomStreamID()
const docEvent = getDeterministicInitEvent(streamID, 'did:key:123')
const docEvent = getDeterministicInitEvent(streamID, authenticatedDID)
const getEventType = jest.fn(() => docEvent)
const ceramic = { getEventType } as unknown as CeramicClient
const client = new ModelInstanceClient({ ceramic, did: authenticatedDID })
Expand All @@ -167,7 +179,7 @@ describe('ModelInstanceClient', () => {
const client = new ModelInstanceClient({ ceramic, did: authenticatedDID })

const id = await client.createSingleton({
controller: 'did:key:123',
controller: authenticatedDID,
model: randomStreamID(),
})
expect(postEventType).toHaveBeenCalled()
Expand Down
40 changes: 27 additions & 13 deletions sdk/packages/model-instance-client/test/utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,49 @@
import { randomStreamID } from '@ceramic-sdk/identifiers'
import { getAuthenticatedDID } from '@didtools/key-did'
import { equals } from 'uint8arrays'

import { createInitHeader } from '../src/utils.js'

const authenticatedDID = await getAuthenticatedDID(new Uint8Array(32))

describe('createInitHeader()', () => {
test('adds random unique bytes by default or when explcitly set to false', () => {
const controller = 'did:key:123'
const model = randomStreamID()

const header1 = createInitHeader({ controller, model })
const header1 = createInitHeader({ controller: authenticatedDID, model })
expect(header1.unique).toBeInstanceOf(Uint8Array)
const header2 = createInitHeader({ controller, model })
const header2 = createInitHeader({ controller: authenticatedDID, model })
expect(header2.unique).toBeInstanceOf(Uint8Array)
expect(
equals(header1.unique as Uint8Array, header2.unique as Uint8Array),
).toBe(false)

const header3 = createInitHeader({ controller, model, unique: false })
const header3 = createInitHeader({
controller: authenticatedDID,
model,
unique: false,
})
expect(header3.unique).toBeInstanceOf(Uint8Array)
expect(
equals(header1.unique as Uint8Array, header3.unique as Uint8Array),
).toBe(false)
})

test('adds the specified unique bytes', () => {
const controller = 'did:key:123'
const model = randomStreamID()
const unique = new Uint8Array([0, 1, 2])

const header1 = createInitHeader({ controller, model, unique })
const header1 = createInitHeader({
controller: authenticatedDID,
model,
unique,
})
expect(header1.unique).toBeInstanceOf(Uint8Array)
const header2 = createInitHeader({ controller, model, unique })
const header2 = createInitHeader({
controller: authenticatedDID,
model,
unique,
})
expect(header2.unique).toBeInstanceOf(Uint8Array)

expect(
Expand All @@ -39,26 +52,27 @@ describe('createInitHeader()', () => {
})

test('does not add unique bytes if set to true', () => {
const controller = 'did:key:123'
const model = randomStreamID()
const header = createInitHeader({ controller, model, unique: true })
const header = createInitHeader({
controller: authenticatedDID,
model,
unique: true,
})
expect(header.unique).toBeUndefined()
})

test('does not add context and shouldIndex by default', () => {
const controller = 'did:key:123'
const model = randomStreamID()
const header = createInitHeader({ controller, model })
const header = createInitHeader({ controller: authenticatedDID, model })
expect(header.context).toBeUndefined()
expect(header.shouldIndex).toBeUndefined()
})

test('adds context and shouldIndex if specified', () => {
const controller = 'did:key:123'
const model = randomStreamID()
const context = randomStreamID()
const header = createInitHeader({
controller,
controller: authenticatedDID,
model,
context,
shouldIndex: true,
Expand Down
7 changes: 2 additions & 5 deletions sdk/packages/test-vectors/scripts/create-test-vectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,16 +135,13 @@ for (const [controllerType, createController] of Object.entries(
const controller = await createController()

// Deterministic (init) event
const validDeterministicEvent = getDeterministicInitEvent(
model,
controller.id,
)
const validDeterministicEvent = getDeterministicInitEvent(model, controller)

// Signed init event
const validInitPayload = InitEventPayload.encode({
data: { test: true },
header: createInitHeader({
controller: controller.id,
controller,
model,
unique: new Uint8Array([0, 1, 2, 3]),
}),
Expand Down
1 change: 1 addition & 0 deletions tests/suite/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
"@ceramicnetwork/streamid": "^5.6.0",
"@composedb/client": "^0.8.0",
"@composedb/devtools": "^0.8.0",
"@didtools/cacao": "^3.0.1",
"@didtools/codecs": "^3.0.0",
"@didtools/key-did": "^1.0.0",
"@didtools/pkh-ethereum": "^0.5.0",
Expand Down
3 changes: 3 additions & 0 deletions tests/suite/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading