Skip to content

Commit b0927da

Browse files
authored
Merge pull request #165 from mustafaiman/semaphore
Semaphore
2 parents ab3d1a6 + 9056f7d commit b0927da

15 files changed

+541
-1
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ npm-debug.log
2424

2525
# TypeScript
2626
*.js.map
27-
lib/*
27+
lib/
2828

2929
# TSDoc
3030
docs/

src/HazelcastClient.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {IRingbuffer} from './proxy/IRingbuffer';
2323
import {ITopic} from './proxy/topic/ITopic';
2424
import {ReliableTopicProxy} from './proxy/topic/ReliableTopicProxy';
2525
import {IReplicatedMap} from './proxy/IReplicatedMap';
26+
import {ISemaphore} from './proxy/ISemaphore';
2627
import {IAtomicLong} from './proxy/IAtomicLong';
2728

2829
export default class HazelcastClient {
@@ -187,6 +188,15 @@ export default class HazelcastClient {
187188
return <IAtomicLong>this.proxyManager.getOrCreateProxy(name, this.proxyManager.ATOMICLONG_SERVICE);
188189
}
189190

191+
/**
192+
* Returns the distributed semaphore instance with given name.
193+
* @param name
194+
* @returns {ISemaphore}
195+
*/
196+
getSemaphore(name: string): ISemaphore {
197+
return <ISemaphore>this.proxyManager.getOrCreateProxy(name, this.proxyManager.SEMAPHORE_SERVICE);
198+
}
199+
190200
/**
191201
* Return configuration that this instance started with.
192202
* Returned configuration object should not be modified.

src/Util.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ export function shuffleArray<T>(array: Array<T>): void {
2121
}
2222
}
2323

24+
export function assertNotNegative(v: number, message: string = 'The value cannot be negative.') {
25+
assert(v >= 0, message);
26+
}
27+
2428
export function getType(obj: any): string {
2529
assertNotNull(obj);
2630
if (Long.isLong(obj)) {

src/codec/SemaphoreAcquireCodec.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* tslint:disable */
2+
import ClientMessage = require('../ClientMessage');
3+
import {BitsUtil} from '../BitsUtil';
4+
import {SemaphoreMessageType} from './SemaphoreMessageType';
5+
6+
const REQUEST_TYPE = SemaphoreMessageType.SEMAPHORE_ACQUIRE;
7+
const RESPONSE_TYPE = 100;
8+
const RETRYABLE = false;
9+
10+
export class SemaphoreAcquireCodec {
11+
12+
static calculateSize(name: string, permits: number) {
13+
// Calculates the request payload size
14+
let dataSize: number = 0;
15+
dataSize += BitsUtil.calculateSizeString(name);
16+
dataSize += BitsUtil.INT_SIZE_IN_BYTES;
17+
return dataSize;
18+
}
19+
20+
static encodeRequest(name: string, permits: number) {
21+
// Encode request into clientMessage
22+
const clientMessage = ClientMessage.newClientMessage(this.calculateSize(name, permits));
23+
clientMessage.setMessageType(REQUEST_TYPE);
24+
clientMessage.setRetryable(RETRYABLE);
25+
clientMessage.appendString(name);
26+
clientMessage.appendInt32(permits);
27+
clientMessage.updateFrameLength();
28+
return clientMessage;
29+
}
30+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/* tslint:disable */
2+
import ClientMessage = require('../ClientMessage');
3+
import {BitsUtil} from '../BitsUtil';
4+
import {Data} from '../serialization/Data';
5+
import {SemaphoreMessageType} from './SemaphoreMessageType';
6+
7+
const REQUEST_TYPE = SemaphoreMessageType.SEMAPHORE_AVAILABLEPERMITS;
8+
const RESPONSE_TYPE = 102;
9+
const RETRYABLE = true;
10+
11+
export class SemaphoreAvailablePermitsCodec {
12+
13+
static calculateSize(name: string) {
14+
// Calculates the request payload size
15+
let dataSize: number = 0;
16+
dataSize += BitsUtil.calculateSizeString(name);
17+
return dataSize;
18+
}
19+
20+
static encodeRequest(name: string) {
21+
// Encode request into clientMessage
22+
const clientMessage = ClientMessage.newClientMessage(this.calculateSize(name));
23+
clientMessage.setMessageType(REQUEST_TYPE);
24+
clientMessage.setRetryable(RETRYABLE);
25+
clientMessage.appendString(name);
26+
clientMessage.updateFrameLength();
27+
return clientMessage;
28+
}
29+
30+
static decodeResponse(clientMessage: ClientMessage, toObjectFunction: (data: Data) => any = null) {
31+
// Decode response from client message
32+
const parameters: any = {'response': null};
33+
parameters['response'] = clientMessage.readInt32();
34+
return parameters;
35+
}
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/* tslint:disable */
2+
import ClientMessage = require('../ClientMessage');
3+
import {BitsUtil} from '../BitsUtil';
4+
import {Data} from '../serialization/Data';
5+
import {SemaphoreMessageType} from './SemaphoreMessageType';
6+
7+
const REQUEST_TYPE = SemaphoreMessageType.SEMAPHORE_DRAINPERMITS;
8+
const RESPONSE_TYPE = 102;
9+
const RETRYABLE = true;
10+
11+
export class SemaphoreDrainPermitsCodec {
12+
13+
static calculateSize(name: string) {
14+
// Calculates the request payload size
15+
let dataSize: number = 0;
16+
dataSize += BitsUtil.calculateSizeString(name);
17+
return dataSize;
18+
}
19+
20+
static encodeRequest(name: string) {
21+
// Encode request into clientMessage
22+
const clientMessage = ClientMessage.newClientMessage(this.calculateSize(name));
23+
clientMessage.setMessageType(REQUEST_TYPE);
24+
clientMessage.setRetryable(RETRYABLE);
25+
clientMessage.appendString(name);
26+
clientMessage.updateFrameLength();
27+
return clientMessage;
28+
}
29+
30+
static decodeResponse(clientMessage: ClientMessage, toObjectFunction: (data: Data) => any = null) {
31+
// Decode response from client message
32+
const parameters: any = {'response': null};
33+
parameters['response'] = clientMessage.readInt32();
34+
return parameters;
35+
}
36+
}

src/codec/SemaphoreInitCodec.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/* tslint:disable */
2+
import ClientMessage = require('../ClientMessage');
3+
import {BitsUtil} from '../BitsUtil';
4+
import {Data} from '../serialization/Data';
5+
import {SemaphoreMessageType} from './SemaphoreMessageType';
6+
7+
const REQUEST_TYPE = SemaphoreMessageType.SEMAPHORE_INIT;
8+
const RESPONSE_TYPE = 101;
9+
const RETRYABLE = false;
10+
11+
export class SemaphoreInitCodec {
12+
13+
static calculateSize(name: string, permits: number) {
14+
// Calculates the request payload size
15+
let dataSize: number = 0;
16+
dataSize += BitsUtil.calculateSizeString(name);
17+
dataSize += BitsUtil.INT_SIZE_IN_BYTES;
18+
return dataSize;
19+
}
20+
21+
static encodeRequest(name: string, permits: number) {
22+
// Encode request into clientMessage
23+
const clientMessage = ClientMessage.newClientMessage(this.calculateSize(name, permits));
24+
clientMessage.setMessageType(REQUEST_TYPE);
25+
clientMessage.setRetryable(RETRYABLE);
26+
clientMessage.appendString(name);
27+
clientMessage.appendInt32(permits);
28+
clientMessage.updateFrameLength();
29+
return clientMessage;
30+
}
31+
32+
static decodeResponse(clientMessage: ClientMessage, toObjectFunction: (data: Data) => any = null) {
33+
// Decode response from client message
34+
const parameters: any = {'response': null};
35+
parameters['response'] = clientMessage.readBoolean();
36+
return parameters;
37+
}
38+
}

src/codec/SemaphoreMessageType.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/* tslint:disable */
2+
3+
export class SemaphoreMessageType {
4+
static SEMAPHORE_INIT = 0x0d01;
5+
static SEMAPHORE_ACQUIRE = 0x0d02;
6+
static SEMAPHORE_AVAILABLEPERMITS = 0x0d03;
7+
static SEMAPHORE_DRAINPERMITS = 0x0d04;
8+
static SEMAPHORE_REDUCEPERMITS = 0x0d05;
9+
static SEMAPHORE_RELEASE = 0x0d06;
10+
static SEMAPHORE_TRYACQUIRE = 0x0d07;
11+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* tslint:disable */
2+
import ClientMessage = require('../ClientMessage');
3+
import {BitsUtil} from '../BitsUtil';
4+
import {SemaphoreMessageType} from './SemaphoreMessageType';
5+
6+
const REQUEST_TYPE = SemaphoreMessageType.SEMAPHORE_REDUCEPERMITS;
7+
const RESPONSE_TYPE = 100;
8+
const RETRYABLE = false;
9+
10+
export class SemaphoreReducePermitsCodec {
11+
12+
static calculateSize(name: string, reduction: number) {
13+
// Calculates the request payload size
14+
let dataSize: number = 0;
15+
dataSize += BitsUtil.calculateSizeString(name);
16+
dataSize += BitsUtil.INT_SIZE_IN_BYTES;
17+
return dataSize;
18+
}
19+
20+
static encodeRequest(name: string, reduction: number) {
21+
// Encode request into clientMessage
22+
const clientMessage = ClientMessage.newClientMessage(this.calculateSize(name, reduction));
23+
clientMessage.setMessageType(REQUEST_TYPE);
24+
clientMessage.setRetryable(RETRYABLE);
25+
clientMessage.appendString(name);
26+
clientMessage.appendInt32(reduction);
27+
clientMessage.updateFrameLength();
28+
return clientMessage;
29+
}
30+
}

src/codec/SemaphoreReleaseCodec.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* tslint:disable */
2+
import ClientMessage = require('../ClientMessage');
3+
import {BitsUtil} from '../BitsUtil';
4+
import {SemaphoreMessageType} from './SemaphoreMessageType';
5+
6+
const REQUEST_TYPE = SemaphoreMessageType.SEMAPHORE_RELEASE;
7+
const RESPONSE_TYPE = 100;
8+
const RETRYABLE = false;
9+
10+
export class SemaphoreReleaseCodec {
11+
12+
static calculateSize(name: string, permits: number) {
13+
// Calculates the request payload size
14+
let dataSize: number = 0;
15+
dataSize += BitsUtil.calculateSizeString(name);
16+
dataSize += BitsUtil.INT_SIZE_IN_BYTES;
17+
return dataSize;
18+
}
19+
20+
static encodeRequest(name: string, permits: number) {
21+
// Encode request into clientMessage
22+
const clientMessage = ClientMessage.newClientMessage(this.calculateSize(name, permits));
23+
clientMessage.setMessageType(REQUEST_TYPE);
24+
clientMessage.setRetryable(RETRYABLE);
25+
clientMessage.appendString(name);
26+
clientMessage.appendInt32(permits);
27+
clientMessage.updateFrameLength();
28+
return clientMessage;
29+
}
30+
}

0 commit comments

Comments
 (0)