Skip to main content

Rights Management Plugins Examples

These examples show how to wire default and pass-through plugins so negotiation, information retrieval, enforcement, and execution behaviours stay predictable.

PassThroughPolicyRequester

import { PassThroughPolicyRequester } from '@twin.org/rights-management-plugins';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const requester = new PassThroughPolicyRequester();

const offerAccepted = await requester.offer('neg-1', {
'@id': 'urn:rights-management:offer-1',
'@type': PolicyType.Offer,
assigner: 'did:example:provider'
});

const agreementAccepted = await requester.agreement('neg-1', {
'@id': 'urn:rights-management:agreement-1',
'@type': PolicyType.Agreement,
assigner: 'did:example:provider',
assignee: 'did:example:consumer'
});

await requester.finalised('neg-1');
await requester.terminated('neg-1');

console.log(requester.className()); // PassThroughPolicyRequester
console.log(offerAccepted); // true
console.log(agreementAccepted); // true

PassThroughPolicyNegotiator

import { PassThroughPolicyNegotiator } from '@twin.org/rights-management-plugins';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const negotiator = new PassThroughPolicyNegotiator();

const offer = {
'@id': 'urn:rights-management:offer-1',
'@type': PolicyType.Offer,
assigner: 'did:example:provider'
};

const supported = negotiator.supportsOffer(offer);
const handled = await negotiator.handleOffer(offer, {
'did:example:consumer': {
'@id': 'did:example:consumer'
}
});
const agreement = await negotiator.createAgreement(offer, 'did:example:consumer', {
'did:example:consumer': {
'@id': 'did:example:consumer'
}
});

console.log(negotiator.className()); // PassThroughPolicyNegotiator
console.log(supported); // true
console.log(handled.accepted); // true
console.log(agreement?.['@type']); // Agreement

LoggingPolicyExecutionAction

import { LoggingPolicyExecutionAction } from '@twin.org/rights-management-plugins';
import { PolicyDecision, PolicyDecisionStage } from '@twin.org/rights-management-models';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const action = new LoggingPolicyExecutionAction({
config: {
stages: [PolicyDecisionStage.Before, PolicyDecisionStage.After],
includeData: true,
includePolicy: false,
includeDecisions: true
}
});

await action.execute(
{
'@id': 'urn:rights-management:agreement-1',
'@type': PolicyType.Agreement,
assigner: 'did:example:provider',
assignee: 'did:example:consumer'
},
[{ target: '$.asset', decision: PolicyDecision.Granted }],
{ asset: 'dataset-1' },
'use',
PolicyDecisionStage.Before
);

console.log(action.className()); // LoggingPolicyExecutionAction
console.log(action.supportedStages()); // [ 'before', 'after' ]

StaticPolicyInformationSource

import { PolicyInformationAccessMode } from '@twin.org/rights-management-models';
import { StaticPolicyInformationSource } from '@twin.org/rights-management-plugins';

const source = new StaticPolicyInformationSource({
config: {
information: [
{
accessMode: PolicyInformationAccessMode.Any,
objects: {
'did:example:consumer': {
'@id': 'did:example:consumer'
}
}
}
]
}
});

source.addInformation({
accessMode: PolicyInformationAccessMode.Public,
objects: {
'urn:asset:dataset-1': {
'@id': 'urn:asset:dataset-1'
}
},
matchLocators: [
{
target: 'urn:asset:dataset-1'
}
]
});

const result = await source.retrieve(
{
'@id': 'urn:rights-management:agreement-1',
'@type': 'Agreement',
target: 'urn:asset:dataset-1'
},
PolicyInformationAccessMode.Public,
{ requestId: 'request-1' },
'use'
);

console.log(source.className()); // StaticPolicyInformationSource
console.log(Object.keys(result ?? {}).length); // 2

DefaultPolicyArbiter

import { DefaultPolicyArbiter } from '@twin.org/rights-management-plugins';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const arbiter = new DefaultPolicyArbiter();

const decisions = await arbiter.decide(
{
'@id': 'urn:rights-management:agreement-1',
'@type': PolicyType.Agreement,
assigner: 'did:example:provider',
assignee: 'did:example:consumer',
permission: [
{
target: 'urn:asset:dataset-1',
action: 'use'
}
]
},
{},
{ asset: 'dataset-1' },
'use'
);

