fabric-samples/commercial-paper/organization/digibank/contract/ledger-api/statelist.js
Arnaud J Le Hors 2e3683c419
Add missing Copyright in some files (#163)
Signed-off-by: Arnaud J Le Hors <lehors@us.ibm.com>
2020-05-19 15:50:48 +01:00

74 lines
2.3 KiB
JavaScript

/*
* Copyright IBM Corp. All Rights Reserved.
*
* SPDX-License-Identifier: Apache-2.0
*/
'use strict';
const State = require('./state.js');
/**
* StateList provides a named virtual container for a set of ledger states.
* Each state has a unique key which associates it with the container, rather
* than the container containing a link to the state. This minimizes collisions
* for parallel transactions on different states.
*/
class StateList {
/**
* Store Fabric context for subsequent API access, and name of list
*/
constructor(ctx, listName) {
this.ctx = ctx;
this.name = listName;
this.supportedClasses = {};
}
/**
* Add a state to the list. Creates a new state in worldstate with
* appropriate composite key. Note that state defines its own key.
* State object is serialized before writing.
*/
async addState(state) {
let key = this.ctx.stub.createCompositeKey(this.name, state.getSplitKey());
let data = State.serialize(state);
await this.ctx.stub.putState(key, data);
}
/**
* Get a state from the list using supplied keys. Form composite
* keys to retrieve state from world state. State data is deserialized
* into JSON object before being returned.
*/
async getState(key) {
let ledgerKey = this.ctx.stub.createCompositeKey(this.name, State.splitKey(key));
let data = await this.ctx.stub.getState(ledgerKey);
if (data && data.toString('utf8')) {
let state = State.deserialize(data, this.supportedClasses);
return state;
} else {
return null;
}
}
/**
* Update a state in the list. Puts the new state in world state with
* appropriate composite key. Note that state defines its own key.
* A state is serialized before writing. Logic is very similar to
* addState() but kept separate becuase it is semantically distinct.
*/
async updateState(state) {
let key = this.ctx.stub.createCompositeKey(this.name, state.getSplitKey());
let data = State.serialize(state);
await this.ctx.stub.putState(key, data);
}
/** Stores the class for future deserialization */
use(stateClass) {
this.supportedClasses[stateClass.getClass()] = stateClass;
}
}
module.exports = StateList;