console.log(arbiter.className()); // DefaultPolicyArbiter
console.log(decisions[0].decision); // granted
import { DefaultPolicyArbiter } from '@twin.org/rights-management-plugins';
import { OdrlPolicyType, OdrlProfiles } from '@twin.org/standards-w3c-odrl';

const arbiter = new DefaultPolicyArbiter();

// EcosystemPolicy with the TWIN profile — the arbiter evaluates its obligations directly.
const ecosystemDecisions = await arbiter.decide(
{
'@id': 'urn:rights-management:ecosystem-policy-1',
'@type': OdrlPolicyType.EcosystemPolicy,
profile: OdrlProfiles.Twin,
assigner: 'did:example:publisher',
obligation: [
{
action: 'inform',
assignee: 'did:example:border-agency',
target: 'urn:twin:asset:consignment:abc123'
}
]
},
{},
{ consignment: 'abc123' },
'inform'
);

console.log(ecosystemDecisions[0].decision); // granted

PassThroughPolicyArbiter

import { PassThroughPolicyArbiter } from '@twin.org/rights-management-plugins';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const arbiter = new PassThroughPolicyArbiter();

const decisions = await arbiter.decide(
{
'@id': 'urn:rights-management:agreement-2',
'@type': PolicyType.Agreement,
assigner: 'did:example:provider',
assignee: 'did:example:consumer'
},
{},
{ asset: 'dataset-2' },
'read'
);

console.log(arbiter.className()); // PassThroughPolicyArbiter
console.log(decisions[0].decision); // granted

DefaultPolicyEnforcementProcessor

import { PolicyDecision } from '@twin.org/rights-management-models';
import { DefaultPolicyEnforcementProcessor } from '@twin.org/rights-management-plugins';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const processor = new DefaultPolicyEnforcementProcessor();

const processed = await processor.process(
{
'@id': 'urn:rights-management:agreement-1',
'@type': PolicyType.Agreement
},
[{ target: '$.asset', decision: PolicyDecision.Granted }],
{ asset: 'dataset-1', hidden: 'no' },
'use'
);

console.log(processor.className()); // DefaultPolicyEnforcementProcessor
console.log(processed); // { asset: 'dataset-1' }

PassThroughPolicyEnforcementProcessor

import { PassThroughPolicyEnforcementProcessor } from '@twin.org/rights-management-plugins';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const processor = new PassThroughPolicyEnforcementProcessor();

const result = await processor.process(
{
'@id': 'urn:rights-management:agreement-1',
'@type': PolicyType.Agreement
},
[],
{ asset: 'dataset-1' },
'use'
);

console.log(processor.className()); // PassThroughPolicyEnforcementProcessor
console.log(result); // { asset: 'dataset-1' }

IdentityPolicyInformationSource

import { PolicyInformationAccessMode } from '@twin.org/rights-management-models';
import { IdentityPolicyInformationSource } from '@twin.org/rights-management-plugins';

const source = new IdentityPolicyInformationSource();

const info = await source.retrieve(
{
'@id': 'urn:rights-management:agreement-1',
'@type': 'Agreement',
assigner: 'did:example:provider',
assignee: 'did:example:consumer'
},
PolicyInformationAccessMode.Any,
{ requestId: 'request-2' },
'use'
);

console.log(source.className()); // IdentityPolicyInformationSource
console.log(Object.keys(info ?? {}).length); // 2

PassThroughPolicyObligationEnforcer

import { PassThroughPolicyObligationEnforcer } from '@twin.org/rights-management-plugins';
import { PolicyType } from '@twin.org/standards-w3c-odrl';

const enforcer = new PassThroughPolicyObligationEnforcer();

const enforced = await enforcer.enforce(
{
'@id': 'urn:rights-management:agreement-1',
'@type': PolicyType.Agreement
},
{
action: 'use'
},
{},
{ requestId: 'request-3' },
'use'
);

console.log(enforcer.className()); // PassThroughPolicyObligationEnforcer
console.log(enforced); // true