rsocket-core
Advanced tools
Comparing version 0.0.27 to 0.0.28
@@ -1,55 +0,11 @@ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.encodeWellKnownAuthMetadata = encodeWellKnownAuthMetadata; | ||
exports.encodeCustomAuthMetadata = encodeCustomAuthMetadata; | ||
exports.encodeSimpleAuthMetadata = encodeSimpleAuthMetadata; | ||
exports.encodeBearerAuthMetadata = encodeBearerAuthMetadata; | ||
exports.decodeAuthMetadata = decodeAuthMetadata; | ||
exports.decodeSimpleAuthPayload = decodeSimpleAuthPayload; | ||
// @flow | ||
var _LiteBuffer = require('./LiteBuffer'); | ||
var _RSocketBufferUtils = require('./RSocketBufferUtils'); | ||
var _WellKnownAuthType = _interopRequireWildcard( | ||
require('./WellKnownAuthType') | ||
); | ||
function _getRequireWildcardCache() { | ||
if (typeof WeakMap !== 'function') return null; | ||
var cache = new WeakMap(); | ||
_getRequireWildcardCache = function () { | ||
return cache; | ||
}; | ||
return cache; | ||
} | ||
function _interopRequireWildcard(obj) { | ||
if (obj && obj.__esModule) { | ||
return obj; | ||
} | ||
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) { | ||
return {default: obj}; | ||
} | ||
var cache = _getRequireWildcardCache(); | ||
if (cache && cache.has(obj)) { | ||
return cache.get(obj); | ||
} | ||
var newObj = {}; | ||
var hasPropertyDescriptor = | ||
Object.defineProperty && Object.getOwnPropertyDescriptor; | ||
for (var key in obj) { | ||
if (Object.prototype.hasOwnProperty.call(obj, key)) { | ||
var desc = hasPropertyDescriptor | ||
? Object.getOwnPropertyDescriptor(obj, key) | ||
: null; | ||
if (desc && (desc.get || desc.set)) { | ||
Object.defineProperty(newObj, key, desc); | ||
} else { | ||
newObj[key] = obj[key]; | ||
} | ||
} | ||
} | ||
newObj.default = obj; | ||
if (cache) { | ||
cache.set(obj, newObj); | ||
} | ||
return newObj; | ||
} | ||
import {LiteBuffer as Buffer} from './LiteBuffer'; | ||
import {createBuffer, toBuffer} from './RSocketBufferUtils'; | ||
import WellKnownAuthType, { | ||
UNPARSEABLE_AUTH_TYPE, | ||
UNKNOWN_RESERVED_AUTH_TYPE, | ||
SIMPLE, | ||
BEARER, | ||
} from './WellKnownAuthType'; | ||
@@ -63,2 +19,12 @@ const authTypeIdBytesLength = 1; | ||
type AuthMetadata = {| | ||
type: {| | ||
identifier: number, | ||
string: string, | ||
|}, | ||
payload: Buffer, | ||
|}; | ||
type UsernameAndPassword = {|username: Buffer, password: Buffer|}; | ||
/** | ||
@@ -71,13 +37,16 @@ * Encode Auth metadata with the given {@link WellKnownAuthType} and auth payload {@link Buffer} | ||
*/ | ||
function encodeWellKnownAuthMetadata(authType, authPayloadBuffer) { | ||
export function encodeWellKnownAuthMetadata( | ||
authType: WellKnownAuthType, | ||
authPayloadBuffer: Buffer, | ||
): Buffer { | ||
if ( | ||
authType === _WellKnownAuthType.UNPARSEABLE_AUTH_TYPE || | ||
authType === _WellKnownAuthType.UNKNOWN_RESERVED_AUTH_TYPE | ||
authType === UNPARSEABLE_AUTH_TYPE || | ||
authType === UNKNOWN_RESERVED_AUTH_TYPE | ||
) { | ||
throw new Error( | ||
`Illegal WellKnownAuthType[${authType.toString()}]. Only allowed AuthType should be used` | ||
`Illegal WellKnownAuthType[${authType.toString()}]. Only allowed AuthType should be used`, | ||
); | ||
} | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)(authTypeIdBytesLength); | ||
const buffer = createBuffer(authTypeIdBytesLength); | ||
@@ -87,3 +56,3 @@ // eslint-disable-next-line no-bitwise | ||
return _LiteBuffer.LiteBuffer.concat([buffer, authPayloadBuffer]); | ||
return Buffer.concat([buffer, authPayloadBuffer]); | ||
} | ||
@@ -98,6 +67,7 @@ | ||
*/ | ||
function encodeCustomAuthMetadata(customAuthType, authPayloadBuffer) { | ||
const customAuthTypeBuffer = (0, _RSocketBufferUtils.toBuffer)( | ||
customAuthType | ||
); | ||
export function encodeCustomAuthMetadata( | ||
customAuthType: string, | ||
authPayloadBuffer: Buffer, | ||
): Buffer { | ||
const customAuthTypeBuffer = toBuffer(customAuthType); | ||
@@ -112,8 +82,8 @@ if (customAuthTypeBuffer.byteLength !== customAuthType.length) { | ||
throw new Error( | ||
'Custom auth type must have a strictly positive length that fits on 7 unsigned bits, ie 1-128' | ||
'Custom auth type must have a strictly positive length that fits on 7 unsigned bits, ie 1-128', | ||
); | ||
} | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
customAuthTypeBytesLength + customAuthTypeBuffer.byteLength | ||
const buffer = createBuffer( | ||
customAuthTypeBytesLength + customAuthTypeBuffer.byteLength, | ||
); | ||
@@ -126,3 +96,3 @@ | ||
return _LiteBuffer.LiteBuffer.concat([buffer, authPayloadBuffer]); | ||
return Buffer.concat([buffer, authPayloadBuffer]); | ||
} | ||
@@ -137,5 +107,8 @@ | ||
*/ | ||
function encodeSimpleAuthMetadata(username, password) { | ||
const usernameBuffer = (0, _RSocketBufferUtils.toBuffer)(username); | ||
const passwordBuffer = (0, _RSocketBufferUtils.toBuffer)(password); | ||
export function encodeSimpleAuthMetadata( | ||
username: string | Buffer, | ||
password: string | Buffer, | ||
): Buffer { | ||
const usernameBuffer = toBuffer(username); | ||
const passwordBuffer = toBuffer(password); | ||
const usernameLength = usernameBuffer.byteLength; | ||
@@ -145,3 +118,3 @@ | ||
throw new Error( | ||
`Username should be shorter than or equal to 65535 bytes length in UTF-8 encoding but the given was ${usernameLength}` | ||
`Username should be shorter than or equal to 65535 bytes length in UTF-8 encoding but the given was ${usernameLength}`, | ||
); | ||
@@ -151,15 +124,9 @@ } | ||
const capacity = authTypeIdBytesLength + usernameLengthBytesLength; | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)(capacity); | ||
const buffer = createBuffer(capacity); | ||
// eslint-disable-next-line no-bitwise | ||
buffer.writeUInt8( | ||
_WellKnownAuthType.SIMPLE.identifier | streamMetadataKnownMask | ||
); | ||
buffer.writeUInt8(SIMPLE.identifier | streamMetadataKnownMask); | ||
buffer.writeUInt16BE(usernameLength, 1); | ||
return _LiteBuffer.LiteBuffer.concat([ | ||
buffer, | ||
usernameBuffer, | ||
passwordBuffer, | ||
]); | ||
return Buffer.concat([buffer, usernameBuffer, passwordBuffer]); | ||
} | ||
@@ -173,12 +140,10 @@ | ||
*/ | ||
function encodeBearerAuthMetadata(token) { | ||
const tokenBuffer = (0, _RSocketBufferUtils.toBuffer)(token); | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)(authTypeIdBytesLength); | ||
export function encodeBearerAuthMetadata(token: string | Buffer): Buffer { | ||
const tokenBuffer = toBuffer(token); | ||
const buffer = createBuffer(authTypeIdBytesLength); | ||
// eslint-disable-next-line no-bitwise | ||
buffer.writeUInt8( | ||
_WellKnownAuthType.BEARER.identifier | streamMetadataKnownMask | ||
); | ||
buffer.writeUInt8(BEARER.identifier | streamMetadataKnownMask); | ||
return _LiteBuffer.LiteBuffer.concat([buffer, tokenBuffer]); | ||
return Buffer.concat([buffer, tokenBuffer]); | ||
} | ||
@@ -192,6 +157,6 @@ | ||
*/ | ||
function decodeAuthMetadata(metadata) { | ||
export function decodeAuthMetadata(metadata: Buffer): AuthMetadata { | ||
if (metadata.byteLength < 1) { | ||
throw new Error( | ||
'Unable to decode Auth metadata. Not enough readable bytes' | ||
'Unable to decode Auth metadata. Not enough readable bytes', | ||
); | ||
@@ -205,3 +170,3 @@ } | ||
if (normalizedId !== lengthOrId) { | ||
const authType = _WellKnownAuthType.default.fromIdentifier(normalizedId); | ||
const authType = WellKnownAuthType.fromIdentifier(normalizedId); | ||
@@ -220,3 +185,3 @@ return { | ||
throw new Error( | ||
'Unable to decode custom Auth type. Malformed length or auth type string' | ||
'Unable to decode custom Auth type. Malformed length or auth type string', | ||
); | ||
@@ -228,5 +193,4 @@ } | ||
customAuthTypeBytesLength, | ||
customAuthTypeBytesLength + realLength | ||
customAuthTypeBytesLength + realLength, | ||
); | ||
const payload = metadata.slice(realLength + customAuthTypeBytesLength); | ||
@@ -237,3 +201,3 @@ | ||
type: { | ||
identifier: _WellKnownAuthType.UNPARSEABLE_AUTH_TYPE.identifier, | ||
identifier: UNPARSEABLE_AUTH_TYPE.identifier, | ||
string: customAuthTypeString, | ||
@@ -251,6 +215,8 @@ }, | ||
*/ | ||
function decodeSimpleAuthPayload(authPayload) { | ||
export function decodeSimpleAuthPayload( | ||
authPayload: Buffer, | ||
): UsernameAndPassword { | ||
if (authPayload.byteLength < usernameLengthBytesLength) { | ||
throw new Error( | ||
'Unable to decode Simple Auth Payload. Not enough readable bytes' | ||
'Unable to decode Simple Auth Payload. Not enough readable bytes', | ||
); | ||
@@ -263,3 +229,3 @@ } | ||
throw new Error( | ||
'Unable to decode Simple Auth Payload. Not enough readable bytes' | ||
'Unable to decode Simple Auth Payload. Not enough readable bytes', | ||
); | ||
@@ -270,7 +236,6 @@ } | ||
usernameLengthBytesLength, | ||
usernameLengthBytesLength + usernameLength | ||
usernameLengthBytesLength + usernameLength, | ||
); | ||
const password = authPayload.slice( | ||
usernameLengthBytesLength + usernameLength | ||
usernameLengthBytesLength + usernameLength, | ||
); | ||
@@ -277,0 +242,0 @@ |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.encodeCompositeMetadata = encodeCompositeMetadata; | ||
exports.encodeAndAddCustomMetadata = encodeAndAddCustomMetadata; | ||
exports.encodeAndAddWellKnownMetadata = encodeAndAddWellKnownMetadata; | ||
exports.decodeMimeAndContentBuffersSlices = decodeMimeAndContentBuffersSlices; | ||
exports.decodeMimeTypeFromMimeBuffer = decodeMimeTypeFromMimeBuffer; | ||
exports.encodeCustomMetadataHeader = encodeCustomMetadataHeader; | ||
exports.encodeWellKnownMetadataHeader = encodeWellKnownMetadataHeader; | ||
exports.decodeCompositeMetadata = decodeCompositeMetadata; | ||
exports.WellKnownMimeTypeEntry = exports.ReservedMimeTypeEntry = exports.ExplicitMimeTimeEntry = exports.CompositeMetadata = void 0; | ||
// @flow | ||
var _LiteBuffer = require('./LiteBuffer'); | ||
var _RSocketBufferUtils = require('./RSocketBufferUtils'); | ||
import {LiteBuffer as Buffer} from './LiteBuffer'; | ||
import {readUInt24BE, writeUInt24BE} from './RSocketBufferUtils'; | ||
import {createBuffer} from './RSocketBufferUtils'; | ||
import WellKnownMimeType, { | ||
UNKNOWN_RESERVED_MIME_TYPE, | ||
UNPARSEABLE_MIME_TYPE, | ||
} from './WellKnownMimeType'; | ||
var _WellKnownMimeType = _interopRequireWildcard( | ||
require('./WellKnownMimeType') | ||
); | ||
function _getRequireWildcardCache() { | ||
if (typeof WeakMap !== 'function') return null; | ||
var cache = new WeakMap(); | ||
_getRequireWildcardCache = function () { | ||
return cache; | ||
}; | ||
return cache; | ||
} | ||
function _interopRequireWildcard(obj) { | ||
if (obj && obj.__esModule) { | ||
return obj; | ||
} | ||
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) { | ||
return {default: obj}; | ||
} | ||
var cache = _getRequireWildcardCache(); | ||
if (cache && cache.has(obj)) { | ||
return cache.get(obj); | ||
} | ||
var newObj = {}; | ||
var hasPropertyDescriptor = | ||
Object.defineProperty && Object.getOwnPropertyDescriptor; | ||
for (var key in obj) { | ||
if (Object.prototype.hasOwnProperty.call(obj, key)) { | ||
var desc = hasPropertyDescriptor | ||
? Object.getOwnPropertyDescriptor(obj, key) | ||
: null; | ||
if (desc && (desc.get || desc.set)) { | ||
Object.defineProperty(newObj, key, desc); | ||
} else { | ||
newObj[key] = obj[key]; | ||
} | ||
} | ||
} | ||
newObj.default = obj; | ||
if (cache) { | ||
cache.set(obj, newObj); | ||
} | ||
return newObj; | ||
} | ||
// $FlowFixMe | ||
export class CompositeMetadata implements Iterable<Entry> { | ||
_buffer: Buffer; | ||
// $FlowFixMe | ||
class CompositeMetadata { | ||
constructor(buffer) { | ||
constructor(buffer: Buffer) { | ||
this._buffer = buffer; | ||
} | ||
iterator() { | ||
iterator(): Iterator<Entry> { | ||
return decodeCompositeMetadata(this._buffer); | ||
@@ -71,3 +25,3 @@ } | ||
// $FlowFixMe | ||
[Symbol.iterator]() { | ||
[Symbol.iterator](): Iterator<Entry> { | ||
return decodeCompositeMetadata(this._buffer); | ||
@@ -83,5 +37,9 @@ } | ||
* @returns {Buffer} | ||
*/ exports.CompositeMetadata = CompositeMetadata; | ||
function encodeCompositeMetadata(metadata) { | ||
let encodedCompositeMetadata = (0, _RSocketBufferUtils.createBuffer)(0); | ||
*/ | ||
export function encodeCompositeMetadata( | ||
metadata: | ||
| Map<string | WellKnownMimeType | number, Buffer | (() => Buffer)> | ||
| Array<[string | WellKnownMimeType | number, Buffer | (() => Buffer)]>, | ||
): Buffer { | ||
let encodedCompositeMetadata = createBuffer(0); | ||
for (const [metadataKey, metadataValue] of metadata) { | ||
@@ -92,3 +50,3 @@ const metadataRealValue = | ||
if ( | ||
metadataKey instanceof _WellKnownMimeType.default || | ||
metadataKey instanceof WellKnownMimeType || | ||
typeof metadataKey === 'number' || | ||
@@ -99,4 +57,4 @@ metadataKey.constructor.name === 'WellKnownMimeType' | ||
encodedCompositeMetadata, | ||
metadataKey, | ||
metadataRealValue | ||
(metadataKey: any), | ||
metadataRealValue, | ||
); | ||
@@ -106,4 +64,4 @@ } else { | ||
encodedCompositeMetadata, | ||
metadataKey, | ||
metadataRealValue | ||
(metadataKey: any), | ||
metadataRealValue, | ||
); | ||
@@ -130,12 +88,14 @@ } | ||
// see #encodeMetadataHeader(ByteBufAllocator, String, int) | ||
function encodeAndAddCustomMetadata( | ||
compositeMetaData, | ||
customMimeType, | ||
metadata | ||
) { | ||
return _LiteBuffer.LiteBuffer.concat([ | ||
compositeMetaData, | ||
encodeCustomMetadataHeader(customMimeType, metadata.byteLength), | ||
metadata, | ||
]); | ||
export function encodeAndAddCustomMetadata( | ||
compositeMetaData: Buffer, | ||
customMimeType: string, | ||
metadata: Buffer, | ||
): Buffer { | ||
return Buffer.concat( | ||
([ | ||
compositeMetaData, | ||
encodeCustomMetadataHeader(customMimeType, metadata.byteLength), | ||
metadata, | ||
]: Buffer[]), | ||
); | ||
} | ||
@@ -153,20 +113,22 @@ | ||
// see #encodeMetadataHeader(ByteBufAllocator, byte, int) | ||
function encodeAndAddWellKnownMetadata( | ||
compositeMetadata, | ||
knownMimeType, | ||
metadata | ||
) { | ||
let mimeTypeId; | ||
export function encodeAndAddWellKnownMetadata( | ||
compositeMetadata: Buffer, | ||
knownMimeType: WellKnownMimeType | number, | ||
metadata: Buffer, | ||
): Buffer { | ||
let mimeTypeId: number; | ||
if (Number.isInteger(knownMimeType)) { | ||
mimeTypeId = knownMimeType; | ||
mimeTypeId = ((knownMimeType: any): number); | ||
} else { | ||
mimeTypeId = knownMimeType.identifier; | ||
mimeTypeId = ((knownMimeType: any): WellKnownMimeType).identifier; | ||
} | ||
return _LiteBuffer.LiteBuffer.concat([ | ||
compositeMetadata, | ||
encodeWellKnownMetadataHeader(mimeTypeId, metadata.byteLength), | ||
metadata, | ||
]); | ||
return Buffer.concat( | ||
([ | ||
compositeMetadata, | ||
encodeWellKnownMetadataHeader(mimeTypeId, metadata.byteLength), | ||
metadata, | ||
]: Buffer[]), | ||
); | ||
} | ||
@@ -204,5 +166,8 @@ | ||
*/ | ||
function decodeMimeAndContentBuffersSlices(compositeMetadata, entryIndex) { | ||
const mimeIdOrLength = compositeMetadata.readInt8(entryIndex); | ||
let mime; | ||
export function decodeMimeAndContentBuffersSlices( | ||
compositeMetadata: Buffer, | ||
entryIndex: number, | ||
): Buffer[] { | ||
const mimeIdOrLength: number = compositeMetadata.readInt8(entryIndex); | ||
let mime: Buffer; | ||
let toSkip = entryIndex; | ||
@@ -233,3 +198,3 @@ if ( | ||
throw new Error( | ||
'Metadata is malformed. Inappropriately formed Mime Length' | ||
'Metadata is malformed. Inappropriately formed Mime Length', | ||
); | ||
@@ -241,6 +206,3 @@ } | ||
// ensures the length medium can be read | ||
const metadataLength = (0, _RSocketBufferUtils.readUInt24BE)( | ||
compositeMetadata, | ||
toSkip | ||
); | ||
const metadataLength = readUInt24BE(compositeMetadata, toSkip); | ||
toSkip += 3; | ||
@@ -252,3 +214,3 @@ if (compositeMetadata.byteLength >= metadataLength + toSkip) { | ||
throw new Error( | ||
'Metadata is malformed. Inappropriately formed Metadata Length or malformed content' | ||
'Metadata is malformed. Inappropriately formed Metadata Length or malformed content', | ||
); | ||
@@ -258,3 +220,3 @@ } | ||
throw new Error( | ||
'Metadata is malformed. Metadata Length is absent or malformed' | ||
'Metadata is malformed. Metadata Length is absent or malformed', | ||
); | ||
@@ -282,3 +244,5 @@ } | ||
*/ | ||
function decodeMimeTypeFromMimeBuffer(flyweightMimeBuffer) { | ||
export function decodeMimeTypeFromMimeBuffer( | ||
flyweightMimeBuffer: Buffer, | ||
): string { | ||
if (flyweightMimeBuffer.length < 2) { | ||
@@ -293,6 +257,7 @@ throw new Error('Unable to decode explicit MIME type'); | ||
function encodeCustomMetadataHeader(customMime, metadataLength) { | ||
const metadataHeader = (0, _RSocketBufferUtils.createBuffer)( | ||
4 + customMime.length | ||
); | ||
export function encodeCustomMetadataHeader( | ||
customMime: string, | ||
metadataLength: number, | ||
): Buffer { | ||
const metadataHeader: Buffer = createBuffer(4 + customMime.length); | ||
// reserve 1 byte for the customMime length | ||
@@ -305,3 +270,3 @@ // /!\ careful not to read that first byte, which is random at this point | ||
// (which produces the right result since ASCII chars are still encoded on 1 byte in UTF8) | ||
const customMimeLength = metadataHeader.write(customMime, 1); | ||
const customMimeLength: number = metadataHeader.write(customMime, 1); | ||
if (!isAscii(metadataHeader, 1)) { | ||
@@ -312,3 +277,3 @@ throw new Error('Custom mime type must be US_ASCII characters only'); | ||
throw new Error( | ||
'Custom mime type must have a strictly positive length that fits on 7 unsigned bits, ie 1-128' | ||
'Custom mime type must have a strictly positive length that fits on 7 unsigned bits, ie 1-128', | ||
); | ||
@@ -320,7 +285,3 @@ } | ||
(0, _RSocketBufferUtils.writeUInt24BE)( | ||
metadataHeader, | ||
metadataLength, | ||
customMimeLength + 1 | ||
); | ||
writeUInt24BE(metadataHeader, metadataLength, customMimeLength + 1); | ||
@@ -343,7 +304,10 @@ return metadataHeader; | ||
*/ | ||
function encodeWellKnownMetadataHeader(mimeType, metadataLength) { | ||
const buffer = _LiteBuffer.LiteBuffer.alloc(4); | ||
export function encodeWellKnownMetadataHeader( | ||
mimeType: number, | ||
metadataLength: number, | ||
): Buffer { | ||
const buffer: Buffer = Buffer.alloc(4); | ||
buffer.writeUInt8(mimeType | STREAM_METADATA_KNOWN_MASK); | ||
(0, _RSocketBufferUtils.writeUInt24BE)(buffer, metadataLength, 1); | ||
writeUInt24BE(buffer, metadataLength, 1); | ||
@@ -360,3 +324,5 @@ return buffer; | ||
*/ | ||
function* decodeCompositeMetadata(buffer) { | ||
export function* decodeCompositeMetadata( | ||
buffer: Buffer, | ||
): Generator<Entry, void, any> { | ||
const length = buffer.byteLength; | ||
@@ -384,4 +350,4 @@ let entryIndex = 0; | ||
const id = decodeMimeIdFromMimeBuffer(header); | ||
const type = _WellKnownMimeType.default.fromIdentifier(id); | ||
if (_WellKnownMimeType.UNKNOWN_RESERVED_MIME_TYPE === type) { | ||
const type = WellKnownMimeType.fromIdentifier(id); | ||
if (UNKNOWN_RESERVED_MIME_TYPE === type) { | ||
yield new ReservedMimeTypeEntry(data, id); | ||
@@ -395,4 +361,23 @@ continue; | ||
class ExplicitMimeTimeEntry { | ||
constructor(content, type) { | ||
export interface Entry { | ||
/** | ||
* Returns the un-decoded content of the {@link Entry}. | ||
* | ||
* @return the un-decoded content of the {@link Entry} | ||
*/ | ||
+content: Buffer, | ||
/** | ||
* Returns the MIME type of the entry, if it can be decoded. | ||
* | ||
* @return the MIME type of the entry, if it can be decoded, otherwise {@code null}. | ||
*/ | ||
+mimeType: ?string, | ||
} | ||
export class ExplicitMimeTimeEntry implements Entry { | ||
_content: Buffer; | ||
_type: string; | ||
constructor(content: Buffer, type: string) { | ||
this._content = content; | ||
@@ -402,14 +387,16 @@ this._type = type; | ||
get content() { | ||
get content(): Buffer { | ||
return this._content; | ||
} | ||
get mimeType() { | ||
get mimeType(): string { | ||
return this._type; | ||
} | ||
} | ||
exports.ExplicitMimeTimeEntry = ExplicitMimeTimeEntry; | ||
class ReservedMimeTypeEntry { | ||
constructor(content, type) { | ||
export class ReservedMimeTypeEntry implements Entry { | ||
_content: Buffer; | ||
_type: number; | ||
constructor(content: Buffer, type: number) { | ||
this._content = content; | ||
@@ -419,3 +406,3 @@ this._type = type; | ||
get content() { | ||
get content(): Buffer { | ||
return this._content; | ||
@@ -428,3 +415,3 @@ } | ||
*/ | ||
get mimeType() { | ||
get mimeType(): ?string { | ||
return undefined; | ||
@@ -439,10 +426,12 @@ } | ||
*/ | ||
get type() { | ||
get type(): number { | ||
return this._type; | ||
} | ||
} | ||
exports.ReservedMimeTypeEntry = ReservedMimeTypeEntry; | ||
class WellKnownMimeTypeEntry { | ||
constructor(content, type) { | ||
export class WellKnownMimeTypeEntry implements Entry { | ||
_content: Buffer; | ||
_type: WellKnownMimeType; | ||
constructor(content: Buffer, type: WellKnownMimeType) { | ||
this._content = content; | ||
@@ -452,7 +441,7 @@ this._type = type; | ||
get content() { | ||
get content(): Buffer { | ||
return this._content; | ||
} | ||
get mimeType() { | ||
get mimeType(): string { | ||
return this._type.string; | ||
@@ -466,3 +455,3 @@ } | ||
*/ | ||
get type() { | ||
get type(): WellKnownMimeType { | ||
return this._type; | ||
@@ -486,6 +475,6 @@ } | ||
* @see #decodeMimeTypeFromMimeBuffer(ByteBuf) | ||
*/ exports.WellKnownMimeTypeEntry = WellKnownMimeTypeEntry; | ||
function decodeMimeIdFromMimeBuffer(mimeBuffer) { | ||
*/ | ||
function decodeMimeIdFromMimeBuffer(mimeBuffer: Buffer): number { | ||
if (!isWellKnownMimeType(mimeBuffer)) { | ||
return _WellKnownMimeType.UNPARSEABLE_MIME_TYPE.identifier; | ||
return UNPARSEABLE_MIME_TYPE.identifier; | ||
} | ||
@@ -495,3 +484,7 @@ return mimeBuffer.readInt8() & STREAM_METADATA_LENGTH_MASK; | ||
function computeNextEntryIndex(currentEntryIndex, headerSlice, contentSlice) { | ||
function computeNextEntryIndex( | ||
currentEntryIndex: number, | ||
headerSlice: Buffer, | ||
contentSlice: Buffer, | ||
): number { | ||
return ( | ||
@@ -505,3 +498,3 @@ currentEntryIndex + | ||
function isWellKnownMimeType(header) { | ||
function isWellKnownMimeType(header: Buffer): boolean { | ||
return header.byteLength === 1; | ||
@@ -513,3 +506,3 @@ } | ||
function isAscii(buffer, offset) { | ||
function isAscii(buffer: Buffer, offset: number): boolean { | ||
let isAscii = true; | ||
@@ -516,0 +509,0 @@ for (let i = offset, length = buffer.length; i < length; i++) { |
@@ -15,803 +15,178 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
Object.defineProperty(exports, 'RSocketClient', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketClient.default; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'RSocketServer', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketServer.default; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'RSocketResumableTransport', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketResumableTransport.default; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'WellKnownMimeType', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.default; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'UNPARSEABLE_MIME_TYPE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.UNPARSEABLE_MIME_TYPE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'UNKNOWN_RESERVED_MIME_TYPE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.UNKNOWN_RESERVED_MIME_TYPE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_AVRO', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_AVRO; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_CBOR', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_CBOR; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_GRAPHQL', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_GRAPHQL; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_GZIP', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_GZIP; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_JAVASCRIPT', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_JAVASCRIPT; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_JSON', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_JSON; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_OCTET_STREAM', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_OCTET_STREAM; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_PDF', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_PDF; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_THRIFT', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_THRIFT; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_PROTOBUF', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_PROTOBUF; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_XML', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_XML; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_ZIP', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_ZIP; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_AAC', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_AAC; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_MP3', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_MP3; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_MP4', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_MP4; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_MPEG3', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_MPEG3; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_MPEG', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_MPEG; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_OGG', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_OGG; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_OPUS', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_OPUS; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'AUDIO_VORBIS', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.AUDIO_VORBIS; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_BMP', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_BMP; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_GIG', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_GIG; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_HEIC_SEQUENCE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_HEIC_SEQUENCE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_HEIC', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_HEIC; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_HEIF_SEQUENCE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_HEIF_SEQUENCE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_HEIF', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_HEIF; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_JPEG', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_JPEG; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_PNG', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_PNG; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IMAGE_TIFF', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.IMAGE_TIFF; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MULTIPART_MIXED', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.MULTIPART_MIXED; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'TEXT_CSS', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.TEXT_CSS; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'TEXT_CSV', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.TEXT_CSV; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'TEXT_HTML', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.TEXT_HTML; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'TEXT_PLAIN', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.TEXT_PLAIN; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'TEXT_XML', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.TEXT_XML; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'VIDEO_H264', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.VIDEO_H264; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'VIDEO_H265', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.VIDEO_H265; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'VIDEO_VP8', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.VIDEO_VP8; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_HESSIAN', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_HESSIAN; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_JAVA_OBJECT', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_JAVA_OBJECT; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'APPLICATION_CLOUDEVENTS_JSON', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.APPLICATION_CLOUDEVENTS_JSON; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MESSAGE_RSOCKET_MIMETYPE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.MESSAGE_RSOCKET_MIMETYPE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MESSAGE_RSOCKET_ACCEPT_MIMETYPES', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.MESSAGE_RSOCKET_ACCEPT_MIMETYPES; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MESSAGE_RSOCKET_AUTHENTICATION', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.MESSAGE_RSOCKET_AUTHENTICATION; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MESSAGE_RSOCKET_TRACING_ZIPKIN', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.MESSAGE_RSOCKET_TRACING_ZIPKIN; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MESSAGE_RSOCKET_ROUTING', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.MESSAGE_RSOCKET_ROUTING; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MESSAGE_RSOCKET_COMPOSITE_METADATA', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownMimeType.MESSAGE_RSOCKET_COMPOSITE_METADATA; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'WellKnownAuthType', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownAuthType.default; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'UNPARSEABLE_AUTH_TYPE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownAuthType.UNPARSEABLE_AUTH_TYPE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'UNKNOWN_RESERVED_AUTH_TYPE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownAuthType.UNKNOWN_RESERVED_AUTH_TYPE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'SIMPLE', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownAuthType.SIMPLE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'BEARER', { | ||
enumerable: true, | ||
get: function () { | ||
return _WellKnownAuthType.BEARER; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'CONNECTION_STREAM_ID', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.CONNECTION_STREAM_ID; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'ERROR_CODES', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.ERROR_CODES; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'ERROR_EXPLANATIONS', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.ERROR_EXPLANATIONS; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'FLAGS_MASK', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.FLAGS_MASK; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'FLAGS', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.FLAGS; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'FRAME_TYPE_OFFFSET', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.FRAME_TYPE_OFFFSET; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'FRAME_TYPES', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.FRAME_TYPES; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MAX_CODE', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.MAX_CODE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MAX_KEEPALIVE', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.MAX_KEEPALIVE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MAX_LIFETIME', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.MAX_LIFETIME; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MAX_MIME_LENGTH', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.MAX_MIME_LENGTH; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MAX_RESUME_LENGTH', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.MAX_RESUME_LENGTH; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MAX_STREAM_ID', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.MAX_STREAM_ID; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'MAX_VERSION', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.MAX_VERSION; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'createErrorFromFrame', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.createErrorFromFrame; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'getErrorCodeExplanation', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.getErrorCodeExplanation; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'isComplete', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.isComplete; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'isIgnore', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.isIgnore; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'isLease', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.isLease; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'isMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.isMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'isNext', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.isNext; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'isRespond', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.isRespond; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'isResumeEnable', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.isResumeEnable; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'printFrame', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketFrame.printFrame; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'deserializeFrame', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBinaryFraming.deserializeFrame; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'deserializeFrameWithLength', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBinaryFraming.deserializeFrameWithLength; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'deserializeFrames', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBinaryFraming.deserializeFrames; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'serializeFrame', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBinaryFraming.serializeFrame; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'serializeFrameWithLength', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBinaryFraming.serializeFrameWithLength; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'byteLength', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBufferUtils.byteLength; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'createBuffer', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBufferUtils.createBuffer; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'readUInt24BE', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBufferUtils.readUInt24BE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'toBuffer', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBufferUtils.toBuffer; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'writeUInt24BE', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketBufferUtils.writeUInt24BE; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'BufferEncoders', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketEncoding.BufferEncoders; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'BufferEncoder', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketEncoding.BufferEncoder; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'Utf8Encoders', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketEncoding.Utf8Encoders; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'UTF8Encoder', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketEncoding.UTF8Encoder; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IdentitySerializer', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketSerialization.IdentitySerializer; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'IdentitySerializers', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketSerialization.IdentitySerializers; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'JsonSerializer', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketSerialization.JsonSerializer; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'JsonSerializers', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketSerialization.JsonSerializers; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'Leases', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketLease.Leases; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'Lease', { | ||
enumerable: true, | ||
get: function () { | ||
return _RSocketLease.Lease; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'CompositeMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.CompositeMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'ReservedMimeTypeEntry', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.ReservedMimeTypeEntry; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'WellKnownMimeTypeEntry', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.WellKnownMimeTypeEntry; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'ExplicitMimeTimeEntry', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.ExplicitMimeTimeEntry; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeAndAddCustomMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.encodeAndAddCustomMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeAndAddWellKnownMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.encodeAndAddWellKnownMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeCompositeMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.encodeCompositeMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'decodeCompositeMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _CompositeMetadata.decodeCompositeMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'RoutingMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _RoutingMetadata.RoutingMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeRoute', { | ||
enumerable: true, | ||
get: function () { | ||
return _RoutingMetadata.encodeRoute; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeRoutes', { | ||
enumerable: true, | ||
get: function () { | ||
return _RoutingMetadata.encodeRoutes; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'decodeRoutes', { | ||
enumerable: true, | ||
get: function () { | ||
return _RoutingMetadata.decodeRoutes; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeSimpleAuthMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _AuthMetadata.encodeSimpleAuthMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeBearerAuthMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _AuthMetadata.encodeBearerAuthMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeWellKnownAuthMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _AuthMetadata.encodeWellKnownAuthMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'encodeCustomAuthMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _AuthMetadata.encodeCustomAuthMetadata; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'decodeSimpleAuthPayload', { | ||
enumerable: true, | ||
get: function () { | ||
return _AuthMetadata.decodeSimpleAuthPayload; | ||
}, | ||
}); | ||
Object.defineProperty(exports, 'decodeAuthMetadata', { | ||
enumerable: true, | ||
get: function () { | ||
return _AuthMetadata.decodeAuthMetadata; | ||
}, | ||
}); | ||
var _RSocketClient = _interopRequireDefault(require('./RSocketClient')); | ||
export type {ClientConfig} from './RSocketClient'; | ||
var _RSocketServer = _interopRequireDefault(require('./RSocketServer')); | ||
export type {Entry} from './CompositeMetadata'; | ||
var _RSocketResumableTransport = _interopRequireDefault( | ||
require('./RSocketResumableTransport') | ||
); | ||
export type {ServerConfig, TransportServer} from './RSocketServer'; | ||
var _WellKnownMimeType = _interopRequireWildcard( | ||
require('./WellKnownMimeType') | ||
); | ||
export type {Encodable} from 'rsocket-types'; | ||
var _WellKnownAuthType = _interopRequireWildcard( | ||
require('./WellKnownAuthType') | ||
); | ||
export type {Encoder, Encoders} from './RSocketEncoding'; | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
export type {Serializer, PayloadSerializers} from './RSocketSerialization'; | ||
var _RSocketBinaryFraming = require('./RSocketBinaryFraming'); | ||
export type {LeaseStats} from './RSocketLease'; | ||
var _RSocketBufferUtils = require('./RSocketBufferUtils'); | ||
import RSocketClient from './RSocketClient'; | ||
var _RSocketEncoding = require('./RSocketEncoding'); | ||
export {RSocketClient}; | ||
var _RSocketSerialization = require('./RSocketSerialization'); | ||
import RSocketServer from './RSocketServer'; | ||
var _RSocketLease = require('./RSocketLease'); | ||
export {RSocketServer}; | ||
var _CompositeMetadata = require('./CompositeMetadata'); | ||
import RSocketError from './RSocketError'; | ||
var _RoutingMetadata = require('./RoutingMetadata'); | ||
export {RSocketError}; | ||
var _AuthMetadata = require('./AuthMetadata'); | ||
function _getRequireWildcardCache() { | ||
if (typeof WeakMap !== 'function') return null; | ||
var cache = new WeakMap(); | ||
_getRequireWildcardCache = function () { | ||
return cache; | ||
}; | ||
return cache; | ||
} | ||
function _interopRequireWildcard(obj) { | ||
if (obj && obj.__esModule) { | ||
return obj; | ||
} | ||
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) { | ||
return {default: obj}; | ||
} | ||
var cache = _getRequireWildcardCache(); | ||
if (cache && cache.has(obj)) { | ||
return cache.get(obj); | ||
} | ||
var newObj = {}; | ||
var hasPropertyDescriptor = | ||
Object.defineProperty && Object.getOwnPropertyDescriptor; | ||
for (var key in obj) { | ||
if (Object.prototype.hasOwnProperty.call(obj, key)) { | ||
var desc = hasPropertyDescriptor | ||
? Object.getOwnPropertyDescriptor(obj, key) | ||
: null; | ||
if (desc && (desc.get || desc.set)) { | ||
Object.defineProperty(newObj, key, desc); | ||
} else { | ||
newObj[key] = obj[key]; | ||
} | ||
} | ||
} | ||
newObj.default = obj; | ||
if (cache) { | ||
cache.set(obj, newObj); | ||
} | ||
return newObj; | ||
} | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
import RSocketResumableTransport from './RSocketResumableTransport'; | ||
export {RSocketResumableTransport}; | ||
import WellKnownMimeType from './WellKnownMimeType'; | ||
export {WellKnownMimeType}; | ||
import WellKnownAuthType from './WellKnownAuthType'; | ||
export {WellKnownAuthType}; | ||
export { | ||
CONNECTION_STREAM_ID, | ||
ERROR_CODES, | ||
ERROR_EXPLANATIONS, | ||
FLAGS_MASK, | ||
FLAGS, | ||
FRAME_TYPE_OFFFSET, | ||
FRAME_TYPES, | ||
MAX_CODE, | ||
MAX_KEEPALIVE, | ||
MAX_LIFETIME, | ||
MAX_MIME_LENGTH, | ||
MAX_RESUME_LENGTH, | ||
MAX_STREAM_ID, | ||
MAX_VERSION, | ||
createErrorFromFrame, | ||
getErrorCodeExplanation, | ||
isComplete, | ||
isIgnore, | ||
isLease, | ||
isMetadata, | ||
isNext, | ||
isRespond, | ||
isResumeEnable, | ||
printFrame, | ||
} from './RSocketFrame'; | ||
export { | ||
deserializeFrame, | ||
deserializeFrameWithLength, | ||
deserializeFrames, | ||
serializeFrame, | ||
serializeFrameWithLength, | ||
} from './RSocketBinaryFraming'; | ||
export { | ||
byteLength, | ||
createBuffer, | ||
readUInt24BE, | ||
toBuffer, | ||
writeUInt24BE, | ||
} from './RSocketBufferUtils'; | ||
export { | ||
BufferEncoders, | ||
BufferEncoder, | ||
Utf8Encoders, | ||
UTF8Encoder, | ||
} from './RSocketEncoding'; | ||
export { | ||
IdentitySerializer, | ||
IdentitySerializers, | ||
JsonSerializer, | ||
JsonSerializers, | ||
} from './RSocketSerialization'; | ||
export {Leases, Lease} from './RSocketLease'; | ||
export { | ||
UNPARSEABLE_MIME_TYPE, | ||
UNKNOWN_RESERVED_MIME_TYPE, | ||
APPLICATION_AVRO, | ||
APPLICATION_CBOR, | ||
APPLICATION_GRAPHQL, | ||
APPLICATION_GZIP, | ||
APPLICATION_JAVASCRIPT, | ||
APPLICATION_JSON, | ||
APPLICATION_OCTET_STREAM, | ||
APPLICATION_PDF, | ||
APPLICATION_THRIFT, | ||
APPLICATION_PROTOBUF, | ||
APPLICATION_XML, | ||
APPLICATION_ZIP, | ||
AUDIO_AAC, | ||
AUDIO_MP3, | ||
AUDIO_MP4, | ||
AUDIO_MPEG3, | ||
AUDIO_MPEG, | ||
AUDIO_OGG, | ||
AUDIO_OPUS, | ||
AUDIO_VORBIS, | ||
IMAGE_BMP, | ||
IMAGE_GIG, | ||
IMAGE_HEIC_SEQUENCE, | ||
IMAGE_HEIC, | ||
IMAGE_HEIF_SEQUENCE, | ||
IMAGE_HEIF, | ||
IMAGE_JPEG, | ||
IMAGE_PNG, | ||
IMAGE_TIFF, | ||
MULTIPART_MIXED, | ||
TEXT_CSS, | ||
TEXT_CSV, | ||
TEXT_HTML, | ||
TEXT_PLAIN, | ||
TEXT_XML, | ||
VIDEO_H264, | ||
VIDEO_H265, | ||
VIDEO_VP8, | ||
APPLICATION_HESSIAN, | ||
APPLICATION_JAVA_OBJECT, | ||
APPLICATION_CLOUDEVENTS_JSON, | ||
MESSAGE_RSOCKET_MIMETYPE, | ||
MESSAGE_RSOCKET_ACCEPT_MIMETYPES, | ||
MESSAGE_RSOCKET_AUTHENTICATION, | ||
MESSAGE_RSOCKET_TRACING_ZIPKIN, | ||
MESSAGE_RSOCKET_ROUTING, | ||
MESSAGE_RSOCKET_COMPOSITE_METADATA, | ||
} from './WellKnownMimeType'; | ||
export { | ||
CompositeMetadata, | ||
ReservedMimeTypeEntry, | ||
WellKnownMimeTypeEntry, | ||
ExplicitMimeTimeEntry, | ||
encodeAndAddCustomMetadata, | ||
encodeAndAddWellKnownMetadata, | ||
encodeCompositeMetadata, | ||
decodeCompositeMetadata, | ||
} from './CompositeMetadata'; | ||
export { | ||
RoutingMetadata, | ||
encodeRoute, | ||
encodeRoutes, | ||
decodeRoutes, | ||
} from './RoutingMetadata'; | ||
export { | ||
encodeSimpleAuthMetadata, | ||
encodeBearerAuthMetadata, | ||
encodeWellKnownAuthMetadata, | ||
encodeCustomAuthMetadata, | ||
decodeSimpleAuthPayload, | ||
decodeAuthMetadata, | ||
} from './AuthMetadata'; | ||
export { | ||
UNPARSEABLE_AUTH_TYPE, | ||
UNKNOWN_RESERVED_AUTH_TYPE, | ||
SIMPLE, | ||
BEARER, | ||
} from './WellKnownAuthType'; |
@@ -7,3 +7,3 @@ /** | ||
* | ||
* | ||
* @flow | ||
*/ | ||
@@ -21,3 +21,7 @@ 'use strict'; | ||
*/ | ||
function invariant(condition, format, ...args) { | ||
function invariant( | ||
condition: mixed, | ||
format: string, | ||
...args: Array<mixed> | ||
): void { | ||
if (!condition) { | ||
@@ -29,3 +33,3 @@ let error; | ||
'Minified exception occurred; use the non-minified ' + | ||
'dev environment for the full error message and additional helpful warnings.' | ||
'dev environment for the full error message and additional helpful warnings.', | ||
); | ||
@@ -38,3 +42,3 @@ } else { | ||
error.framesToPop = 1; // Skip invariant's own stack frame. | ||
(error: any).framesToPop = 1; // Skip invariant's own stack frame. | ||
@@ -41,0 +45,0 @@ throw error; |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.LiteBuffer = exports.Buffer = void 0; | ||
// @flow | ||
var _buffer = _interopRequireDefault(require('buffer')); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
import type {Buffer as NodeBuffer} from 'buffer'; | ||
import ExistingBufferModule from 'buffer'; | ||
const hasGlobalBuffer = | ||
typeof global !== 'undefined' && global.hasOwnProperty('Buffer'); | ||
const hasBufferModule = _buffer.default.hasOwnProperty('Buffer'); | ||
const hasBufferModule = ExistingBufferModule.hasOwnProperty('Buffer'); | ||
function notImplemented(msg) { | ||
function notImplemented(msg?: string): void { | ||
const message = msg ? `Not implemented: ${msg}` : 'Not implemented'; | ||
@@ -24,3 +21,3 @@ throw new Error(message); | ||
// inlined properly. That prioritizes the common case. | ||
function normalizeEncoding(enc) { | ||
function normalizeEncoding(enc: string | null): ?string { | ||
if (enc == null || enc === 'utf8' || enc === 'utf-8') { | ||
@@ -44,3 +41,3 @@ return 'utf8'; | ||
// https://github.com/nodejs/node/blob/ba684805b6c0eded76e5cd89ee00328ac7a59365/lib/internal/util.js#L130 | ||
function slowCases(enc) { | ||
function slowCases(enc: string): ?string { | ||
switch (enc.length) { | ||
@@ -150,3 +147,3 @@ case 4: | ||
function checkEncoding(encoding = 'utf8', strict = true) { | ||
function checkEncoding(encoding = 'utf8', strict = true): string { | ||
if (typeof encoding !== 'string' || (strict && encoding === '')) { | ||
@@ -169,37 +166,36 @@ if (!strict) { | ||
return normalized; | ||
return ((normalized: any): string); | ||
} | ||
interface EncodingOp { | ||
byteLength(string: string): number, | ||
} | ||
// https://github.com/nodejs/node/blob/56dbe466fdbc598baea3bfce289bf52b97b8b8f7/lib/buffer.js#L598 | ||
const encodingOps = { | ||
const encodingOps: {[key: string]: EncodingOp} = { | ||
ascii: { | ||
byteLength: (string) => string.length, | ||
byteLength: (string: string): number => string.length, | ||
}, | ||
base64: { | ||
byteLength: (string) => base64ByteLength(string, string.length), | ||
byteLength: (string: string): number => | ||
base64ByteLength(string, string.length), | ||
}, | ||
hex: { | ||
byteLength: (string) => string.length >>> 1, | ||
byteLength: (string: string): number => string.length >>> 1, | ||
}, | ||
latin1: { | ||
byteLength: (string) => string.length, | ||
byteLength: (string: string): number => string.length, | ||
}, | ||
ucs2: { | ||
byteLength: (string) => string.length * 2, | ||
byteLength: (string: string): number => string.length * 2, | ||
}, | ||
utf16le: { | ||
byteLength: (string) => string.length * 2, | ||
byteLength: (string: string): number => string.length * 2, | ||
}, | ||
utf8: { | ||
byteLength: (string) => utf8ToBytes(string).length, | ||
byteLength: (string: string): number => utf8ToBytes(string).length, | ||
}, | ||
}; | ||
function base64ByteLength(str, bytes) { | ||
function base64ByteLength(str: string, bytes: number): number { | ||
// Handle padding | ||
@@ -231,3 +227,3 @@ if (str.charCodeAt(bytes - 1) === 0x3d) { | ||
String, | ||
codePoints.slice(i, (i += MAX_ARGUMENTS_LENGTH)) | ||
codePoints.slice(i, (i += MAX_ARGUMENTS_LENGTH)), | ||
); | ||
@@ -238,3 +234,3 @@ } | ||
function utf8ToBytes(str, pUnits = Infinity) { | ||
function utf8ToBytes(str: string, pUnits: number = Infinity): number[] { | ||
let units = pUnits; | ||
@@ -313,3 +309,3 @@ let codePoint; | ||
((codePoint >> 0x6) & 0x3f) | 0x80, | ||
(codePoint & 0x3f) | 0x80 | ||
(codePoint & 0x3f) | 0x80, | ||
); | ||
@@ -324,3 +320,3 @@ } else if (codePoint < 0x110000) { | ||
((codePoint >> 0x6) & 0x3f) | 0x80, | ||
(codePoint & 0x3f) | 0x80 | ||
(codePoint & 0x3f) | 0x80, | ||
); | ||
@@ -335,3 +331,3 @@ } else { | ||
function utf8Slice(buf, start, end) { | ||
function utf8Slice(buf: Buffer, start: number, end: number) { | ||
end = Math.min(buf.length, end); | ||
@@ -421,3 +417,8 @@ const res = []; | ||
function utf8Write(buf, input, offset, length) { | ||
function utf8Write( | ||
buf: Buffer, | ||
input: string, | ||
offset: number, | ||
length: number, | ||
): number { | ||
return blitBuffer( | ||
@@ -427,8 +428,13 @@ utf8ToBytes(input, buf.length - offset), | ||
offset, | ||
length | ||
length, | ||
); | ||
} | ||
function blitBuffer(src, dst, offset, length) { | ||
let i = 0; | ||
function blitBuffer( | ||
src: number[], | ||
dst: Buffer, | ||
offset: number, | ||
length: number, | ||
): number { | ||
let i: number = 0; | ||
for (; i < length; ++i) { | ||
@@ -446,4 +452,8 @@ if (i + offset >= dst.length || i >= src.length) { | ||
*/ | ||
class Buffer extends Uint8Array { | ||
constructor(value, byteOffset, length) { | ||
export class Buffer extends Uint8Array { | ||
constructor( | ||
value: number | Buffer | $TypedArray | ArrayBuffer | number[], | ||
byteOffset?: number, | ||
length?: number, | ||
) { | ||
if (typeof value == 'number') { | ||
@@ -456,3 +466,3 @@ super(value); | ||
length || (isInstance(value, Array) ? value.length : value.byteLength); | ||
super(value, offset, realLength); | ||
super((value: any), offset, realLength); | ||
} | ||
@@ -463,6 +473,10 @@ } | ||
*/ | ||
static alloc(size, fill = 0, encoding = 'utf8') { | ||
static alloc( | ||
size: number, | ||
fill: number | string | Uint8Array | Buffer = 0, | ||
encoding: string = 'utf8', | ||
): Buffer { | ||
if (typeof size !== 'number') { | ||
throw new TypeError( | ||
`The "size" argument must be of type number. Received type ${typeof size}` | ||
`The "size" argument must be of type number. Received type ${typeof size}`, | ||
); | ||
@@ -489,3 +503,3 @@ } | ||
throw new TypeError( | ||
`The argument "value" is invalid. Received ${fill.constructor.name} []` | ||
`The argument "value" is invalid. Received ${fill.constructor.name} []`, | ||
); | ||
@@ -518,3 +532,3 @@ } | ||
static allocUnsafe(size) { | ||
static allocUnsafe(size: number): Buffer { | ||
return new Buffer(size); | ||
@@ -528,3 +542,6 @@ } | ||
*/ | ||
static byteLength(string, encoding = 'utf8') { | ||
static byteLength( | ||
string: string | Buffer | ArrayBuffer, | ||
encoding: string = 'utf8', | ||
): number { | ||
if (typeof string != 'string') { | ||
@@ -542,3 +559,3 @@ return string.byteLength; | ||
*/ | ||
static concat(list, totalLength) { | ||
static concat(list: Buffer[] | Uint8Array[], totalLength?: number): Buffer { | ||
if (totalLength == undefined) { | ||
@@ -569,7 +586,8 @@ totalLength = 0; | ||
static from( | ||
value, | ||
byteOffsetOrEncoding, | ||
value: string | Buffer | $TypedArray | ArrayBuffer | number[], | ||
byteOffsetOrEncoding?: number | string, | ||
//$FlowFixMe | ||
length | ||
) { | ||
length?: number, | ||
//$FlowFixMe | ||
): Buffer { | ||
const offset = | ||
@@ -608,3 +626,3 @@ typeof byteOffsetOrEncoding === 'string' | ||
*/ | ||
static isBuffer(obj) { | ||
static isBuffer(obj: any): boolean { | ||
return ( | ||
@@ -616,3 +634,3 @@ isInstance(obj, Buffer) || | ||
static isEncoding(encoding) { | ||
static isEncoding(encoding: any): boolean { | ||
return ( | ||
@@ -630,7 +648,7 @@ typeof encoding === 'string' && | ||
copy( | ||
targetBuffer, | ||
targetStart = 0, | ||
sourceStart = 0, | ||
sourceEnd = this.length | ||
) { | ||
targetBuffer: Buffer | Uint8Array, | ||
targetStart: number = 0, | ||
sourceStart: number = 0, | ||
sourceEnd: number = this.length, | ||
): number { | ||
const sourceBuffer = this.subarray(sourceStart, sourceEnd); | ||
@@ -644,7 +662,7 @@ targetBuffer.set(sourceBuffer, targetStart); | ||
*/ | ||
equals(otherBuffer) { | ||
equals(otherBuffer: Uint8Array | Buffer): boolean { | ||
if (!isInstance(otherBuffer, Uint8Array)) { | ||
throw new TypeError( | ||
// eslint-disable-next-line max-len | ||
`The "otherBuffer" argument must be an instance of Buffer or Uint8Array. Received type ${typeof otherBuffer}` | ||
`The "otherBuffer" argument must be an instance of Buffer or Uint8Array. Received type ${typeof otherBuffer}`, | ||
); | ||
@@ -669,101 +687,101 @@ } | ||
readDoubleBE(offset = 0) { | ||
readDoubleBE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getFloat64(offset); | ||
} | ||
readDoubleLE(offset = 0) { | ||
readDoubleLE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getFloat64(offset, true); | ||
} | ||
readFloatBE(offset = 0) { | ||
readFloatBE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getFloat32(offset); | ||
} | ||
readFloatLE(offset = 0) { | ||
readFloatLE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getFloat32(offset, true); | ||
} | ||
readInt8(offset = 0) { | ||
readInt8(offset: number = 0): number { | ||
return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt8( | ||
offset | ||
offset, | ||
); | ||
} | ||
readInt16BE(offset = 0) { | ||
readInt16BE(offset: number = 0): number { | ||
return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt16( | ||
offset | ||
offset, | ||
); | ||
} | ||
readInt16LE(offset = 0) { | ||
readInt16LE(offset: number = 0): number { | ||
return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt16( | ||
offset, | ||
true | ||
true, | ||
); | ||
} | ||
readInt32BE(offset = 0) { | ||
readInt32BE(offset: number = 0): number { | ||
return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt32( | ||
offset | ||
offset, | ||
); | ||
} | ||
readInt32LE(offset = 0) { | ||
readInt32LE(offset: number = 0): number { | ||
return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt32( | ||
offset, | ||
true | ||
true, | ||
); | ||
} | ||
readUInt8(offset = 0) { | ||
readUInt8(offset: number = 0): number { | ||
return new DataView(this.buffer, this.byteOffset, this.byteLength).getUint8( | ||
offset | ||
offset, | ||
); | ||
} | ||
readUInt16BE(offset = 0) { | ||
readUInt16BE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getUint16(offset); | ||
} | ||
readUInt16LE(offset = 0) { | ||
readUInt16LE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getUint16(offset, true); | ||
} | ||
readUInt32BE(offset = 0) { | ||
readUInt32BE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getUint32(offset); | ||
} | ||
readUInt32LE(offset = 0) { | ||
readUInt32LE(offset: number = 0): number { | ||
return new DataView( | ||
this.buffer, | ||
this.byteOffset, | ||
this.byteLength | ||
this.byteLength, | ||
).getUint32(offset, true); | ||
@@ -777,3 +795,3 @@ } | ||
// $FlowFixMe | ||
slice(begin = 0, end = this.length) { | ||
slice(begin: number = 0, end: number = this.length): Buffer { | ||
// workaround for https://github.com/microsoft/TypeScript/issues/38665 | ||
@@ -784,3 +802,3 @@ return this.subarray(begin, end); | ||
// $FlowFixMe | ||
subarray(begin = 0, end = this.length) { | ||
subarray(begin: number = 0, end: number = this.length): Buffer { | ||
return new Buffer(super.subarray(begin, end)); | ||
@@ -793,3 +811,3 @@ } | ||
*/ | ||
toJSON() { | ||
toJSON(): any { | ||
return {data: Array.from(this), type: 'Buffer'}; | ||
@@ -802,3 +820,7 @@ } | ||
*/ | ||
toString(encoding = 'utf8', start = 0, end = this.length) { | ||
toString( | ||
encoding: string = 'utf8', | ||
start: number = 0, | ||
end: number = this.length, | ||
): string { | ||
encoding = checkEncoding(encoding); | ||
@@ -817,3 +839,7 @@ | ||
slowToString(encoding = 'utf8', start = 0, end = this.length) { | ||
slowToString( | ||
encoding: string = 'utf8', | ||
start: number = 0, | ||
end: number = this.length, | ||
): string { | ||
if (start === undefined || start < 0) { | ||
@@ -858,3 +884,8 @@ start = 0; | ||
*/ | ||
write(string, offset = 0, length = this.length, encoding = 'utf8') { | ||
write( | ||
string: string, | ||
offset: number = 0, | ||
length: number = this.length, | ||
encoding: string = 'utf8', | ||
): number { | ||
encoding = checkEncoding(encoding); | ||
@@ -878,135 +909,120 @@ switch (encoding) { | ||
writeDoubleBE(value, offset = 0) { | ||
writeDoubleBE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat64( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 8; | ||
} | ||
writeDoubleLE(value, offset = 0) { | ||
writeDoubleLE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat64( | ||
offset, | ||
value, | ||
true | ||
true, | ||
); | ||
return offset + 8; | ||
} | ||
writeFloatBE(value, offset = 0) { | ||
writeFloatBE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat32( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 4; | ||
} | ||
writeFloatLE(value, offset = 0) { | ||
writeFloatLE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat32( | ||
offset, | ||
value, | ||
true | ||
true, | ||
); | ||
return offset + 4; | ||
} | ||
writeInt8(value, offset = 0) { | ||
writeInt8(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setInt8( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 1; | ||
} | ||
writeInt16BE(value, offset = 0) { | ||
writeInt16BE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setInt16( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 2; | ||
} | ||
writeInt16LE(value, offset = 0) { | ||
writeInt16LE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setInt16( | ||
offset, | ||
value, | ||
true | ||
true, | ||
); | ||
return offset + 2; | ||
} | ||
writeInt32BE(value, offset = 0) { | ||
writeInt32BE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setUint32( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 4; | ||
} | ||
writeInt32LE(value, offset = 0) { | ||
writeInt32LE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setInt32( | ||
offset, | ||
value, | ||
true | ||
true, | ||
); | ||
return offset + 4; | ||
} | ||
writeUInt8(value, offset = 0) { | ||
writeUInt8(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setUint8( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 1; | ||
} | ||
writeUInt16BE(value, offset = 0) { | ||
writeUInt16BE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setUint16( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 2; | ||
} | ||
writeUInt16LE(value, offset = 0) { | ||
writeUInt16LE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setUint16( | ||
offset, | ||
value, | ||
true | ||
true, | ||
); | ||
return offset + 2; | ||
} | ||
writeUInt32BE(value, offset = 0) { | ||
writeUInt32BE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setUint32( | ||
offset, | ||
value | ||
value, | ||
); | ||
return offset + 4; | ||
} | ||
writeUInt32LE(value, offset = 0) { | ||
writeUInt32LE(value: number, offset: number = 0): number { | ||
new DataView(this.buffer, this.byteOffset, this.byteLength).setUint32( | ||
offset, | ||
value, | ||
true | ||
true, | ||
); | ||
return offset + 4; | ||
} | ||
} | ||
exports.Buffer = Buffer; | ||
@@ -1018,3 +1034,3 @@ if (!hasGlobalBuffer) { | ||
// $FlowFixMe | ||
Object.defineProperty(_buffer.default, 'Buffer', { | ||
Object.defineProperty(ExistingBufferModule, 'Buffer', { | ||
configurable: true, | ||
@@ -1035,3 +1051,2 @@ enumerable: false, | ||
const LiteBuffer = hasGlobalBuffer ? global.Buffer : Buffer; | ||
exports.LiteBuffer = LiteBuffer; | ||
export const LiteBuffer: NodeBuffer = hasGlobalBuffer ? global.Buffer : Buffer; |
@@ -1,62 +0,64 @@ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.ReassemblyDuplexConnection = void 0; | ||
import type { | ||
DuplexConnection, | ||
Frame, | ||
ISubscriber, | ||
ISubscription, | ||
Encodable, | ||
ConnectionStatus, | ||
} from 'rsocket-types'; | ||
import {LiteBuffer as Buffer} from './LiteBuffer'; | ||
import {Flowable} from 'rsocket-flowable'; | ||
import { | ||
CONNECTION_STREAM_ID, | ||
isComplete, | ||
isFollows, | ||
FRAME_TYPES, | ||
FLAGS, | ||
} from './RSocketFrame'; | ||
var _LiteBuffer = require('./LiteBuffer'); | ||
var _rsocketFlowable = require('rsocket-flowable'); | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
export class ReassemblyDuplexConnection implements DuplexConnection { | ||
_source: DuplexConnection; | ||
class ReassemblyDuplexConnection { | ||
constructor(source) { | ||
constructor(source: DuplexConnection) { | ||
this._source = source; | ||
} | ||
sendOne(frame) { | ||
sendOne(frame: Frame): void { | ||
this._source.sendOne(frame); | ||
} | ||
send(input) { | ||
send(input: Flowable<Frame>): void { | ||
this._source.send(input); | ||
} | ||
receive() { | ||
receive(): Flowable<Frame> { | ||
return this._source | ||
.receive() | ||
.lift((actual) => new ReassemblySubscriber(actual)); | ||
.lift(actual => new ReassemblySubscriber(actual)); | ||
} | ||
close() { | ||
close(): void { | ||
this._source.close(); | ||
} | ||
connect() { | ||
connect(): void { | ||
this._source.connect(); | ||
} | ||
connectionStatus() { | ||
connectionStatus(): Flowable<ConnectionStatus> { | ||
return this._source.connectionStatus(); | ||
} | ||
} | ||
exports.ReassemblyDuplexConnection = ReassemblyDuplexConnection; | ||
class ReassemblySubscriber { | ||
constructor(actual) { | ||
_defineProperty(this, '_framesReassemblyMap', new Map()); | ||
class ReassemblySubscriber implements ISubscriber<Frame>, ISubscription { | ||
_framesReassemblyMap: Map<number, Frame> = new Map(); | ||
_actual: ISubscriber<Frame>; | ||
_subscription: ISubscription; | ||
constructor(actual: ISubscriber<Frame>) { | ||
this._actual = actual; | ||
} | ||
request(n) { | ||
request(n: number) { | ||
this._subscription.request(n); | ||
@@ -70,3 +72,3 @@ } | ||
onSubscribe(s) { | ||
onSubscribe(s: ISubscription): void { | ||
if (this._subscription == null) { | ||
@@ -80,18 +82,17 @@ this._subscription = s; | ||
onComplete() { | ||
onComplete(): void { | ||
this._actual.onComplete(); | ||
} | ||
onError(error) { | ||
onError(error: Error): void { | ||
this._actual.onError(error); | ||
} | ||
onNext(frame) { | ||
onNext(frame: Frame): void { | ||
const streamId = frame.streamId; | ||
if (streamId !== _RSocketFrame.CONNECTION_STREAM_ID) { | ||
const hasFollowsFlag = (0, _RSocketFrame.isFollows)(frame.flags); | ||
const hasCompleteFlag = (0, _RSocketFrame.isComplete)(frame.flags); | ||
if (streamId !== CONNECTION_STREAM_ID) { | ||
const hasFollowsFlag = isFollows(frame.flags); | ||
const hasCompleteFlag = isComplete(frame.flags); | ||
const isCancelOrError = | ||
frame.type === _RSocketFrame.FRAME_TYPES.ERROR || | ||
frame.type === _RSocketFrame.FRAME_TYPES.CANCEL; | ||
frame.type === FRAME_TYPES.ERROR || frame.type === FRAME_TYPES.CANCEL; | ||
@@ -106,3 +107,3 @@ const storedFrame = this._framesReassemblyMap.get(streamId); | ||
storedFrame.metadata, | ||
frame.metadata | ||
frame.metadata, | ||
); | ||
@@ -119,3 +120,3 @@ } | ||
if (hasCompleteFlag) { | ||
storedFrame.flags |= _RSocketFrame.FLAGS.COMPLETE; | ||
storedFrame.flags |= FLAGS.COMPLETE; | ||
} | ||
@@ -140,3 +141,3 @@ | ||
const concatContent = (a, b) => { | ||
const concatContent = (a: Encodable, b: Encodable): Encodable => { | ||
switch (a.constructor.name) { | ||
@@ -151,4 +152,4 @@ case 'String': | ||
default: | ||
return _LiteBuffer.LiteBuffer.concat([a, b]); | ||
return Buffer.concat([a, b]); | ||
} | ||
}; |
@@ -1,18 +0,16 @@ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.encodeRoutes = encodeRoutes; | ||
exports.encodeRoute = encodeRoute; | ||
exports.decodeRoutes = decodeRoutes; | ||
exports.RoutingMetadata = void 0; | ||
// $FlowFixMe | ||
// @flow | ||
var _LiteBuffer = require('./LiteBuffer'); | ||
var _RSocketBufferUtils = require('./RSocketBufferUtils'); // $FlowFixMe | ||
import {LiteBuffer as Buffer} from './LiteBuffer'; | ||
import {createBuffer, toBuffer} from './RSocketBufferUtils'; | ||
// $FlowFixMe | ||
class RoutingMetadata { | ||
constructor(buffer) { | ||
export class RoutingMetadata implements Iterable<string> { | ||
_buffer: Buffer; | ||
constructor(buffer: Buffer) { | ||
this._buffer = buffer; | ||
} | ||
iterator() { | ||
iterator(): Iterator<string> { | ||
return decodeRoutes(this._buffer); | ||
@@ -22,3 +20,3 @@ } | ||
// $FlowFixMe | ||
[Symbol.iterator]() { | ||
[Symbol.iterator](): Iterator<string> { | ||
return decodeRoutes(this._buffer); | ||
@@ -33,4 +31,4 @@ } | ||
* @returns {Buffer} with encoded content | ||
*/ exports.RoutingMetadata = RoutingMetadata; | ||
function encodeRoutes(...routes) { | ||
*/ | ||
export function encodeRoutes(...routes: string[]): Buffer { | ||
if (routes.length < 1) { | ||
@@ -40,24 +38,24 @@ throw new Error('routes should be non empty array'); | ||
return _LiteBuffer.LiteBuffer.concat( | ||
routes.map((route) => encodeRoute(route)) | ||
); | ||
return Buffer.concat(routes.map(route => encodeRoute(route))); | ||
} | ||
function encodeRoute(route) { | ||
const encodedRoute = (0, _RSocketBufferUtils.toBuffer)(route, 'utf8'); | ||
export function encodeRoute(route: string): Buffer { | ||
const encodedRoute = toBuffer(route, 'utf8'); | ||
if (encodedRoute.length > 255) { | ||
throw new Error( | ||
`route length should fit into unsigned byte length but the given one is ${encodedRoute.length}` | ||
`route length should fit into unsigned byte length but the given one is ${encodedRoute.length}`, | ||
); | ||
} | ||
const encodedLength = (0, _RSocketBufferUtils.createBuffer)(1); | ||
const encodedLength = createBuffer(1); | ||
encodedLength.writeUInt8(encodedRoute.length); | ||
return _LiteBuffer.LiteBuffer.concat([encodedLength, encodedRoute]); | ||
return Buffer.concat([encodedLength, encodedRoute]); | ||
} | ||
function* decodeRoutes(routeMetadataBuffer) { | ||
export function* decodeRoutes( | ||
routeMetadataBuffer: Buffer, | ||
): Generator<string, void, any> { | ||
const length = routeMetadataBuffer.byteLength; | ||
@@ -71,3 +69,3 @@ let offset = 0; | ||
throw new Error( | ||
`Malformed RouteMetadata. Offset(${offset}) + RouteLength(${routeLength}) is greater than TotalLength` | ||
`Malformed RouteMetadata. Offset(${offset}) + RouteLength(${routeLength}) is greater than TotalLength`, | ||
); | ||
@@ -79,5 +77,4 @@ } | ||
offset, | ||
offset + routeLength | ||
offset + routeLength, | ||
); | ||
offset += routeLength; | ||
@@ -84,0 +81,0 @@ yield route; |
@@ -15,3 +15,3 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
@@ -21,23 +21,47 @@ | ||
/* eslint-disable consistent-return, no-bitwise */ Object.defineProperty( | ||
exports, | ||
'__esModule', | ||
{value: true} | ||
); | ||
exports.deserializeFrameWithLength = deserializeFrameWithLength; | ||
exports.deserializeFrames = deserializeFrames; | ||
exports.serializeFrameWithLength = serializeFrameWithLength; | ||
exports.deserializeFrame = deserializeFrame; | ||
exports.serializeFrame = serializeFrame; | ||
exports.sizeOfFrame = sizeOfFrame; | ||
/* eslint-disable consistent-return, no-bitwise */ | ||
var _Invariant = _interopRequireDefault(require('./Invariant')); | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
import type { | ||
CancelFrame, | ||
ErrorFrame, | ||
Frame, | ||
KeepAliveFrame, | ||
LeaseFrame, | ||
PayloadFrame, | ||
MetadataPushFrame, | ||
RequestChannelFrame, | ||
RequestFnfFrame, | ||
RequestNFrame, | ||
RequestResponseFrame, | ||
RequestStreamFrame, | ||
ResumeFrame, | ||
ResumeOkFrame, | ||
SetupFrame, | ||
} from 'rsocket-types'; | ||
import type {Encoders} from './RSocketEncoding'; | ||
var _RSocketEncoding = require('./RSocketEncoding'); | ||
var _RSocketBufferUtils = require('./RSocketBufferUtils'); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
import invariant from './Invariant'; | ||
import { | ||
getFrameTypeName, | ||
isMetadata, | ||
FLAGS, | ||
FLAGS_MASK, | ||
FRAME_TYPE_OFFFSET, | ||
FRAME_TYPES, | ||
MAX_CODE, | ||
MAX_KEEPALIVE, | ||
MAX_LIFETIME, | ||
MAX_RESUME_LENGTH, | ||
} from './RSocketFrame'; | ||
import {Utf8Encoders} from './RSocketEncoding'; | ||
import { | ||
createBuffer, | ||
readUInt24BE, | ||
readUInt64BE, | ||
writeUInt24BE, | ||
writeUInt64BE, | ||
} from './RSocketBufferUtils'; | ||
type FrameWithPayload = {data: any, flags: number, metadata: any}; | ||
/** | ||
@@ -58,7 +82,10 @@ * Frame header is: | ||
*/ | ||
function deserializeFrameWithLength(buffer, encoders) { | ||
const frameLength = (0, _RSocketBufferUtils.readUInt24BE)(buffer, 0); | ||
export function deserializeFrameWithLength( | ||
buffer: Buffer, | ||
encoders?: ?Encoders<*>, | ||
): Frame { | ||
const frameLength = readUInt24BE(buffer, 0); | ||
return deserializeFrame( | ||
buffer.slice(UINT24_SIZE, UINT24_SIZE + frameLength), | ||
encoders | ||
encoders, | ||
); | ||
@@ -72,7 +99,10 @@ } | ||
*/ | ||
function deserializeFrames(buffer, encoders) { | ||
export function deserializeFrames( | ||
buffer: Buffer, | ||
encoders?: ?Encoders<*>, | ||
): [Array<Frame>, Buffer] { | ||
const frames = []; | ||
let offset = 0; | ||
while (offset + UINT24_SIZE < buffer.length) { | ||
const frameLength = (0, _RSocketBufferUtils.readUInt24BE)(buffer, offset); | ||
const frameLength = readUInt24BE(buffer, offset); | ||
const frameStart = offset + UINT24_SIZE; | ||
@@ -95,8 +125,9 @@ const frameEnd = frameStart + frameLength; | ||
*/ | ||
function serializeFrameWithLength(frame, encoders) { | ||
export function serializeFrameWithLength( | ||
frame: Frame, | ||
encoders?: ?Encoders<*>, | ||
): Buffer { | ||
const buffer = serializeFrame(frame, encoders); | ||
const lengthPrefixed = (0, _RSocketBufferUtils.createBuffer)( | ||
buffer.length + UINT24_SIZE | ||
); | ||
(0, _RSocketBufferUtils.writeUInt24BE)(lengthPrefixed, buffer.length, 0); | ||
const lengthPrefixed = createBuffer(buffer.length + UINT24_SIZE); | ||
writeUInt24BE(lengthPrefixed, buffer.length, 0); | ||
buffer.copy(lengthPrefixed, UINT24_SIZE, 0, buffer.length); | ||
@@ -109,51 +140,53 @@ return lengthPrefixed; | ||
*/ | ||
function deserializeFrame(buffer, encoders) { | ||
encoders = encoders || _RSocketEncoding.Utf8Encoders; | ||
export function deserializeFrame( | ||
buffer: Buffer, | ||
encoders?: ?Encoders<*>, | ||
): Frame { | ||
encoders = encoders || Utf8Encoders; | ||
let offset = 0; | ||
const streamId = buffer.readInt32BE(offset); | ||
offset += 4; | ||
(0, _Invariant.default)( | ||
invariant( | ||
streamId >= 0, | ||
'RSocketBinaryFraming: Invalid frame, expected a positive stream id, got `%s.', | ||
streamId | ||
streamId, | ||
); | ||
const typeAndFlags = buffer.readUInt16BE(offset); | ||
offset += 2; | ||
const type = typeAndFlags >>> _RSocketFrame.FRAME_TYPE_OFFFSET; // keep highest 6 bits | ||
const flags = typeAndFlags & _RSocketFrame.FLAGS_MASK; // keep lowest 10 bits | ||
const type = typeAndFlags >>> FRAME_TYPE_OFFFSET; // keep highest 6 bits | ||
const flags = typeAndFlags & FLAGS_MASK; // keep lowest 10 bits | ||
switch (type) { | ||
case _RSocketFrame.FRAME_TYPES.SETUP: | ||
case FRAME_TYPES.SETUP: | ||
return deserializeSetupFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.PAYLOAD: | ||
case FRAME_TYPES.PAYLOAD: | ||
return deserializePayloadFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.ERROR: | ||
case FRAME_TYPES.ERROR: | ||
return deserializeErrorFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.KEEPALIVE: | ||
case FRAME_TYPES.KEEPALIVE: | ||
return deserializeKeepAliveFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_FNF: | ||
case FRAME_TYPES.REQUEST_FNF: | ||
return deserializeRequestFnfFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE: | ||
case FRAME_TYPES.REQUEST_RESPONSE: | ||
return deserializeRequestResponseFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_STREAM: | ||
case FRAME_TYPES.REQUEST_STREAM: | ||
return deserializeRequestStreamFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL: | ||
case FRAME_TYPES.REQUEST_CHANNEL: | ||
return deserializeRequestChannelFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.METADATA_PUSH: | ||
case FRAME_TYPES.METADATA_PUSH: | ||
return deserializeMetadataPushFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_N: | ||
case FRAME_TYPES.REQUEST_N: | ||
return deserializeRequestNFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.RESUME: | ||
case FRAME_TYPES.RESUME: | ||
return deserializeResumeFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.RESUME_OK: | ||
case FRAME_TYPES.RESUME_OK: | ||
return deserializeResumeOkFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.CANCEL: | ||
case FRAME_TYPES.CANCEL: | ||
return deserializeCancelFrame(buffer, streamId, flags, encoders); | ||
case _RSocketFrame.FRAME_TYPES.LEASE: | ||
case FRAME_TYPES.LEASE: | ||
return deserializeLeaseFrame(buffer, streamId, flags, encoders); | ||
default: | ||
(0, _Invariant.default)( | ||
invariant( | ||
false, | ||
'RSocketBinaryFraming: Unsupported frame type `%s`.', | ||
(0, _RSocketFrame.getFrameTypeName)(type) | ||
getFrameTypeName(type), | ||
); | ||
@@ -166,36 +199,36 @@ } | ||
*/ | ||
function serializeFrame(frame, encoders) { | ||
encoders = encoders || _RSocketEncoding.Utf8Encoders; | ||
export function serializeFrame(frame: Frame, encoders?: ?Encoders<*>): Buffer { | ||
encoders = encoders || Utf8Encoders; | ||
switch (frame.type) { | ||
case _RSocketFrame.FRAME_TYPES.SETUP: | ||
case FRAME_TYPES.SETUP: | ||
return serializeSetupFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.PAYLOAD: | ||
case FRAME_TYPES.PAYLOAD: | ||
return serializePayloadFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.ERROR: | ||
case FRAME_TYPES.ERROR: | ||
return serializeErrorFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.KEEPALIVE: | ||
case FRAME_TYPES.KEEPALIVE: | ||
return serializeKeepAliveFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_FNF: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE: | ||
case FRAME_TYPES.REQUEST_FNF: | ||
case FRAME_TYPES.REQUEST_RESPONSE: | ||
return serializeRequestFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_STREAM: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL: | ||
case FRAME_TYPES.REQUEST_STREAM: | ||
case FRAME_TYPES.REQUEST_CHANNEL: | ||
return serializeRequestManyFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.METADATA_PUSH: | ||
case FRAME_TYPES.METADATA_PUSH: | ||
return serializeMetadataPushFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_N: | ||
case FRAME_TYPES.REQUEST_N: | ||
return serializeRequestNFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.RESUME: | ||
case FRAME_TYPES.RESUME: | ||
return serializeResumeFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.RESUME_OK: | ||
case FRAME_TYPES.RESUME_OK: | ||
return serializeResumeOkFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.CANCEL: | ||
case FRAME_TYPES.CANCEL: | ||
return serializeCancelFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.LEASE: | ||
case FRAME_TYPES.LEASE: | ||
return serializeLeaseFrame(frame, encoders); | ||
default: | ||
(0, _Invariant.default)( | ||
invariant( | ||
false, | ||
'RSocketBinaryFraming: Unsupported frame type `%s`.', | ||
(0, _RSocketFrame.getFrameTypeName)(frame.type) | ||
getFrameTypeName(frame.type), | ||
); | ||
@@ -207,36 +240,36 @@ } | ||
*/ | ||
function sizeOfFrame(frame, encoders) { | ||
encoders = encoders || _RSocketEncoding.Utf8Encoders; | ||
export function sizeOfFrame(frame: Frame, encoders?: ?Encoders<*>): number { | ||
encoders = encoders || Utf8Encoders; | ||
switch (frame.type) { | ||
case _RSocketFrame.FRAME_TYPES.SETUP: | ||
case FRAME_TYPES.SETUP: | ||
return sizeOfSetupFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.PAYLOAD: | ||
case FRAME_TYPES.PAYLOAD: | ||
return sizeOfPayloadFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.ERROR: | ||
case FRAME_TYPES.ERROR: | ||
return sizeOfErrorFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.KEEPALIVE: | ||
case FRAME_TYPES.KEEPALIVE: | ||
return sizeOfKeepAliveFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_FNF: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE: | ||
case FRAME_TYPES.REQUEST_FNF: | ||
case FRAME_TYPES.REQUEST_RESPONSE: | ||
return sizeOfRequestFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_STREAM: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL: | ||
case FRAME_TYPES.REQUEST_STREAM: | ||
case FRAME_TYPES.REQUEST_CHANNEL: | ||
return sizeOfRequestManyFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.METADATA_PUSH: | ||
case FRAME_TYPES.METADATA_PUSH: | ||
return sizeOfMetadataPushFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_N: | ||
case FRAME_TYPES.REQUEST_N: | ||
return sizeOfRequestNFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.RESUME: | ||
case FRAME_TYPES.RESUME: | ||
return sizeOfResumeFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.RESUME_OK: | ||
case FRAME_TYPES.RESUME_OK: | ||
return sizeOfResumeOkFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.CANCEL: | ||
case FRAME_TYPES.CANCEL: | ||
return sizeOfCancelFrame(frame, encoders); | ||
case _RSocketFrame.FRAME_TYPES.LEASE: | ||
case FRAME_TYPES.LEASE: | ||
return sizeOfLeaseFrame(frame, encoders); | ||
default: | ||
(0, _Invariant.default)( | ||
invariant( | ||
false, | ||
'RSocketBinaryFraming: Unsupported frame type `%s`.', | ||
(0, _RSocketFrame.getFrameTypeName)(frame.type) | ||
getFrameTypeName(frame.type), | ||
); | ||
@@ -257,3 +290,3 @@ } | ||
const RESUME_TOKEN_LENGTH_SIZE = 2; | ||
function serializeSetupFrame(frame, encoders) { | ||
function serializeSetupFrame(frame: SetupFrame, encoders: Encoders<*>): Buffer { | ||
const resumeTokenLength = | ||
@@ -272,3 +305,3 @@ frame.resumeToken != null | ||
const payloadLength = getPayloadLength(frame, encoders); | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
const buffer = createBuffer( | ||
FRAME_HEADER_SIZE + | ||
@@ -279,5 +312,4 @@ SETUP_FIXED_SIZE + // | ||
dataMimeTypeLength + | ||
payloadLength | ||
payloadLength, | ||
); | ||
let offset = writeHeader(frame, buffer); | ||
@@ -289,3 +321,3 @@ offset = buffer.writeUInt16BE(frame.majorVersion, offset); | ||
if (frame.flags & _RSocketFrame.FLAGS.RESUME_ENABLE) { | ||
if (frame.flags & FLAGS.RESUME_ENABLE) { | ||
offset = buffer.writeUInt16BE(resumeTokenLength, offset); | ||
@@ -297,3 +329,3 @@ if (frame.resumeToken != null) { | ||
offset, | ||
offset + resumeTokenLength | ||
offset + resumeTokenLength, | ||
); | ||
@@ -309,3 +341,3 @@ } | ||
offset, | ||
offset + metadataMimeTypeLength | ||
offset + metadataMimeTypeLength, | ||
); | ||
@@ -320,3 +352,3 @@ } | ||
offset, | ||
offset + dataMimeTypeLength | ||
offset + dataMimeTypeLength, | ||
); | ||
@@ -329,3 +361,3 @@ } | ||
function sizeOfSetupFrame(frame, encoders) { | ||
function sizeOfSetupFrame(frame: SetupFrame, encoders: Encoders<*>): number { | ||
const resumeTokenLength = | ||
@@ -357,8 +389,12 @@ frame.resumeToken != null | ||
*/ | ||
function deserializeSetupFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeSetupFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): SetupFrame { | ||
invariant( | ||
streamId === 0, | ||
'RSocketBinaryFraming: Invalid SETUP frame, expected stream id to be 0.' | ||
'RSocketBinaryFraming: Invalid SETUP frame, expected stream id to be 0.', | ||
); | ||
const length = buffer.length; | ||
@@ -373,8 +409,8 @@ let offset = FRAME_HEADER_SIZE; | ||
offset += 4; | ||
(0, _Invariant.default)( | ||
keepAlive >= 0 && keepAlive <= _RSocketFrame.MAX_KEEPALIVE, | ||
invariant( | ||
keepAlive >= 0 && keepAlive <= MAX_KEEPALIVE, | ||
'RSocketBinaryFraming: Invalid SETUP frame, expected keepAlive to be ' + | ||
'>= 0 and <= %s. Got `%s`.', | ||
_RSocketFrame.MAX_KEEPALIVE, | ||
keepAlive | ||
MAX_KEEPALIVE, | ||
keepAlive, | ||
); | ||
@@ -384,29 +420,26 @@ | ||
offset += 4; | ||
(0, _Invariant.default)( | ||
lifetime >= 0 && lifetime <= _RSocketFrame.MAX_LIFETIME, | ||
invariant( | ||
lifetime >= 0 && lifetime <= MAX_LIFETIME, | ||
'RSocketBinaryFraming: Invalid SETUP frame, expected lifetime to be ' + | ||
'>= 0 and <= %s. Got `%s`.', | ||
_RSocketFrame.MAX_LIFETIME, | ||
lifetime | ||
MAX_LIFETIME, | ||
lifetime, | ||
); | ||
let resumeToken = null; | ||
if (flags & _RSocketFrame.FLAGS.RESUME_ENABLE) { | ||
if (flags & FLAGS.RESUME_ENABLE) { | ||
const resumeTokenLength = buffer.readInt16BE(offset); | ||
offset += 2; | ||
(0, _Invariant.default)( | ||
resumeTokenLength >= 0 && | ||
resumeTokenLength <= _RSocketFrame.MAX_RESUME_LENGTH, | ||
invariant( | ||
resumeTokenLength >= 0 && resumeTokenLength <= MAX_RESUME_LENGTH, | ||
'RSocketBinaryFraming: Invalid SETUP frame, expected resumeToken length ' + | ||
'to be >= 0 and <= %s. Got `%s`.', | ||
_RSocketFrame.MAX_RESUME_LENGTH, | ||
resumeTokenLength | ||
MAX_RESUME_LENGTH, | ||
resumeTokenLength, | ||
); | ||
resumeToken = encoders.resumeToken.decode( | ||
buffer, | ||
offset, | ||
offset + resumeTokenLength | ||
offset + resumeTokenLength, | ||
); | ||
offset += resumeTokenLength; | ||
@@ -420,5 +453,4 @@ } | ||
offset, | ||
offset + metadataMimeTypeLength | ||
offset + metadataMimeTypeLength, | ||
); | ||
offset += metadataMimeTypeLength; | ||
@@ -431,8 +463,7 @@ | ||
offset, | ||
offset + dataMimeTypeLength | ||
offset + dataMimeTypeLength, | ||
); | ||
offset += dataMimeTypeLength; | ||
const frame = { | ||
const frame: SetupFrame = { | ||
data: null, | ||
@@ -450,5 +481,4 @@ dataMimeType, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.SETUP, | ||
type: FRAME_TYPES.SETUP, | ||
}; | ||
readPayload(buffer, frame, encoders, offset); | ||
@@ -464,9 +494,8 @@ return frame; | ||
const ERROR_FIXED_SIZE = 4; | ||
function serializeErrorFrame(frame, encoders) { | ||
function serializeErrorFrame(frame: ErrorFrame, encoders: Encoders<*>): Buffer { | ||
const messageLength = | ||
frame.message != null ? encoders.message.byteLength(frame.message) : 0; | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + ERROR_FIXED_SIZE + messageLength | ||
const buffer = createBuffer( | ||
FRAME_HEADER_SIZE + ERROR_FIXED_SIZE + messageLength, | ||
); | ||
let offset = writeHeader(frame, buffer); | ||
@@ -479,3 +508,3 @@ offset = buffer.writeUInt32BE(frame.code, offset); | ||
offset, | ||
offset + messageLength | ||
offset + messageLength, | ||
); | ||
@@ -486,3 +515,3 @@ } | ||
function sizeOfErrorFrame(frame, encoders) { | ||
function sizeOfErrorFrame(frame: ErrorFrame, encoders: Encoders<*>): number { | ||
const messageLength = | ||
@@ -496,3 +525,8 @@ frame.message != null ? encoders.message.byteLength(frame.message) : 0; | ||
*/ | ||
function deserializeErrorFrame(buffer, streamId, flags, encoders) { | ||
function deserializeErrorFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): ErrorFrame { | ||
const length = buffer.length; | ||
@@ -502,9 +536,8 @@ let offset = FRAME_HEADER_SIZE; | ||
offset += 4; | ||
(0, _Invariant.default)( | ||
code >= 0 && code <= _RSocketFrame.MAX_CODE, | ||
invariant( | ||
code >= 0 && code <= MAX_CODE, | ||
'RSocketBinaryFraming: Invalid ERROR frame, expected code to be >= 0 and <= %s. Got `%s`.', | ||
_RSocketFrame.MAX_CODE, | ||
code | ||
MAX_CODE, | ||
code, | ||
); | ||
const messageLength = buffer.length - offset; | ||
@@ -523,3 +556,3 @@ let message = ''; | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.ERROR, | ||
type: FRAME_TYPES.ERROR, | ||
}; | ||
@@ -534,15 +567,13 @@ } | ||
const KEEPALIVE_FIXED_SIZE = 8; | ||
function serializeKeepAliveFrame(frame, encoders) { | ||
function serializeKeepAliveFrame( | ||
frame: KeepAliveFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const dataLength = | ||
frame.data != null ? encoders.data.byteLength(frame.data) : 0; | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + KEEPALIVE_FIXED_SIZE + dataLength | ||
const buffer = createBuffer( | ||
FRAME_HEADER_SIZE + KEEPALIVE_FIXED_SIZE + dataLength, | ||
); | ||
let offset = writeHeader(frame, buffer); | ||
offset = (0, _RSocketBufferUtils.writeUInt64BE)( | ||
buffer, | ||
frame.lastReceivedPosition, | ||
offset | ||
); | ||
offset = writeUInt64BE(buffer, frame.lastReceivedPosition, offset); | ||
if (frame.data != null) { | ||
@@ -554,3 +585,6 @@ encoders.data.encode(frame.data, buffer, offset, offset + dataLength); | ||
function sizeOfKeepAliveFrame(frame, encoders) { | ||
function sizeOfKeepAliveFrame( | ||
frame: KeepAliveFrame, | ||
encoders: Encoders<*>, | ||
): number { | ||
const dataLength = | ||
@@ -564,14 +598,15 @@ frame.data != null ? encoders.data.byteLength(frame.data) : 0; | ||
*/ | ||
function deserializeKeepAliveFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeKeepAliveFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): KeepAliveFrame { | ||
invariant( | ||
streamId === 0, | ||
'RSocketBinaryFraming: Invalid KEEPALIVE frame, expected stream id to be 0.' | ||
'RSocketBinaryFraming: Invalid KEEPALIVE frame, expected stream id to be 0.', | ||
); | ||
const length = buffer.length; | ||
let offset = FRAME_HEADER_SIZE; | ||
const lastReceivedPosition = (0, _RSocketBufferUtils.readUInt64BE)( | ||
buffer, | ||
offset | ||
); | ||
const lastReceivedPosition = readUInt64BE(buffer, offset); | ||
offset += 8; | ||
@@ -589,3 +624,3 @@ let data = null; | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.KEEPALIVE, | ||
type: FRAME_TYPES.KEEPALIVE, | ||
}; | ||
@@ -600,9 +635,8 @@ } | ||
const LEASE_FIXED_SIZE = 8; | ||
function serializeLeaseFrame(frame, encoders) { | ||
function serializeLeaseFrame(frame: LeaseFrame, encoders: Encoders<*>): Buffer { | ||
const metaLength = | ||
frame.metadata != null ? encoders.metadata.byteLength(frame.metadata) : 0; | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + LEASE_FIXED_SIZE + metaLength | ||
const buffer = createBuffer( | ||
FRAME_HEADER_SIZE + LEASE_FIXED_SIZE + metaLength, | ||
); | ||
let offset = writeHeader(frame, buffer); | ||
@@ -616,3 +650,3 @@ offset = buffer.writeUInt32BE(frame.ttl, offset); | ||
offset, | ||
offset + metaLength | ||
offset + metaLength, | ||
); | ||
@@ -623,3 +657,3 @@ } | ||
function sizeOfLeaseFrame(frame, encoders) { | ||
function sizeOfLeaseFrame(frame: LeaseFrame, encoders: Encoders<*>): number { | ||
const metaLength = | ||
@@ -633,8 +667,12 @@ frame.metadata != null ? encoders.metadata.byteLength(frame.metadata) : 0; | ||
*/ | ||
function deserializeLeaseFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeLeaseFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): LeaseFrame { | ||
invariant( | ||
streamId === 0, | ||
'RSocketBinaryFraming: Invalid LEASE frame, expected stream id to be 0.' | ||
'RSocketBinaryFraming: Invalid LEASE frame, expected stream id to be 0.', | ||
); | ||
const length = buffer.length; | ||
@@ -657,3 +695,3 @@ let offset = FRAME_HEADER_SIZE; | ||
ttl, | ||
type: _RSocketFrame.FRAME_TYPES.LEASE, | ||
type: FRAME_TYPES.LEASE, | ||
}; | ||
@@ -668,7 +706,8 @@ } | ||
*/ | ||
function serializeRequestFrame(frame, encoders) { | ||
function serializeRequestFrame( | ||
frame: RequestFnfFrame | RequestResponseFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const payloadLength = getPayloadLength(frame, encoders); | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + payloadLength | ||
); | ||
const buffer = createBuffer(FRAME_HEADER_SIZE + payloadLength); | ||
const offset = writeHeader(frame, buffer); | ||
@@ -679,3 +718,6 @@ writePayload(frame, buffer, encoders, offset); | ||
function sizeOfRequestFrame(frame, encoders) { | ||
function sizeOfRequestFrame( | ||
frame: RequestFnfFrame | RequestResponseFrame, | ||
encoders: Encoders<*>, | ||
): number { | ||
const payloadLength = getPayloadLength(frame, encoders); | ||
@@ -689,9 +731,11 @@ return FRAME_HEADER_SIZE + payloadLength; | ||
*/ | ||
function serializeMetadataPushFrame(frame, encoders) { | ||
function serializeMetadataPushFrame( | ||
frame: MetadataPushFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const metadata = frame.metadata; | ||
if (metadata != null) { | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + encoders.metadata.byteLength(metadata) | ||
const buffer = createBuffer( | ||
FRAME_HEADER_SIZE + encoders.metadata.byteLength(metadata), | ||
); | ||
const offset = writeHeader(frame, buffer); | ||
@@ -701,3 +745,3 @@ encoders.metadata.encode(metadata, buffer, offset, buffer.length); | ||
} else { | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)(FRAME_HEADER_SIZE); | ||
const buffer = createBuffer(FRAME_HEADER_SIZE); | ||
writeHeader(frame, buffer); | ||
@@ -708,3 +752,6 @@ return buffer; | ||
function sizeOfMetadataPushFrame(frame, encoders) { | ||
function sizeOfMetadataPushFrame( | ||
frame: MetadataPushFrame, | ||
encoders: Encoders<*>, | ||
): number { | ||
return ( | ||
@@ -716,10 +763,14 @@ FRAME_HEADER_SIZE + | ||
function deserializeRequestFnfFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeRequestFnfFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): RequestFnfFrame { | ||
invariant( | ||
streamId > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_FNF frame, expected stream id to be > 0.' | ||
'RSocketBinaryFraming: Invalid REQUEST_FNF frame, expected stream id to be > 0.', | ||
); | ||
const length = buffer.length; | ||
const frame = { | ||
const frame: RequestFnfFrame = { | ||
data: null, | ||
@@ -730,5 +781,4 @@ flags, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_FNF, | ||
type: FRAME_TYPES.REQUEST_FNF, | ||
}; | ||
readPayload(buffer, frame, encoders, FRAME_HEADER_SIZE); | ||
@@ -738,10 +788,14 @@ return frame; | ||
function deserializeRequestResponseFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeRequestResponseFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): RequestResponseFrame { | ||
invariant( | ||
streamId > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_RESPONSE frame, expected stream id to be > 0.' | ||
'RSocketBinaryFraming: Invalid REQUEST_RESPONSE frame, expected stream id to be > 0.', | ||
); | ||
const length = buffer.length; | ||
const frame = { | ||
const frame: RequestResponseFrame = { | ||
data: null, | ||
@@ -752,5 +806,4 @@ flags, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE, | ||
type: FRAME_TYPES.REQUEST_RESPONSE, | ||
}; | ||
readPayload(buffer, frame, encoders, FRAME_HEADER_SIZE); | ||
@@ -760,8 +813,12 @@ return frame; | ||
function deserializeMetadataPushFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeMetadataPushFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): MetadataPushFrame { | ||
invariant( | ||
streamId === 0, | ||
'RSocketBinaryFraming: Invalid METADATA_PUSH frame, expected stream id to be 0.' | ||
'RSocketBinaryFraming: Invalid METADATA_PUSH frame, expected stream id to be 0.', | ||
); | ||
const length = buffer.length; | ||
@@ -776,3 +833,3 @@ return { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.METADATA_PUSH, | ||
type: FRAME_TYPES.METADATA_PUSH, | ||
}; | ||
@@ -790,8 +847,10 @@ } | ||
const REQUEST_MANY_HEADER = 4; | ||
function serializeRequestManyFrame(frame, encoders) { | ||
function serializeRequestManyFrame( | ||
frame: RequestStreamFrame | RequestChannelFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const payloadLength = getPayloadLength(frame, encoders); | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + REQUEST_MANY_HEADER + payloadLength | ||
const buffer = createBuffer( | ||
FRAME_HEADER_SIZE + REQUEST_MANY_HEADER + payloadLength, | ||
); | ||
let offset = writeHeader(frame, buffer); | ||
@@ -803,3 +862,6 @@ offset = buffer.writeUInt32BE(frame.requestN, offset); | ||
function sizeOfRequestManyFrame(frame, encoders) { | ||
function sizeOfRequestManyFrame( | ||
frame: RequestStreamFrame | RequestChannelFrame, | ||
encoders: Encoders<*>, | ||
): number { | ||
const payloadLength = getPayloadLength(frame, encoders); | ||
@@ -809,8 +871,12 @@ return FRAME_HEADER_SIZE + REQUEST_MANY_HEADER + payloadLength; | ||
function deserializeRequestStreamFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeRequestStreamFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): RequestStreamFrame { | ||
invariant( | ||
streamId > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_STREAM frame, expected stream id to be > 0.' | ||
'RSocketBinaryFraming: Invalid REQUEST_STREAM frame, expected stream id to be > 0.', | ||
); | ||
const length = buffer.length; | ||
@@ -820,9 +886,8 @@ let offset = FRAME_HEADER_SIZE; | ||
offset += 4; | ||
(0, _Invariant.default)( | ||
invariant( | ||
requestN > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_STREAM frame, expected requestN to be > 0, got `%s`.', | ||
requestN | ||
requestN, | ||
); | ||
const frame = { | ||
const frame: RequestStreamFrame = { | ||
data: null, | ||
@@ -834,5 +899,4 @@ flags, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_STREAM, | ||
type: FRAME_TYPES.REQUEST_STREAM, | ||
}; | ||
readPayload(buffer, frame, encoders, offset); | ||
@@ -842,8 +906,12 @@ return frame; | ||
function deserializeRequestChannelFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeRequestChannelFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): RequestChannelFrame { | ||
invariant( | ||
streamId > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_CHANNEL frame, expected stream id to be > 0.' | ||
'RSocketBinaryFraming: Invalid REQUEST_CHANNEL frame, expected stream id to be > 0.', | ||
); | ||
const length = buffer.length; | ||
@@ -853,9 +921,8 @@ let offset = FRAME_HEADER_SIZE; | ||
offset += 4; | ||
(0, _Invariant.default)( | ||
invariant( | ||
requestN > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_STREAM frame, expected requestN to be > 0, got `%s`.', | ||
requestN | ||
requestN, | ||
); | ||
const frame = { | ||
const frame: RequestChannelFrame = { | ||
data: null, | ||
@@ -867,5 +934,4 @@ flags, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL, | ||
type: FRAME_TYPES.REQUEST_CHANNEL, | ||
}; | ||
readPayload(buffer, frame, encoders, offset); | ||
@@ -881,6 +947,7 @@ return frame; | ||
const REQUEST_N_HEADER = 4; | ||
function serializeRequestNFrame(frame, encoders) { | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + REQUEST_N_HEADER | ||
); | ||
function serializeRequestNFrame( | ||
frame: RequestNFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const buffer = createBuffer(FRAME_HEADER_SIZE + REQUEST_N_HEADER); | ||
const offset = writeHeader(frame, buffer); | ||
@@ -891,20 +958,26 @@ buffer.writeUInt32BE(frame.requestN, offset); | ||
function sizeOfRequestNFrame(frame, encoders) { | ||
function sizeOfRequestNFrame( | ||
frame: RequestNFrame, | ||
encoders: Encoders<*>, | ||
): number { | ||
return FRAME_HEADER_SIZE + REQUEST_N_HEADER; | ||
} | ||
function deserializeRequestNFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeRequestNFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): RequestNFrame { | ||
invariant( | ||
streamId > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_N frame, expected stream id to be > 0.' | ||
'RSocketBinaryFraming: Invalid REQUEST_N frame, expected stream id to be > 0.', | ||
); | ||
const length = buffer.length; | ||
const requestN = buffer.readInt32BE(FRAME_HEADER_SIZE); | ||
(0, _Invariant.default)( | ||
invariant( | ||
requestN > 0, | ||
'RSocketBinaryFraming: Invalid REQUEST_STREAM frame, expected requestN to be > 0, got `%s`.', | ||
requestN | ||
requestN, | ||
); | ||
return { | ||
@@ -915,3 +988,3 @@ flags, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_N, | ||
type: FRAME_TYPES.REQUEST_N, | ||
}; | ||
@@ -923,4 +996,7 @@ } | ||
*/ | ||
function serializeCancelFrame(frame, encoders) { | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)(FRAME_HEADER_SIZE); | ||
function serializeCancelFrame( | ||
frame: CancelFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const buffer = createBuffer(FRAME_HEADER_SIZE); | ||
writeHeader(frame, buffer); | ||
@@ -930,12 +1006,16 @@ return buffer; | ||
function sizeOfCancelFrame(frame, encoders) { | ||
function sizeOfCancelFrame(frame: CancelFrame, encoders: Encoders<*>): number { | ||
return FRAME_HEADER_SIZE; | ||
} | ||
function deserializeCancelFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeCancelFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): CancelFrame { | ||
invariant( | ||
streamId > 0, | ||
'RSocketBinaryFraming: Invalid CANCEL frame, expected stream id to be > 0.' | ||
'RSocketBinaryFraming: Invalid CANCEL frame, expected stream id to be > 0.', | ||
); | ||
const length = buffer.length; | ||
@@ -946,3 +1026,3 @@ return { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.CANCEL, | ||
type: FRAME_TYPES.CANCEL, | ||
}; | ||
@@ -954,7 +1034,8 @@ } | ||
*/ | ||
function serializePayloadFrame(frame, encoders) { | ||
function serializePayloadFrame( | ||
frame: PayloadFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const payloadLength = getPayloadLength(frame, encoders); | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + payloadLength | ||
); | ||
const buffer = createBuffer(FRAME_HEADER_SIZE + payloadLength); | ||
const offset = writeHeader(frame, buffer); | ||
@@ -965,3 +1046,6 @@ writePayload(frame, buffer, encoders, offset); | ||
function sizeOfPayloadFrame(frame, encoders) { | ||
function sizeOfPayloadFrame( | ||
frame: PayloadFrame, | ||
encoders: Encoders<*>, | ||
): number { | ||
const payloadLength = getPayloadLength(frame, encoders); | ||
@@ -971,10 +1055,14 @@ return FRAME_HEADER_SIZE + payloadLength; | ||
function deserializePayloadFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializePayloadFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): PayloadFrame { | ||
invariant( | ||
streamId > 0, | ||
'RSocketBinaryFraming: Invalid PAYLOAD frame, expected stream id to be > 0.' | ||
'RSocketBinaryFraming: Invalid PAYLOAD frame, expected stream id to be > 0.', | ||
); | ||
const length = buffer.length; | ||
const frame = { | ||
const frame: PayloadFrame = { | ||
data: null, | ||
@@ -985,5 +1073,4 @@ flags, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.PAYLOAD, | ||
type: FRAME_TYPES.PAYLOAD, | ||
}; | ||
readPayload(buffer, frame, encoders, FRAME_HEADER_SIZE); | ||
@@ -1004,8 +1091,10 @@ return frame; | ||
const RESUME_FIXED_SIZE = 22; | ||
function serializeResumeFrame(frame, encoders) { | ||
function serializeResumeFrame( | ||
frame: ResumeFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const resumeTokenLength = encoders.resumeToken.byteLength(frame.resumeToken); | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + RESUME_FIXED_SIZE + resumeTokenLength | ||
const buffer = createBuffer( | ||
FRAME_HEADER_SIZE + RESUME_FIXED_SIZE + resumeTokenLength, | ||
); | ||
let offset = writeHeader(frame, buffer); | ||
@@ -1019,15 +1108,10 @@ offset = buffer.writeUInt16BE(frame.majorVersion, offset); | ||
offset, | ||
offset + resumeTokenLength | ||
offset + resumeTokenLength, | ||
); | ||
offset = (0, _RSocketBufferUtils.writeUInt64BE)( | ||
buffer, | ||
frame.serverPosition, | ||
offset | ||
); | ||
(0, _RSocketBufferUtils.writeUInt64BE)(buffer, frame.clientPosition, offset); | ||
offset = writeUInt64BE(buffer, frame.serverPosition, offset); | ||
writeUInt64BE(buffer, frame.clientPosition, offset); | ||
return buffer; | ||
} | ||
function sizeOfResumeFrame(frame, encoders) { | ||
function sizeOfResumeFrame(frame: ResumeFrame, encoders: Encoders<*>): number { | ||
const resumeTokenLength = encoders.resumeToken.byteLength(frame.resumeToken); | ||
@@ -1037,8 +1121,12 @@ return FRAME_HEADER_SIZE + RESUME_FIXED_SIZE + resumeTokenLength; | ||
function deserializeResumeFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeResumeFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): ResumeFrame { | ||
invariant( | ||
streamId === 0, | ||
'RSocketBinaryFraming: Invalid RESUME frame, expected stream id to be 0.' | ||
'RSocketBinaryFraming: Invalid RESUME frame, expected stream id to be 0.', | ||
); | ||
const length = buffer.length; | ||
@@ -1053,21 +1141,18 @@ let offset = FRAME_HEADER_SIZE; | ||
offset += 2; | ||
(0, _Invariant.default)( | ||
resumeTokenLength >= 0 && | ||
resumeTokenLength <= _RSocketFrame.MAX_RESUME_LENGTH, | ||
invariant( | ||
resumeTokenLength >= 0 && resumeTokenLength <= MAX_RESUME_LENGTH, | ||
'RSocketBinaryFraming: Invalid SETUP frame, expected resumeToken length ' + | ||
'to be >= 0 and <= %s. Got `%s`.', | ||
_RSocketFrame.MAX_RESUME_LENGTH, | ||
resumeTokenLength | ||
MAX_RESUME_LENGTH, | ||
resumeTokenLength, | ||
); | ||
const resumeToken = encoders.resumeToken.decode( | ||
buffer, | ||
offset, | ||
offset + resumeTokenLength | ||
offset + resumeTokenLength, | ||
); | ||
offset += resumeTokenLength; | ||
const serverPosition = (0, _RSocketBufferUtils.readUInt64BE)(buffer, offset); | ||
const serverPosition = readUInt64BE(buffer, offset); | ||
offset += 8; | ||
const clientPosition = (0, _RSocketBufferUtils.readUInt64BE)(buffer, offset); | ||
const clientPosition = readUInt64BE(buffer, offset); | ||
offset += 8; | ||
@@ -1083,3 +1168,3 @@ return { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.RESUME, | ||
type: FRAME_TYPES.RESUME, | ||
}; | ||
@@ -1095,26 +1180,31 @@ } | ||
const RESUME_OK_FIXED_SIZE = 8; | ||
function serializeResumeOkFrame(frame, encoders) { | ||
const buffer = (0, _RSocketBufferUtils.createBuffer)( | ||
FRAME_HEADER_SIZE + RESUME_OK_FIXED_SIZE | ||
); | ||
function serializeResumeOkFrame( | ||
frame: ResumeOkFrame, | ||
encoders: Encoders<*>, | ||
): Buffer { | ||
const buffer = createBuffer(FRAME_HEADER_SIZE + RESUME_OK_FIXED_SIZE); | ||
const offset = writeHeader(frame, buffer); | ||
(0, _RSocketBufferUtils.writeUInt64BE)(buffer, frame.clientPosition, offset); | ||
writeUInt64BE(buffer, frame.clientPosition, offset); | ||
return buffer; | ||
} | ||
function sizeOfResumeOkFrame(frame, encoders) { | ||
function sizeOfResumeOkFrame( | ||
frame: ResumeOkFrame, | ||
encoders: Encoders<*>, | ||
): number { | ||
return FRAME_HEADER_SIZE + RESUME_OK_FIXED_SIZE; | ||
} | ||
function deserializeResumeOkFrame(buffer, streamId, flags, encoders) { | ||
(0, _Invariant.default)( | ||
function deserializeResumeOkFrame( | ||
buffer: Buffer, | ||
streamId: number, | ||
flags: number, | ||
encoders: Encoders<*>, | ||
): ResumeOkFrame { | ||
invariant( | ||
streamId === 0, | ||
'RSocketBinaryFraming: Invalid RESUME frame, expected stream id to be 0.' | ||
'RSocketBinaryFraming: Invalid RESUME frame, expected stream id to be 0.', | ||
); | ||
const length = buffer.length; | ||
const clientPosition = (0, _RSocketBufferUtils.readUInt64BE)( | ||
buffer, | ||
FRAME_HEADER_SIZE | ||
); | ||
const clientPosition = readUInt64BE(buffer, FRAME_HEADER_SIZE); | ||
return { | ||
@@ -1125,3 +1215,3 @@ clientPosition, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.RESUME_OK, | ||
type: FRAME_TYPES.RESUME_OK, | ||
}; | ||
@@ -1133,9 +1223,8 @@ } | ||
*/ | ||
function writeHeader(frame, buffer) { | ||
function writeHeader(frame: Frame, buffer: Buffer): number { | ||
const offset = buffer.writeInt32BE(frame.streamId, 0); | ||
// shift frame to high 6 bits, extract lowest 10 bits from flags | ||
return buffer.writeUInt16BE( | ||
(frame.type << _RSocketFrame.FRAME_TYPE_OFFFSET) | | ||
(frame.flags & _RSocketFrame.FLAGS_MASK), | ||
offset | ||
(frame.type << FRAME_TYPE_OFFFSET) | (frame.flags & FLAGS_MASK), | ||
offset, | ||
); | ||
@@ -1148,3 +1237,6 @@ } | ||
*/ | ||
function getPayloadLength(frame, encoders) { | ||
function getPayloadLength( | ||
frame: FrameWithPayload, | ||
encoders: Encoders<*>, | ||
): number { | ||
let payloadLength = 0; | ||
@@ -1154,3 +1246,3 @@ if (frame.data != null) { | ||
} | ||
if ((0, _RSocketFrame.isMetadata)(frame.flags)) { | ||
if (isMetadata(frame.flags)) { | ||
payloadLength += UINT24_SIZE; | ||
@@ -1168,11 +1260,12 @@ if (frame.metadata != null) { | ||
*/ | ||
function writePayload(frame, buffer, encoders, offset) { | ||
if ((0, _RSocketFrame.isMetadata)(frame.flags)) { | ||
function writePayload( | ||
frame: FrameWithPayload, | ||
buffer: Buffer, | ||
encoders: Encoders<*>, | ||
offset: number, | ||
): void { | ||
if (isMetadata(frame.flags)) { | ||
if (frame.metadata != null) { | ||
const metaLength = encoders.metadata.byteLength(frame.metadata); | ||
offset = (0, _RSocketBufferUtils.writeUInt24BE)( | ||
buffer, | ||
metaLength, | ||
offset | ||
); | ||
offset = writeUInt24BE(buffer, metaLength, offset); | ||
offset = encoders.metadata.encode( | ||
@@ -1182,6 +1275,6 @@ frame.metadata, | ||
offset, | ||
offset + metaLength | ||
offset + metaLength, | ||
); | ||
} else { | ||
offset = (0, _RSocketBufferUtils.writeUInt24BE)(buffer, 0, offset); | ||
offset = writeUInt24BE(buffer, 0, offset); | ||
} | ||
@@ -1198,5 +1291,10 @@ } | ||
*/ | ||
function readPayload(buffer, frame, encoders, offset) { | ||
if ((0, _RSocketFrame.isMetadata)(frame.flags)) { | ||
const metaLength = (0, _RSocketBufferUtils.readUInt24BE)(buffer, offset); | ||
function readPayload( | ||
buffer: Buffer, | ||
frame: FrameWithPayload, | ||
encoders: Encoders<*>, | ||
offset: number, | ||
): void { | ||
if (isMetadata(frame.flags)) { | ||
const metaLength = readUInt24BE(buffer, offset); | ||
offset += UINT24_SIZE; | ||
@@ -1207,5 +1305,4 @@ if (metaLength > 0) { | ||
offset, | ||
offset + metaLength | ||
offset + metaLength, | ||
); | ||
offset += metaLength; | ||
@@ -1212,0 +1309,0 @@ } |
@@ -15,3 +15,3 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
@@ -21,14 +21,8 @@ | ||
/* eslint-disable no-bitwise */ Object.defineProperty(exports, '__esModule', { | ||
value: true, | ||
}); | ||
exports.readUInt24BE = readUInt24BE; | ||
exports.writeUInt24BE = writeUInt24BE; | ||
exports.readUInt64BE = readUInt64BE; | ||
exports.writeUInt64BE = writeUInt64BE; | ||
exports.byteLength = byteLength; | ||
exports.createBuffer = exports.toBuffer = void 0; | ||
/* eslint-disable no-bitwise */ | ||
var _LiteBuffer = require('./LiteBuffer'); | ||
import {LiteBuffer as Buffer} from './LiteBuffer'; | ||
export type Encoding = 'ascii' | 'base64' | 'hex' | 'utf8'; | ||
/** | ||
@@ -42,3 +36,3 @@ * Mimimum value that would overflow bitwise operators (2^32). | ||
*/ | ||
function readUInt24BE(buffer, offset) { | ||
export function readUInt24BE(buffer: Buffer, offset: number): number { | ||
const val1 = buffer.readUInt8(offset) << 16; | ||
@@ -54,3 +48,7 @@ const val2 = buffer.readUInt8(offset + 1) << 8; | ||
*/ | ||
function writeUInt24BE(buffer, value, offset) { | ||
export function writeUInt24BE( | ||
buffer: Buffer, | ||
value: number, | ||
offset: number, | ||
): number { | ||
offset = buffer.writeUInt8(value >>> 16, offset); // 3rd byte | ||
@@ -65,3 +63,3 @@ offset = buffer.writeUInt8((value >>> 8) & 0xff, offset); // 2nd byte | ||
*/ | ||
function readUInt64BE(buffer, offset) { | ||
export function readUInt64BE(buffer: Buffer, offset: number): number { | ||
const high = buffer.readUInt32BE(offset); | ||
@@ -76,3 +74,7 @@ const low = buffer.readUInt32BE(offset + 4); | ||
*/ | ||
function writeUInt64BE(buffer, value, offset) { | ||
export function writeUInt64BE( | ||
buffer: Buffer, | ||
value: number, | ||
offset: number, | ||
): number { | ||
const high = (value / BITWISE_OVERFLOW) | 0; | ||
@@ -88,7 +90,7 @@ const low = value % BITWISE_OVERFLOW; | ||
*/ | ||
function byteLength(data, encoding) { | ||
export function byteLength(data: any, encoding: Encoding): number { | ||
if (data == null) { | ||
return 0; | ||
} | ||
return _LiteBuffer.LiteBuffer.byteLength(data, encoding); | ||
return Buffer.byteLength(data, encoding); | ||
} | ||
@@ -99,20 +101,17 @@ | ||
*/ | ||
const toBuffer = | ||
typeof _LiteBuffer.LiteBuffer.from === 'function' | ||
? (...args) => { | ||
export const toBuffer: (...args: any[]) => Buffer = | ||
typeof Buffer.from === 'function' | ||
? (...args: any[]) => { | ||
// Buffer.from(buffer) copies which we don't want here | ||
if (args[0] instanceof _LiteBuffer.LiteBuffer) { | ||
if (args[0] instanceof Buffer) { | ||
return args[0]; | ||
} | ||
return _LiteBuffer.LiteBuffer.from.apply(_LiteBuffer.LiteBuffer, args); | ||
return Buffer.from.apply(Buffer, args); | ||
} | ||
: (...args) => { | ||
: (...args: any[]) => { | ||
// Buffer.from(buffer) copies which we don't want here | ||
if (args[0] instanceof _LiteBuffer.LiteBuffer) { | ||
if (args[0] instanceof Buffer) { | ||
return args[0]; | ||
} | ||
return new (_LiteBuffer.LiteBuffer.bind.apply(_LiteBuffer.LiteBuffer, [ | ||
_LiteBuffer.LiteBuffer, | ||
...args, | ||
]))(); | ||
return new (Buffer.bind.apply(Buffer, [Buffer, ...args]))(); | ||
}; | ||
@@ -122,8 +121,7 @@ | ||
* Function to create a buffer of a given sized filled with zeros. | ||
*/ exports.toBuffer = toBuffer; | ||
const createBuffer = | ||
typeof _LiteBuffer.LiteBuffer.alloc === 'function' | ||
? (length) => _LiteBuffer.LiteBuffer.alloc(length) | ||
*/ | ||
export const createBuffer: (...args: any[]) => Buffer = | ||
typeof Buffer.alloc === 'function' | ||
? (length: number) => Buffer.alloc(length) | ||
: // $FlowFixMe | ||
(length) => new _LiteBuffer.LiteBuffer(length).fill(0); | ||
exports.createBuffer = createBuffer; | ||
(length: number) => new Buffer(length).fill(0); |
@@ -15,22 +15,42 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.default = void 0; | ||
var _rsocketFlowable = require('rsocket-flowable'); | ||
var _Invariant = _interopRequireDefault(require('./Invariant')); | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
var _RSocketVersion = require('./RSocketVersion'); | ||
var _RSocketMachine = require('./RSocketMachine'); | ||
var _RSocketLease = require('./RSocketLease'); | ||
import type { | ||
ConnectionStatus, | ||
DuplexConnection, | ||
Payload, | ||
ReactiveSocket, | ||
SetupFrame, | ||
Responder, | ||
} from 'rsocket-types'; | ||
import type {PayloadSerializers} from './RSocketSerialization'; | ||
var _RSocketSerialization = require('./RSocketSerialization'); | ||
var _ReassemblyDuplexConnection = require('./ReassemblyDuplexConnection'); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
import {Flowable, Single, every} from 'rsocket-flowable'; | ||
import invariant from './Invariant'; | ||
import {CONNECTION_STREAM_ID, FLAGS, FRAME_TYPES} from './RSocketFrame'; | ||
import {MAJOR_VERSION, MINOR_VERSION} from './RSocketVersion'; | ||
import {createClientMachine} from './RSocketMachine'; | ||
import {Lease, Leases} from './RSocketLease'; | ||
import {RequesterLeaseHandler, ResponderLeaseHandler} from './RSocketLease'; | ||
import {IdentitySerializers} from './RSocketSerialization'; | ||
import {ReassemblyDuplexConnection} from './ReassemblyDuplexConnection'; | ||
export type ClientConfig<D, M> = {| | ||
serializers?: PayloadSerializers<D, M>, | ||
setup: {| | ||
payload?: Payload<D, M>, | ||
dataMimeType: string, | ||
keepAlive: number, | ||
lifetime: number, | ||
metadataMimeType: string, | ||
|}, | ||
transport: DuplexConnection, | ||
responder?: Responder<D, M>, | ||
errorHandler?: (Error) => void, | ||
leases?: () => Leases<*>, | ||
|}; | ||
/** | ||
@@ -46,4 +66,9 @@ * RSocketClient: A client in an RSocket connection that will communicates with | ||
*/ | ||
class RSocketClient { | ||
constructor(config) { | ||
export default class RSocketClient<D, M> { | ||
_cancel: ?() => void; | ||
_config: ClientConfig<D, M>; | ||
_connection: ?Single<ReactiveSocket<D, M>>; | ||
_socket: ?RSocketClientSocket<D, M>; | ||
constructor(config: ClientConfig<D, M>) { | ||
this._checkConfig(config); | ||
@@ -56,17 +81,16 @@ this._cancel = null; | ||
close() { | ||
close(): void { | ||
this._config.transport.close(); | ||
} | ||
connect() { | ||
(0, _Invariant.default)( | ||
connect(): Single<ReactiveSocket<D, M>> { | ||
invariant( | ||
!this._connection, | ||
'RSocketClient: Unexpected call to connect(), already connected.' | ||
'RSocketClient: Unexpected call to connect(), already connected.', | ||
); | ||
this._connection = new _rsocketFlowable.Single((subscriber) => { | ||
this._connection = new Single(subscriber => { | ||
const transport = this._config.transport; | ||
let subscription; | ||
transport.connectionStatus().subscribe({ | ||
onNext: (status) => { | ||
onNext: status => { | ||
if (status.kind === 'CONNECTED') { | ||
@@ -77,6 +101,4 @@ subscription && subscription.cancel(); | ||
this._config, | ||
new _ReassemblyDuplexConnection.ReassemblyDuplexConnection( | ||
transport | ||
) | ||
) | ||
new ReassemblyDuplexConnection(transport), | ||
), | ||
); | ||
@@ -91,3 +113,3 @@ } else if (status.kind === 'ERROR') { | ||
}, | ||
onSubscribe: (_subscription) => { | ||
onSubscribe: _subscription => { | ||
subscription = _subscription; | ||
@@ -101,3 +123,2 @@ subscriber.onSubscribe(() => { | ||
}); | ||
transport.connect(); | ||
@@ -108,3 +129,3 @@ }); | ||
_checkConfig(config) { | ||
_checkConfig(config: ClientConfig<D, M>) { | ||
const setup = config.setup; | ||
@@ -125,3 +146,3 @@ const keepAlive = setup && setup.keepAlive; | ||
console.warn( | ||
'rsocket-js: Due to a browser bug, Internet Explorer and Edge users may experience WebSocket instability with keepAlive values longer than 30 seconds.' | ||
'rsocket-js: Due to a browser bug, Internet Explorer and Edge users may experience WebSocket instability with keepAlive values longer than 30 seconds.', | ||
); | ||
@@ -137,24 +158,24 @@ } | ||
* @private | ||
*/ exports.default = RSocketClient; | ||
class RSocketClientSocket { | ||
constructor(config, connection) { | ||
let requesterLeaseHandler; | ||
let responderLeaseHandler; | ||
*/ | ||
class RSocketClientSocket<D, M> implements ReactiveSocket<D, M> { | ||
_machine: ReactiveSocket<D, M>; | ||
constructor(config: ClientConfig<D, M>, connection: DuplexConnection) { | ||
let requesterLeaseHandler: ?RequesterLeaseHandler; | ||
let responderLeaseHandler: ?ResponderLeaseHandler; | ||
const leasesSupplier = config.leases; | ||
if (leasesSupplier) { | ||
const lease = leasesSupplier(); | ||
requesterLeaseHandler = new _RSocketLease.RequesterLeaseHandler( | ||
lease._receiver | ||
requesterLeaseHandler = new RequesterLeaseHandler((lease: any)._receiver); | ||
responderLeaseHandler = new ResponderLeaseHandler( | ||
(lease: any)._sender, | ||
(lease: any)._stats, | ||
); | ||
responderLeaseHandler = new _RSocketLease.ResponderLeaseHandler( | ||
lease._sender, | ||
lease._stats | ||
); | ||
} | ||
const {keepAlive, lifetime} = config.setup; | ||
this._machine = (0, _RSocketMachine.createClientMachine)( | ||
this._machine = createClientMachine( | ||
connection, | ||
(subscriber) => connection.receive().subscribe(subscriber), | ||
subscriber => connection.receive().subscribe(subscriber), | ||
lifetime, | ||
@@ -165,3 +186,3 @@ config.serializers, | ||
requesterLeaseHandler, | ||
responderLeaseHandler | ||
responderLeaseHandler, | ||
); | ||
@@ -173,46 +194,45 @@ | ||
// Send KEEPALIVE frames | ||
const keepAliveFrames = (0, _rsocketFlowable.every)(keepAlive).map(() => ({ | ||
const keepAliveFrames = every(keepAlive).map(() => ({ | ||
data: null, | ||
flags: _RSocketFrame.FLAGS.RESPOND, | ||
flags: FLAGS.RESPOND, | ||
lastReceivedPosition: 0, | ||
streamId: _RSocketFrame.CONNECTION_STREAM_ID, | ||
type: _RSocketFrame.FRAME_TYPES.KEEPALIVE, | ||
streamId: CONNECTION_STREAM_ID, | ||
type: FRAME_TYPES.KEEPALIVE, | ||
})); | ||
connection.send(keepAliveFrames); | ||
} | ||
fireAndForget(payload) { | ||
fireAndForget(payload: Payload<D, M>): void { | ||
this._machine.fireAndForget(payload); | ||
} | ||
requestResponse(payload) { | ||
requestResponse(payload: Payload<D, M>): Single<Payload<D, M>> { | ||
return this._machine.requestResponse(payload); | ||
} | ||
requestStream(payload) { | ||
requestStream(payload: Payload<D, M>): Flowable<Payload<D, M>> { | ||
return this._machine.requestStream(payload); | ||
} | ||
requestChannel(payloads) { | ||
requestChannel(payloads: Flowable<Payload<D, M>>): Flowable<Payload<D, M>> { | ||
return this._machine.requestChannel(payloads); | ||
} | ||
metadataPush(payload) { | ||
metadataPush(payload: Payload<D, M>): Single<void> { | ||
return this._machine.metadataPush(payload); | ||
} | ||
close() { | ||
close(): void { | ||
this._machine.close(); | ||
} | ||
connectionStatus() { | ||
connectionStatus(): Flowable<ConnectionStatus> { | ||
return this._machine.connectionStatus(); | ||
} | ||
availability() { | ||
availability(): number { | ||
return this._machine.availability(); | ||
} | ||
_buildSetupFrame(config) { | ||
_buildSetupFrame(config: ClientConfig<D, M>): SetupFrame { | ||
const { | ||
@@ -226,4 +246,3 @@ dataMimeType, | ||
const serializers = | ||
config.serializers || _RSocketSerialization.IdentitySerializers; | ||
const serializers = config.serializers || (IdentitySerializers: any); | ||
const data = payload ? serializers.data.serialize(payload.data) : undefined; | ||
@@ -235,3 +254,3 @@ const metadata = payload | ||
if (metadata !== undefined) { | ||
flags |= _RSocketFrame.FLAGS.METADATA; | ||
flags |= FLAGS.METADATA; | ||
} | ||
@@ -241,14 +260,14 @@ return { | ||
dataMimeType, | ||
flags: flags | (config.leases ? _RSocketFrame.FLAGS.LEASE : 0), | ||
flags: flags | (config.leases ? FLAGS.LEASE : 0), | ||
keepAlive, | ||
lifetime, | ||
majorVersion: _RSocketVersion.MAJOR_VERSION, | ||
majorVersion: MAJOR_VERSION, | ||
metadata, | ||
metadataMimeType, | ||
minorVersion: _RSocketVersion.MINOR_VERSION, | ||
minorVersion: MINOR_VERSION, | ||
resumeToken: null, | ||
streamId: _RSocketFrame.CONNECTION_STREAM_ID, | ||
type: _RSocketFrame.FRAME_TYPES.SETUP, | ||
streamId: CONNECTION_STREAM_ID, | ||
type: FRAME_TYPES.SETUP, | ||
}; | ||
} | ||
} |
@@ -15,27 +15,55 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.BufferEncoders = exports.Utf8Encoders = exports.BufferEncoder = exports.UTF8Encoder = void 0; | ||
var _RSocketBufferUtils = require('./RSocketBufferUtils'); | ||
var _Invariant = _interopRequireDefault(require('./Invariant')); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
import type {Encodable} from 'rsocket-types'; | ||
const UTF8Encoder = { | ||
byteLength: (value) => (0, _RSocketBufferUtils.byteLength)(value, 'utf8'), | ||
decode: (buffer, start, end) => { | ||
import {byteLength} from './RSocketBufferUtils'; | ||
import invariant from './Invariant'; | ||
/** | ||
* Commonly used subset of the allowed Node Buffer Encoder types. | ||
*/ | ||
export type Encoder<T: Encodable> = {| | ||
byteLength: (value: Encodable) => number, | ||
encode: ( | ||
value: Encodable, | ||
buffer: Buffer, | ||
start: number, | ||
end: number, | ||
) => number, | ||
decode: (buffer: Buffer, start: number, end: number) => T, | ||
|}; | ||
/** | ||
* The Encoders object specifies how values should be serialized/deserialized | ||
* to/from binary. | ||
*/ | ||
export type Encoders<T: Encodable> = {| | ||
data: Encoder<T>, | ||
dataMimeType: Encoder<string>, | ||
message: Encoder<string>, | ||
metadata: Encoder<T>, | ||
metadataMimeType: Encoder<string>, | ||
resumeToken: Encoder<T>, | ||
|}; | ||
export const UTF8Encoder: Encoder<string> = { | ||
byteLength: (value: Encodable) => byteLength(value, 'utf8'), | ||
decode: (buffer: Buffer, start: number, end: number): string => { | ||
return buffer.toString('utf8', start, end); | ||
}, | ||
encode: (value, buffer, start, end) => { | ||
(0, _Invariant.default)( | ||
encode: ( | ||
value: Encodable, | ||
buffer: Buffer, | ||
start: number, | ||
end: number, | ||
): number => { | ||
invariant( | ||
typeof value === 'string', | ||
'RSocketEncoding: Expected value to be a string, got `%s`.', | ||
value | ||
value, | ||
); | ||
buffer.write(value, start, end - start, 'utf8'); | ||
@@ -45,25 +73,27 @@ return end; | ||
}; | ||
exports.UTF8Encoder = UTF8Encoder; | ||
const BufferEncoder = { | ||
byteLength: (value) => { | ||
(0, _Invariant.default)( | ||
export const BufferEncoder: Encoder<Buffer> = { | ||
byteLength: (value: Encodable) => { | ||
invariant( | ||
Buffer.isBuffer(value), | ||
'RSocketEncoding: Expected value to be a buffer, got `%s`.', | ||
value | ||
value, | ||
); | ||
return value.length; | ||
return (value: any).length; | ||
}, | ||
decode: (buffer, start, end) => { | ||
decode: (buffer: Buffer, start: number, end: number): Buffer => { | ||
return buffer.slice(start, end); | ||
}, | ||
encode: (value, buffer, start, end) => { | ||
(0, _Invariant.default)( | ||
encode: ( | ||
value: Encodable, | ||
buffer: Buffer, | ||
start: number, | ||
end: number, | ||
): number => { | ||
invariant( | ||
Buffer.isBuffer(value), | ||
'RSocketEncoding: Expected value to be a buffer, got `%s`.', | ||
value | ||
value, | ||
); | ||
value.copy(buffer, start, 0, value.length); | ||
(value: any).copy(buffer, start, 0, value.length); | ||
return end; | ||
@@ -75,4 +105,4 @@ }, | ||
* Encode all values as UTF8 strings. | ||
*/ exports.BufferEncoder = BufferEncoder; | ||
const Utf8Encoders = { | ||
*/ | ||
export const Utf8Encoders: Encoders<string> = { | ||
data: UTF8Encoder, | ||
@@ -88,4 +118,4 @@ dataMimeType: UTF8Encoder, | ||
* Encode all values as buffers. | ||
*/ exports.Utf8Encoders = Utf8Encoders; | ||
const BufferEncoders = { | ||
*/ | ||
export const BufferEncoders: Encoders<Buffer> = { | ||
data: BufferEncoder, | ||
@@ -98,2 +128,1 @@ dataMimeType: UTF8Encoder, | ||
}; | ||
exports.BufferEncoders = BufferEncoders; |
@@ -15,76 +15,13 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
/* eslint-disable max-len, no-bitwise */ Object.defineProperty( | ||
exports, | ||
'__esModule', | ||
{value: true} | ||
); | ||
exports.isIgnore = isIgnore; | ||
exports.isMetadata = isMetadata; | ||
exports.isComplete = isComplete; | ||
exports.isNext = isNext; | ||
exports.isRespond = isRespond; | ||
exports.isResumeEnable = isResumeEnable; | ||
exports.isLease = isLease; | ||
exports.isFollows = isFollows; | ||
exports.isResumePositionFrameType = isResumePositionFrameType; | ||
exports.getFrameTypeName = getFrameTypeName; | ||
exports.createErrorFromFrame = createErrorFromFrame; | ||
exports.getErrorCodeExplanation = getErrorCodeExplanation; | ||
exports.printFrame = printFrame; | ||
exports.MAX_VERSION = exports.MAX_TTL = exports.MAX_STREAM_ID = exports.MAX_RESUME_LENGTH = exports.MAX_REQUEST_N = exports.MAX_REQUEST_COUNT = exports.MAX_MIME_LENGTH = exports.MAX_METADATA_LENGTH = exports.MAX_LIFETIME = exports.MAX_KEEPALIVE = exports.MAX_CODE = exports.FRAME_TYPE_OFFFSET = exports.FLAGS_MASK = exports.ERROR_EXPLANATIONS = exports.ERROR_CODES = exports.FLAGS = exports.FRAME_TYPE_NAMES = exports.FRAME_TYPES = exports.CONNECTION_STREAM_ID = void 0; | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object); | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object); | ||
if (enumerableOnly) | ||
symbols = symbols.filter(function (sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable; | ||
}); | ||
keys.push.apply(keys, symbols); | ||
} | ||
return keys; | ||
} | ||
function _objectSpread(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {}; | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function (key) { | ||
_defineProperty(target, key, source[key]); | ||
}); | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); | ||
} else { | ||
ownKeys(Object(source)).forEach(function (key) { | ||
Object.defineProperty( | ||
target, | ||
key, | ||
Object.getOwnPropertyDescriptor(source, key) | ||
); | ||
}); | ||
} | ||
} | ||
return target; | ||
} | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
/* eslint-disable max-len, no-bitwise */ | ||
const CONNECTION_STREAM_ID = 0; | ||
exports.CONNECTION_STREAM_ID = CONNECTION_STREAM_ID; | ||
import type {ErrorFrame, Frame} from 'rsocket-types'; | ||
const FRAME_TYPES = { | ||
export const CONNECTION_STREAM_ID = 0; | ||
export const FRAME_TYPES = { | ||
CANCEL: 0x09, // Cancel Request: Cancel outstanding request. | ||
@@ -109,5 +46,3 @@ ERROR: 0x0b, // Error: Error at connection or application level. | ||
// Maps frame type codes to type names | ||
exports.FRAME_TYPES = FRAME_TYPES; | ||
const FRAME_TYPE_NAMES = {}; | ||
exports.FRAME_TYPE_NAMES = FRAME_TYPE_NAMES; | ||
export const FRAME_TYPE_NAMES: {[typeCode: number]: string} = {}; | ||
for (const name in FRAME_TYPES) { | ||
@@ -118,3 +53,3 @@ const value = FRAME_TYPES[name]; | ||
const FLAGS = { | ||
export const FLAGS = { | ||
COMPLETE: 0x40, // PAYLOAD, REQUEST_CHANNEL: indicates stream completion, if set onComplete will be invoked on receiver. | ||
@@ -131,4 +66,3 @@ FOLLOWS: 0x80, // PAYLOAD, REQUEST_XXX: indicates that frame was fragmented and requires reassembly | ||
// Maps error names to codes | ||
exports.FLAGS = FLAGS; | ||
const ERROR_CODES = { | ||
export const ERROR_CODES = { | ||
APPLICATION_ERROR: 0x00000201, | ||
@@ -149,5 +83,3 @@ CANCELED: 0x00000203, | ||
// Maps error codes to names | ||
exports.ERROR_CODES = ERROR_CODES; | ||
const ERROR_EXPLANATIONS = {}; | ||
exports.ERROR_EXPLANATIONS = ERROR_EXPLANATIONS; | ||
export const ERROR_EXPLANATIONS: {[code: number]: string} = {}; | ||
for (const explanation in ERROR_CODES) { | ||
@@ -158,32 +90,21 @@ const code = ERROR_CODES[explanation]; | ||
const FLAGS_MASK = 0x3ff; // low 10 bits | ||
exports.FLAGS_MASK = FLAGS_MASK; | ||
const FRAME_TYPE_OFFFSET = 10; // frame type is offset 10 bytes within the uint16 containing type + flags | ||
exports.FRAME_TYPE_OFFFSET = FRAME_TYPE_OFFFSET; | ||
const MAX_CODE = 0x7fffffff; // uint31 | ||
exports.MAX_CODE = MAX_CODE; | ||
const MAX_KEEPALIVE = 0x7fffffff; // uint31 | ||
exports.MAX_KEEPALIVE = MAX_KEEPALIVE; | ||
const MAX_LIFETIME = 0x7fffffff; // uint31 | ||
exports.MAX_LIFETIME = MAX_LIFETIME; | ||
const MAX_METADATA_LENGTH = 0xffffff; // uint24 | ||
exports.MAX_METADATA_LENGTH = MAX_METADATA_LENGTH; | ||
const MAX_MIME_LENGTH = 0xff; // int8 | ||
exports.MAX_MIME_LENGTH = MAX_MIME_LENGTH; | ||
const MAX_REQUEST_COUNT = 0x7fffffff; // uint31 | ||
exports.MAX_REQUEST_COUNT = MAX_REQUEST_COUNT; | ||
const MAX_REQUEST_N = 0x7fffffff; // uint31 | ||
exports.MAX_REQUEST_N = MAX_REQUEST_N; | ||
const MAX_RESUME_LENGTH = 0xffff; // uint16 | ||
exports.MAX_RESUME_LENGTH = MAX_RESUME_LENGTH; | ||
const MAX_STREAM_ID = 0x7fffffff; // uint31 | ||
exports.MAX_STREAM_ID = MAX_STREAM_ID; | ||
const MAX_TTL = 0x7fffffff; // uint31 | ||
exports.MAX_TTL = MAX_TTL; | ||
const MAX_VERSION = 0xffff; // uint16 | ||
export const FLAGS_MASK = 0x3ff; // low 10 bits | ||
export const FRAME_TYPE_OFFFSET = 10; // frame type is offset 10 bytes within the uint16 containing type + flags | ||
export const MAX_CODE = 0x7fffffff; // uint31 | ||
export const MAX_KEEPALIVE = 0x7fffffff; // uint31 | ||
export const MAX_LIFETIME = 0x7fffffff; // uint31 | ||
export const MAX_METADATA_LENGTH = 0xffffff; // uint24 | ||
export const MAX_MIME_LENGTH = 0xff; // int8 | ||
export const MAX_REQUEST_COUNT = 0x7fffffff; // uint31 | ||
export const MAX_REQUEST_N = 0x7fffffff; // uint31 | ||
export const MAX_RESUME_LENGTH = 0xffff; // uint16 | ||
export const MAX_STREAM_ID = 0x7fffffff; // uint31 | ||
export const MAX_TTL = 0x7fffffff; // uint31 | ||
export const MAX_VERSION = 0xffff; // uint16 | ||
/** | ||
* Returns true iff the flags have the IGNORE bit set. | ||
*/ exports.MAX_VERSION = MAX_VERSION; | ||
function isIgnore(flags) { | ||
*/ | ||
export function isIgnore(flags: number): boolean { | ||
return (flags & FLAGS.IGNORE) === FLAGS.IGNORE; | ||
@@ -195,3 +116,3 @@ } | ||
*/ | ||
function isMetadata(flags) { | ||
export function isMetadata(flags: number): boolean { | ||
return (flags & FLAGS.METADATA) === FLAGS.METADATA; | ||
@@ -203,3 +124,3 @@ } | ||
*/ | ||
function isComplete(flags) { | ||
export function isComplete(flags: number): boolean { | ||
return (flags & FLAGS.COMPLETE) === FLAGS.COMPLETE; | ||
@@ -211,3 +132,3 @@ } | ||
*/ | ||
function isNext(flags) { | ||
export function isNext(flags: number): boolean { | ||
return (flags & FLAGS.NEXT) === FLAGS.NEXT; | ||
@@ -219,3 +140,3 @@ } | ||
*/ | ||
function isRespond(flags) { | ||
export function isRespond(flags: number): boolean { | ||
return (flags & FLAGS.RESPOND) === FLAGS.RESPOND; | ||
@@ -227,3 +148,3 @@ } | ||
*/ | ||
function isResumeEnable(flags) { | ||
export function isResumeEnable(flags: number): boolean { | ||
return (flags & FLAGS.RESUME_ENABLE) === FLAGS.RESUME_ENABLE; | ||
@@ -235,7 +156,7 @@ } | ||
*/ | ||
function isLease(flags) { | ||
export function isLease(flags: number): boolean { | ||
return (flags & FLAGS.LEASE) === FLAGS.LEASE; | ||
} | ||
function isFollows(flags) { | ||
export function isFollows(flags: number): boolean { | ||
return (flags & FLAGS.FOLLOWS) === FLAGS.FOLLOWS; | ||
@@ -248,3 +169,3 @@ } | ||
*/ | ||
function isResumePositionFrameType(type) { | ||
export function isResumePositionFrameType(type: number): boolean { | ||
return ( | ||
@@ -262,3 +183,3 @@ type === FRAME_TYPES.CANCEL || | ||
function getFrameTypeName(type) { | ||
export function getFrameTypeName(type: number): string { | ||
const name = FRAME_TYPE_NAMES[type]; | ||
@@ -270,3 +191,3 @@ return name != null ? name : toHex(type); | ||
let index = 0; | ||
return format.replace(/%s/g, (match) => args[index++]); | ||
return format.replace(/%s/g, match => args[index++]); | ||
} | ||
@@ -283,3 +204,3 @@ | ||
*/ | ||
function createErrorFromFrame(frame) { | ||
export function createErrorFromFrame(frame: ErrorFrame): Error { | ||
const {code, message} = frame; | ||
@@ -292,7 +213,6 @@ const explanation = getErrorCodeExplanation(code); | ||
explanation, | ||
message | ||
) | ||
message, | ||
), | ||
); | ||
error.source = { | ||
(error: any).source = { | ||
code, | ||
@@ -302,3 +222,2 @@ explanation, | ||
}; | ||
return error; | ||
@@ -311,3 +230,3 @@ } | ||
*/ | ||
function getErrorCodeExplanation(code) { | ||
export function getErrorCodeExplanation(code: number): string { | ||
const explanation = ERROR_EXPLANATIONS[code]; | ||
@@ -327,4 +246,4 @@ if (explanation != null) { | ||
*/ | ||
function printFrame(frame) { | ||
const obj = _objectSpread({}, frame); | ||
export function printFrame(frame: Frame): string { | ||
const obj: Object = {...frame}; | ||
obj.type = getFrameTypeName(frame.type) + ` (${toHex(frame.type)})`; | ||
@@ -348,4 +267,4 @@ const flagNames = []; | ||
function toHex(n) { | ||
function toHex(n: number): string { | ||
return '0x' + n.toString(16); | ||
} |
@@ -15,39 +15,39 @@ /** Copyright 2015-2019 the original author or authors. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.ResponderLeaseHandler = exports.RequesterLeaseHandler = exports.Leases = exports.Lease = void 0; | ||
var _Invariant = _interopRequireDefault(require('./Invariant')); | ||
var _rsocketFlowable = require('rsocket-flowable'); | ||
import type {Encodable} from 'rsocket-types'; | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
import invariant from './Invariant'; | ||
import {Flowable} from 'rsocket-flowable'; | ||
import type {LeaseFrame, ISubscriber, ISubscription} from 'rsocket-types'; | ||
import {MAX_REQUEST_N} from './RSocketFrame'; | ||
export type EventType = 'Accept' | 'Reject' | 'Terminate'; | ||
export interface LeaseStats { | ||
onEvent(event: EventType): void, | ||
} | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
export interface Disposable { | ||
dispose(): void, | ||
isDisposed(): boolean, | ||
} | ||
class Lease { | ||
constructor(timeToLiveMillis, allowedRequests, metadata) { | ||
(0, _Invariant.default)( | ||
timeToLiveMillis > 0, | ||
'Lease time-to-live must be positive' | ||
); | ||
(0, _Invariant.default)( | ||
allowedRequests > 0, | ||
'Lease allowed requests must be positive' | ||
); | ||
export class Lease { | ||
allowedRequests: number; | ||
startingAllowedRequests: number; | ||
timeToLiveMillis: number; | ||
expiry: number; | ||
metadata: ?Encodable; | ||
constructor( | ||
timeToLiveMillis: number, | ||
allowedRequests: number, | ||
metadata: ?Encodable, | ||
) { | ||
invariant(timeToLiveMillis > 0, 'Lease time-to-live must be positive'); | ||
invariant(allowedRequests > 0, 'Lease allowed requests must be positive'); | ||
this.timeToLiveMillis = timeToLiveMillis; | ||
@@ -60,7 +60,7 @@ this.allowedRequests = allowedRequests; | ||
expired() { | ||
expired(): boolean { | ||
return Date.now() > this.expiry; | ||
} | ||
valid() { | ||
valid(): boolean { | ||
return this.allowedRequests > 0 && !this.expired(); | ||
@@ -70,7 +70,7 @@ } | ||
// todo hide | ||
_use() { | ||
_use(): boolean { | ||
if (this.expired()) { | ||
return false; | ||
} | ||
const allowed = this.allowedRequests; | ||
const allowed: number = this.allowedRequests; | ||
const success = allowed > 0; | ||
@@ -83,11 +83,9 @@ if (success) { | ||
} | ||
exports.Lease = Lease; | ||
class Leases { | ||
constructor() { | ||
_defineProperty(this, '_sender', () => _rsocketFlowable.Flowable.never()); | ||
_defineProperty(this, '_receiver', (leases) => {}); | ||
} | ||
export class Leases<T: LeaseStats> { | ||
_sender: (?T) => Flowable<Lease> = () => Flowable.never(); | ||
_receiver: (Flowable<Lease>) => void = leases => {}; | ||
_stats: ?T; | ||
sender(sender) { | ||
sender(sender: (?T) => Flowable<Lease>): Leases<T> { | ||
this._sender = sender; | ||
@@ -97,3 +95,3 @@ return this; | ||
receiver(receiver) { | ||
receiver(receiver: (Flowable<Lease>) => void): Leases<T> { | ||
this._receiver = receiver; | ||
@@ -103,3 +101,3 @@ return this; | ||
stats(stats) { | ||
stats(stats: T): Leases<T> { | ||
this._stats = stats; | ||
@@ -109,11 +107,19 @@ return this; | ||
} | ||
exports.Leases = Leases; | ||
class RequesterLeaseHandler { | ||
export interface LeaseHandler { | ||
use(): boolean, | ||
errorMessage(): string, | ||
} | ||
export class RequesterLeaseHandler implements LeaseHandler, Disposable { | ||
_isDisposed: boolean; | ||
_subscriber: ?ISubscriber<Lease>; | ||
/*negative value means received lease was not signalled due to missing requestN*/ | ||
_requestN: number = -1; | ||
_lease: ?Lease; | ||
constructor(leaseReceiver) { | ||
_defineProperty(this, '_requestN', -1); | ||
constructor(leaseReceiver: (Flowable<Lease>) => void) { | ||
leaseReceiver( | ||
new _rsocketFlowable.Flowable((subscriber) => { | ||
new Flowable(subscriber => { | ||
if (this._subscriber) { | ||
@@ -132,6 +138,6 @@ subscriber.onError(new Error('only 1 subscriber is allowed')); | ||
}, | ||
request: (n) => { | ||
request: n => { | ||
if (n <= 0) { | ||
subscriber.onError( | ||
new Error(`request demand must be positive: ${n}`) | ||
new Error(`request demand must be positive: ${n}`), | ||
); | ||
@@ -144,3 +150,3 @@ } | ||
Number.MAX_SAFE_INTEGER, | ||
Math.max(0, curReqN) + n | ||
Math.max(0, curReqN) + n, | ||
); | ||
@@ -150,7 +156,7 @@ } | ||
}); | ||
}) | ||
}), | ||
); | ||
} | ||
use() { | ||
use(): boolean { | ||
const l = this._lease; | ||
@@ -160,7 +166,7 @@ return l ? l._use() : false; | ||
errorMessage() { | ||
errorMessage(): string { | ||
return _errorMessage(this._lease); | ||
} | ||
receive(frame) { | ||
receive(frame: LeaseFrame): void { | ||
if (!this.isDisposed()) { | ||
@@ -174,3 +180,3 @@ const timeToLiveMillis = frame.ttl; | ||
availability() { | ||
availability(): number { | ||
const l = this._lease; | ||
@@ -183,3 +189,3 @@ if (l && l.valid()) { | ||
dispose() { | ||
dispose(): void { | ||
if (!this._isDisposed) { | ||
@@ -194,7 +200,7 @@ this._isDisposed = true; | ||
isDisposed() { | ||
isDisposed(): boolean { | ||
return this._isDisposed; | ||
} | ||
_onRequestN(requestN) { | ||
_onRequestN(requestN: number) { | ||
const l = this._lease; | ||
@@ -207,3 +213,3 @@ const s = this._subscriber; | ||
_onLease(lease) { | ||
_onLease(lease: Lease) { | ||
const s = this._subscriber; | ||
@@ -218,6 +224,14 @@ const newReqN = this._requestN - 1; | ||
} | ||
exports.RequesterLeaseHandler = RequesterLeaseHandler; | ||
class ResponderLeaseHandler { | ||
constructor(leaseSender, stats, errorConsumer) { | ||
export class ResponderLeaseHandler implements LeaseHandler { | ||
_lease: ?Lease; | ||
_leaseSender: (?LeaseStats) => Flowable<Lease>; | ||
_stats: ?LeaseStats; | ||
_errorConsumer: ?(Error) => void; | ||
constructor( | ||
leaseSender: (?LeaseStats) => Flowable<Lease>, | ||
stats: ?LeaseStats, | ||
errorConsumer: ?(Error) => void, | ||
) { | ||
this._leaseSender = leaseSender; | ||
@@ -228,3 +242,3 @@ this._stats = stats; | ||
use() { | ||
use(): boolean { | ||
const l = this._lease; | ||
@@ -236,13 +250,13 @@ const success = l ? l._use() : false; | ||
errorMessage() { | ||
errorMessage(): string { | ||
return _errorMessage(this._lease); | ||
} | ||
send(send) { | ||
let subscription; | ||
let isDisposed; | ||
send(send: (Lease) => void): Disposable { | ||
let subscription: ?ISubscription; | ||
let isDisposed: boolean; | ||
this._leaseSender(this._stats).subscribe({ | ||
onComplete: () => this._onStatsEvent(), | ||
onError: (error) => { | ||
onError: error => { | ||
this._onStatsEvent(); | ||
@@ -254,7 +268,7 @@ const errConsumer = this._errorConsumer; | ||
}, | ||
onNext: (lease) => { | ||
onNext: lease => { | ||
this._lease = lease; | ||
send(lease); | ||
}, | ||
onSubscribe: (s) => { | ||
onSubscribe: s => { | ||
if (isDisposed) { | ||
@@ -264,3 +278,3 @@ s.cancel(); | ||
} | ||
s.request(_RSocketFrame.MAX_REQUEST_N); | ||
s.request(MAX_REQUEST_N); | ||
subscription = s; | ||
@@ -271,3 +285,3 @@ }, | ||
return { | ||
dispose() { | ||
dispose(): void { | ||
if (!isDisposed) { | ||
@@ -282,3 +296,3 @@ isDisposed = true; | ||
isDisposed() { | ||
isDisposed(): boolean { | ||
return isDisposed; | ||
@@ -289,3 +303,3 @@ }, | ||
_onStatsEvent(success) { | ||
_onStatsEvent(success?: boolean) { | ||
const s = this._stats; | ||
@@ -299,5 +313,4 @@ if (s) { | ||
} | ||
exports.ResponderLeaseHandler = ResponderLeaseHandler; | ||
function _errorMessage(lease) { | ||
function _errorMessage(lease: ?Lease): string { | ||
if (!lease) { | ||
@@ -304,0 +317,0 @@ return 'Lease was not received yet'; |
@@ -15,72 +15,64 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.createServerMachine = createServerMachine; | ||
exports.createClientMachine = createClientMachine; | ||
var _rsocketFlowable = require('rsocket-flowable'); | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
import type { | ||
CancelFrame, | ||
ConnectionStatus, | ||
DuplexConnection, | ||
Frame, | ||
FrameWithData, | ||
Payload, | ||
Responder, | ||
PartialResponder, | ||
ReactiveSocket, | ||
RequestFnfFrame, | ||
RequestNFrame, | ||
RequestResponseFrame, | ||
RequestStreamFrame, | ||
RequestChannelFrame, | ||
MetadataPushFrame, | ||
} from 'rsocket-types'; | ||
import type {ISubject, ISubscription, IPartialSubscriber} from 'rsocket-types'; | ||
import type {PayloadSerializers} from './RSocketSerialization'; | ||
var _RSocketSerialization = require('./RSocketSerialization'); | ||
var _RSocketLease = require('./RSocketLease'); | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object); | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object); | ||
if (enumerableOnly) | ||
symbols = symbols.filter(function (sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable; | ||
}); | ||
keys.push.apply(keys, symbols); | ||
} | ||
return keys; | ||
} | ||
function _objectSpread(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {}; | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function (key) { | ||
_defineProperty(target, key, source[key]); | ||
}); | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); | ||
} else { | ||
ownKeys(Object(source)).forEach(function (key) { | ||
Object.defineProperty( | ||
target, | ||
key, | ||
Object.getOwnPropertyDescriptor(source, key) | ||
); | ||
}); | ||
} | ||
} | ||
return target; | ||
} | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
import {Flowable, FlowableProcessor, Single} from 'rsocket-flowable'; | ||
import { | ||
createErrorFromFrame, | ||
getFrameTypeName, | ||
isComplete, | ||
isNext, | ||
isRespond, | ||
CONNECTION_STREAM_ID, | ||
ERROR_CODES, | ||
FLAGS, | ||
FRAME_TYPES, | ||
MAX_REQUEST_N, | ||
MAX_STREAM_ID, | ||
} from './RSocketFrame'; | ||
import {IdentitySerializers} from './RSocketSerialization'; | ||
import { | ||
LeaseHandler, | ||
RequesterLeaseHandler, | ||
ResponderLeaseHandler, | ||
Disposable, | ||
} from './RSocketLease'; | ||
import RSocketError from './RSocketError'; | ||
class ResponderWrapper { | ||
constructor(responder) { | ||
type Role = 'CLIENT' | 'SERVER'; | ||
class ResponderWrapper<D, M> implements Responder<D, M> { | ||
_responder: PartialResponder<D, M>; | ||
constructor(responder: ?PartialResponder<D, M>) { | ||
this._responder = responder || {}; | ||
} | ||
setResponder(responder) { | ||
setResponder(responder: ?PartialResponder<D, M>): void { | ||
this._responder = responder || {}; | ||
} | ||
fireAndForget(payload) { | ||
fireAndForget(payload: Payload<D, M>): void { | ||
if (this._responder.fireAndForget) { | ||
@@ -95,4 +87,4 @@ try { | ||
requestResponse(payload) { | ||
let error; | ||
requestResponse(payload: Payload<D, M>): Single<Payload<D, M>> { | ||
let error: ?Error; | ||
if (this._responder.requestResponse) { | ||
@@ -106,7 +98,7 @@ try { | ||
} | ||
return _rsocketFlowable.Single.error(error || new Error('not implemented')); | ||
return Single.error(error || new Error('not implemented')); | ||
} | ||
requestStream(payload) { | ||
let error; | ||
requestStream(payload: Payload<D, M>): Flowable<Payload<D, M>> { | ||
let error: ?Error; | ||
if (this._responder.requestStream) { | ||
@@ -120,9 +112,7 @@ try { | ||
} | ||
return _rsocketFlowable.Flowable.error( | ||
error || new Error('not implemented') | ||
); | ||
return Flowable.error(error || new Error('not implemented')); | ||
} | ||
requestChannel(payloads) { | ||
let error; | ||
requestChannel(payloads: Flowable<Payload<D, M>>): Flowable<Payload<D, M>> { | ||
let error: ?Error; | ||
if (this._responder.requestChannel) { | ||
@@ -136,9 +126,7 @@ try { | ||
} | ||
return _rsocketFlowable.Flowable.error( | ||
error || new Error('not implemented') | ||
); | ||
return Flowable.error(error || new Error('not implemented')); | ||
} | ||
metadataPush(payload) { | ||
let error; | ||
metadataPush(payload: Payload<D, M>): Single<void> { | ||
let error: ?Error; | ||
if (this._responder.metadataPush) { | ||
@@ -152,15 +140,19 @@ try { | ||
} | ||
return _rsocketFlowable.Single.error(error || new Error('not implemented')); | ||
return Single.error(error || new Error('not implemented')); | ||
} | ||
} | ||
function createServerMachine( | ||
connection, | ||
connectionPublisher, | ||
keepAliveTimeout, | ||
serializers, | ||
errorHandler, | ||
requesterLeaseHandler, | ||
responderLeaseHandler | ||
) { | ||
export interface RSocketMachine<D, M> extends ReactiveSocket<D, M> { | ||
setRequestHandler(requestHandler: ?PartialResponder<D, M>): void, | ||
} | ||
export function createServerMachine<D, M>( | ||
connection: DuplexConnection, | ||
connectionPublisher: (partialSubscriber: IPartialSubscriber<Frame>) => void, | ||
keepAliveTimeout: number, | ||
serializers?: ?PayloadSerializers<D, M>, | ||
errorHandler?: (Error) => void, | ||
requesterLeaseHandler?: ?RequesterLeaseHandler, | ||
responderLeaseHandler?: ?ResponderLeaseHandler, | ||
): RSocketMachine<D, M> { | ||
return new RSocketMachineImpl( | ||
@@ -175,16 +167,16 @@ 'SERVER', | ||
requesterLeaseHandler, | ||
responderLeaseHandler | ||
responderLeaseHandler, | ||
); | ||
} | ||
function createClientMachine( | ||
connection, | ||
connectionPublisher, | ||
keepAliveTimeout, | ||
serializers, | ||
requestHandler, | ||
errorHandler, | ||
requesterLeaseHandler, | ||
responderLeaseHandler | ||
) { | ||
export function createClientMachine<D, M>( | ||
connection: DuplexConnection, | ||
connectionPublisher: (partialSubscriber: IPartialSubscriber<Frame>) => void, | ||
keepAliveTimeout: number, | ||
serializers?: ?PayloadSerializers<D, M>, | ||
requestHandler?: ?PartialResponder<D, M>, | ||
errorHandler?: (Error) => void, | ||
requesterLeaseHandler?: ?RequesterLeaseHandler, | ||
responderLeaseHandler?: ?ResponderLeaseHandler, | ||
): RSocketMachine<D, M> { | ||
return new RSocketMachineImpl( | ||
@@ -199,68 +191,32 @@ 'CLIENT', | ||
requesterLeaseHandler, | ||
responderLeaseHandler | ||
responderLeaseHandler, | ||
); | ||
} | ||
class RSocketMachineImpl { | ||
class RSocketMachineImpl<D, M> implements RSocketMachine<D, M> { | ||
_requestHandler: ResponderWrapper<D, M>; | ||
_connection: DuplexConnection; | ||
_nextStreamId: number; | ||
_receivers: Map<number, ISubject<Payload<D, M>>>; | ||
_subscriptions: Map<number, ISubscription>; | ||
_serializers: PayloadSerializers<D, M>; | ||
_connectionAvailability: number = 1.0; | ||
_requesterLeaseHandler: ?RequesterLeaseHandler; | ||
_responderLeaseHandler: ?ResponderLeaseHandler; | ||
_responderLeaseSenderDisposable: ?Disposable; | ||
_errorHandler: ?(Error) => void; | ||
_keepAliveLastReceivedMillis: number; | ||
_keepAliveTimerHandle: ?TimeoutID; | ||
constructor( | ||
role, | ||
connection, | ||
connectionPublisher, | ||
keepAliveTimeout, | ||
serializers, | ||
requestHandler, | ||
errorHandler, | ||
requesterLeaseHandler, | ||
responderLeaseHandler | ||
role: Role, | ||
connection: DuplexConnection, | ||
connectionPublisher: (partialSubscriber: IPartialSubscriber<Frame>) => void, | ||
keepAliveTimeout: number, | ||
serializers: ?PayloadSerializers<D, M>, | ||
requestHandler: ?PartialResponder<D, M>, | ||
errorHandler: ?(Error) => void, | ||
requesterLeaseHandler: ?RequesterLeaseHandler, | ||
responderLeaseHandler: ?ResponderLeaseHandler, | ||
) { | ||
_defineProperty(this, '_connectionAvailability', 1.0); | ||
_defineProperty( | ||
this, | ||
'_handleTransportClose', | ||
() => { | ||
this._handleError(new Error('RSocket: The connection was closed.')); | ||
} | ||
); | ||
_defineProperty( | ||
this, | ||
'_handleError', | ||
(error) => { | ||
// Error any open request streams | ||
this._receivers.forEach((receiver) => { | ||
receiver.onError(error); | ||
}); | ||
this._receivers.clear(); | ||
// Cancel any active subscriptions | ||
this._subscriptions.forEach((subscription) => { | ||
subscription.cancel(); | ||
}); | ||
this._subscriptions.clear(); | ||
this._connectionAvailability = 0.0; | ||
this._dispose( | ||
this._requesterLeaseHandler, | ||
this._responderLeaseSenderDisposable | ||
); | ||
const handle = this._keepAliveTimerHandle; | ||
if (handle) { | ||
clearTimeout(handle); | ||
this._keepAliveTimerHandle = null; | ||
} | ||
} | ||
); | ||
_defineProperty( | ||
this, | ||
'_handleFrame', | ||
(frame) => { | ||
const {streamId} = frame; | ||
if (streamId === _RSocketFrame.CONNECTION_STREAM_ID) { | ||
this._handleConnectionFrame(frame); | ||
} else { | ||
this._handleStreamFrame(streamId, frame); | ||
} | ||
} | ||
); | ||
this._connection = connection; | ||
@@ -272,6 +228,7 @@ this._requesterLeaseHandler = requesterLeaseHandler; | ||
this._subscriptions = new Map(); | ||
this._serializers = | ||
serializers || _RSocketSerialization.IdentitySerializers; | ||
this._serializers = serializers || (IdentitySerializers: any); | ||
this._requestHandler = new ResponderWrapper(requestHandler); | ||
this._errorHandler = errorHandler; // Subscribe to completion/errors before sending anything | ||
this._errorHandler = errorHandler; | ||
// Subscribe to completion/errors before sending anything | ||
connectionPublisher({ | ||
@@ -281,13 +238,15 @@ onComplete: this._handleTransportClose, | ||
onNext: this._handleFrame, | ||
onSubscribe: (subscription) => | ||
onSubscribe: subscription => | ||
subscription.request(Number.MAX_SAFE_INTEGER), | ||
}); | ||
const responderHandler = this._responderLeaseHandler; | ||
if (responderHandler) { | ||
this._responderLeaseSenderDisposable = responderHandler.send( | ||
this._leaseFrameSender() | ||
this._leaseFrameSender(), | ||
); | ||
} // Cleanup when the connection closes | ||
} | ||
// Cleanup when the connection closes | ||
this._connection.connectionStatus().subscribe({ | ||
onNext: (status) => { | ||
onNext: status => { | ||
if (status.kind === 'CLOSED') { | ||
@@ -299,5 +258,6 @@ this._handleTransportClose(); | ||
}, | ||
onSubscribe: (subscription) => | ||
onSubscribe: subscription => | ||
subscription.request(Number.MAX_SAFE_INTEGER), | ||
}); | ||
const MIN_TICK_DURATION = 100; | ||
@@ -310,3 +270,3 @@ this._keepAliveLastReceivedMillis = Date.now(); | ||
this._handleConnectionError( | ||
new Error(`No keep-alive acks for ${keepAliveTimeout} millis`) | ||
new Error(`No keep-alive acks for ${keepAliveTimeout} millis`), | ||
); | ||
@@ -316,3 +276,3 @@ } else { | ||
keepAliveHandler, | ||
Math.max(MIN_TICK_DURATION, keepAliveTimeout - noKeepAliveDuration) | ||
Math.max(MIN_TICK_DURATION, keepAliveTimeout - noKeepAliveDuration), | ||
); | ||
@@ -323,12 +283,16 @@ } | ||
} | ||
setRequestHandler(requestHandler) { | ||
setRequestHandler(requestHandler: ?PartialResponder<D, M>): void { | ||
this._requestHandler.setResponder(requestHandler); | ||
} | ||
close() { | ||
close(): void { | ||
this._connection.close(); | ||
} | ||
connectionStatus() { | ||
connectionStatus(): Flowable<ConnectionStatus> { | ||
return this._connection.connectionStatus(); | ||
} | ||
availability() { | ||
availability(): number { | ||
const r = this._requesterLeaseHandler; | ||
@@ -338,3 +302,4 @@ const requesterAvailability = r ? r.availability() : 1.0; | ||
} | ||
fireAndForget(payload) { | ||
fireAndForget(payload: Payload<D, M>): void { | ||
if (this._useLeaseOrError(this._requesterLeaseHandler)) { | ||
@@ -348,20 +313,22 @@ return; | ||
data, | ||
flags: payload.metadata !== undefined ? _RSocketFrame.FLAGS.METADATA : 0, | ||
flags: payload.metadata !== undefined ? FLAGS.METADATA : 0, | ||
metadata, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_FNF, | ||
type: FRAME_TYPES.REQUEST_FNF, | ||
}; | ||
this._connection.sendOne(frame); | ||
} | ||
requestResponse(payload) { | ||
requestResponse(payload: Payload<D, M>): Single<Payload<D, M>> { | ||
const leaseError = this._useLeaseOrError(this._requesterLeaseHandler); | ||
if (leaseError) { | ||
return _rsocketFlowable.Single.error(new Error(leaseError)); | ||
return Single.error(new Error(leaseError)); | ||
} | ||
const streamId = this._getNextStreamId(this._receivers); | ||
return new _rsocketFlowable.Single((subscriber) => { | ||
return new Single(subscriber => { | ||
this._receivers.set(streamId, { | ||
onComplete: () => {}, | ||
onError: (error) => subscriber.onError(error), | ||
onNext: (data) => subscriber.onComplete(data), | ||
onError: error => subscriber.onError(error), | ||
onNext: data => subscriber.onComplete(data), | ||
}); | ||
@@ -372,9 +339,9 @@ const data = this._serializers.data.serialize(payload.data); | ||
data, | ||
flags: | ||
payload.metadata !== undefined ? _RSocketFrame.FLAGS.METADATA : 0, | ||
flags: payload.metadata !== undefined ? FLAGS.METADATA : 0, | ||
metadata, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE, | ||
type: FRAME_TYPES.REQUEST_RESPONSE, | ||
}; | ||
this._connection.sendOne(frame); | ||
subscriber.onSubscribe(() => { | ||
@@ -385,3 +352,3 @@ this._receivers.delete(streamId); | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.CANCEL, | ||
type: FRAME_TYPES.CANCEL, | ||
}; | ||
@@ -392,11 +359,15 @@ this._connection.sendOne(cancelFrame); | ||
} | ||
requestStream(payload) { | ||
requestStream(payload: Payload<D, M>): Flowable<Payload<D, M>> { | ||
const leaseError = this._useLeaseOrError(this._requesterLeaseHandler); | ||
if (leaseError) { | ||
return _rsocketFlowable.Flowable.error(new Error(leaseError)); | ||
return Flowable.error(new Error(leaseError)); | ||
} | ||
const streamId = this._getNextStreamId(this._receivers); | ||
return new _rsocketFlowable.Flowable((subscriber) => { | ||
return new Flowable(subscriber => { | ||
this._receivers.set(streamId, subscriber); | ||
let initialized = false; | ||
subscriber.onSubscribe({ | ||
@@ -411,9 +382,9 @@ cancel: () => { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.CANCEL, | ||
type: FRAME_TYPES.CANCEL, | ||
}; | ||
this._connection.sendOne(cancelFrame); | ||
}, | ||
request: (n) => { | ||
if (n > _RSocketFrame.MAX_REQUEST_N) { | ||
n = _RSocketFrame.MAX_REQUEST_N; | ||
request: n => { | ||
if (n > MAX_REQUEST_N) { | ||
n = MAX_REQUEST_N; | ||
} | ||
@@ -425,3 +396,3 @@ if (initialized) { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_N, | ||
type: FRAME_TYPES.REQUEST_N, | ||
}; | ||
@@ -433,14 +404,11 @@ this._connection.sendOne(requestNFrame); | ||
const metadata = this._serializers.metadata.serialize( | ||
payload.metadata | ||
payload.metadata, | ||
); | ||
const requestStreamFrame = { | ||
data, | ||
flags: | ||
payload.metadata !== undefined | ||
? _RSocketFrame.FLAGS.METADATA | ||
: 0, | ||
flags: payload.metadata !== undefined ? FLAGS.METADATA : 0, | ||
metadata, | ||
requestN: n, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_STREAM, | ||
type: FRAME_TYPES.REQUEST_STREAM, | ||
}; | ||
@@ -451,15 +419,19 @@ this._connection.sendOne(requestStreamFrame); | ||
}); | ||
}, _RSocketFrame.MAX_REQUEST_N); | ||
}, MAX_REQUEST_N); | ||
} | ||
requestChannel(payloads) { | ||
requestChannel(payloads: Flowable<Payload<D, M>>): Flowable<Payload<D, M>> { | ||
const leaseError = this._useLeaseOrError(this._requesterLeaseHandler); | ||
if (leaseError) { | ||
return _rsocketFlowable.Flowable.error(new Error(leaseError)); | ||
return Flowable.error(new Error(leaseError)); | ||
} | ||
const streamId = this._getNextStreamId(this._receivers); | ||
let payloadsSubscribed = false; | ||
return new _rsocketFlowable.Flowable((subscriber) => { | ||
return new Flowable(subscriber => { | ||
try { | ||
this._receivers.set(streamId, subscriber); | ||
let initialized = false; | ||
subscriber.onSubscribe({ | ||
@@ -474,9 +446,9 @@ cancel: () => { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.CANCEL, | ||
type: FRAME_TYPES.CANCEL, | ||
}; | ||
this._connection.sendOne(cancelFrame); | ||
}, | ||
request: (n) => { | ||
if (n > _RSocketFrame.MAX_REQUEST_N) { | ||
n = _RSocketFrame.MAX_REQUEST_N; | ||
request: n => { | ||
if (n > MAX_REQUEST_N) { | ||
n = MAX_REQUEST_N; | ||
} | ||
@@ -488,3 +460,3 @@ if (initialized) { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_N, | ||
type: FRAME_TYPES.REQUEST_N, | ||
}; | ||
@@ -499,9 +471,10 @@ this._connection.sendOne(requestNFrame); | ||
}, | ||
onError: (error) => { | ||
this._sendStreamError(streamId, error.message); | ||
}, //Subscriber methods | ||
onNext: (payload) => { | ||
onError: error => { | ||
this._sendStreamError(streamId, error); | ||
}, | ||
//Subscriber methods | ||
onNext: payload => { | ||
const data = this._serializers.data.serialize(payload.data); | ||
const metadata = this._serializers.metadata.serialize( | ||
payload.metadata | ||
payload.metadata, | ||
); | ||
@@ -513,9 +486,7 @@ if (!initialized) { | ||
flags: | ||
payload.metadata !== undefined | ||
? _RSocketFrame.FLAGS.METADATA | ||
: 0, | ||
payload.metadata !== undefined ? FLAGS.METADATA : 0, | ||
metadata, | ||
requestN: n, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL, | ||
type: FRAME_TYPES.REQUEST_CHANNEL, | ||
}; | ||
@@ -527,9 +498,7 @@ this._connection.sendOne(requestChannelFrame); | ||
flags: | ||
_RSocketFrame.FLAGS.NEXT | | ||
(payload.metadata !== undefined | ||
? _RSocketFrame.FLAGS.METADATA | ||
: 0), | ||
FLAGS.NEXT | | ||
(payload.metadata !== undefined ? FLAGS.METADATA : 0), | ||
metadata, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.PAYLOAD, | ||
type: FRAME_TYPES.PAYLOAD, | ||
}; | ||
@@ -539,3 +508,3 @@ this._connection.sendOne(payloadFrame); | ||
}, | ||
onSubscribe: (subscription) => { | ||
onSubscribe: subscription => { | ||
this._subscriptions.set(streamId, subscription); | ||
@@ -548,3 +517,3 @@ subscription.request(1); | ||
'RSocketClient: re-entrant call to request n before initial' + | ||
' channel established.' | ||
' channel established.', | ||
); | ||
@@ -558,6 +527,7 @@ } | ||
} | ||
}, _RSocketFrame.MAX_REQUEST_N); | ||
}, MAX_REQUEST_N); | ||
} | ||
metadataPush(payload) { | ||
return new _rsocketFlowable.Single((subscriber) => { | ||
metadataPush(payload: Payload<D, M>): Single<void> { | ||
return new Single(subscriber => { | ||
const metadata = this._serializers.metadata.serialize(payload.metadata); | ||
@@ -568,5 +538,6 @@ const frame = { | ||
streamId: 0, | ||
type: _RSocketFrame.FRAME_TYPES.METADATA_PUSH, | ||
type: FRAME_TYPES.METADATA_PUSH, | ||
}; | ||
this._connection.sendOne(frame); | ||
subscriber.onSubscribe(() => {}); | ||
@@ -576,11 +547,12 @@ subscriber.onComplete(); | ||
} | ||
_getNextStreamId(streamIds) { | ||
_getNextStreamId(streamIds: Map<number, ISubject<Payload<D, M>>>): number { | ||
const streamId = this._nextStreamId; | ||
do { | ||
this._nextStreamId = | ||
(this._nextStreamId + 2) & _RSocketFrame.MAX_STREAM_ID; | ||
this._nextStreamId = (this._nextStreamId + 2) & MAX_STREAM_ID; | ||
} while (this._nextStreamId === 0 || streamIds.has(streamId)); | ||
return streamId; | ||
} | ||
_useLeaseOrError(leaseHandler) { | ||
_useLeaseOrError(leaseHandler: ?LeaseHandler): ?string { | ||
if (leaseHandler) { | ||
@@ -592,4 +564,5 @@ if (!leaseHandler.use()) { | ||
} | ||
_leaseFrameSender() { | ||
return (lease) => | ||
return lease => | ||
this._connection.sendOne({ | ||
@@ -599,9 +572,10 @@ flags: 0, | ||
requestCount: lease.allowedRequests, | ||
streamId: _RSocketFrame.CONNECTION_STREAM_ID, | ||
streamId: CONNECTION_STREAM_ID, | ||
ttl: lease.timeToLiveMillis, | ||
type: _RSocketFrame.FRAME_TYPES.LEASE, | ||
type: FRAME_TYPES.LEASE, | ||
}); | ||
} | ||
_dispose(...disposables) { | ||
disposables.forEach((d) => { | ||
_dispose(...disposables: Array<?Disposable>) { | ||
disposables.forEach(d => { | ||
if (d) { | ||
@@ -612,8 +586,9 @@ d.dispose(); | ||
} | ||
_isRequest(frameType) { | ||
_isRequest(frameType: number) { | ||
switch (frameType) { | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_FNF: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_STREAM: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL: | ||
case FRAME_TYPES.REQUEST_FNF: | ||
case FRAME_TYPES.REQUEST_RESPONSE: | ||
case FRAME_TYPES.REQUEST_STREAM: | ||
case FRAME_TYPES.REQUEST_CHANNEL: | ||
return true; | ||
@@ -624,5 +599,37 @@ default: | ||
} | ||
/** | ||
* Handle the connection closing normally: this is an error for any open streams. | ||
*/ _handleConnectionError(error) { | ||
*/ | ||
_handleTransportClose = (): void => { | ||
this._handleError(new Error('RSocket: The connection was closed.')); | ||
}; | ||
/** | ||
* Handle the transport connection closing abnormally or a connection-level protocol error. | ||
*/ | ||
_handleError = (error: Error) => { | ||
// Error any open request streams | ||
this._receivers.forEach(receiver => { | ||
receiver.onError(error); | ||
}); | ||
this._receivers.clear(); | ||
// Cancel any active subscriptions | ||
this._subscriptions.forEach(subscription => { | ||
subscription.cancel(); | ||
}); | ||
this._subscriptions.clear(); | ||
this._connectionAvailability = 0.0; | ||
this._dispose( | ||
this._requesterLeaseHandler, | ||
this._responderLeaseSenderDisposable, | ||
); | ||
const handle = this._keepAliveTimerHandle; | ||
if (handle) { | ||
clearTimeout(handle); | ||
this._keepAliveTimerHandle = null; | ||
} | ||
}; | ||
_handleConnectionError(error: Error): void { | ||
this._handleError(error); | ||
@@ -635,31 +642,38 @@ this._connection.close(); | ||
} | ||
/** | ||
* Handle a frame received from the transport client. | ||
*/ /** | ||
*/ | ||
_handleFrame = (frame: Frame) => { | ||
const {streamId} = frame; | ||
if (streamId === CONNECTION_STREAM_ID) { | ||
this._handleConnectionFrame(frame); | ||
} else { | ||
this._handleStreamFrame(streamId, frame); | ||
} | ||
}; | ||
/** | ||
* Handle connection frames (stream id === 0). | ||
*/ _handleConnectionFrame(frame) { | ||
*/ | ||
_handleConnectionFrame(frame: Frame): void { | ||
switch (frame.type) { | ||
case _RSocketFrame.FRAME_TYPES.ERROR: | ||
const error = (0, _RSocketFrame.createErrorFromFrame)(frame); | ||
case FRAME_TYPES.ERROR: | ||
const error = createErrorFromFrame(frame); | ||
this._handleConnectionError(error); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.EXT: | ||
case FRAME_TYPES.EXT: | ||
// Extensions are not supported | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.KEEPALIVE: | ||
case FRAME_TYPES.KEEPALIVE: | ||
this._keepAliveLastReceivedMillis = Date.now(); | ||
if ((0, _RSocketFrame.isRespond)(frame.flags)) { | ||
this._connection.sendOne( | ||
_objectSpread( | ||
_objectSpread({}, frame), | ||
{}, | ||
{ | ||
flags: frame.flags ^ _RSocketFrame.FLAGS.RESPOND, // eslint-disable-line no-bitwise | ||
lastReceivedPosition: 0, | ||
} | ||
) | ||
); | ||
if (isRespond(frame.flags)) { | ||
this._connection.sendOne({ | ||
...frame, | ||
flags: frame.flags ^ FLAGS.RESPOND, // eslint-disable-line no-bitwise | ||
lastReceivedPosition: 0, | ||
}); | ||
} | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.LEASE: | ||
case FRAME_TYPES.LEASE: | ||
const r = this._requesterLeaseHandler; | ||
@@ -670,24 +684,24 @@ if (r) { | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.METADATA_PUSH: | ||
case FRAME_TYPES.METADATA_PUSH: | ||
this._handleMetadataPush(frame); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_FNF: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE: | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_STREAM: | ||
case FRAME_TYPES.REQUEST_CHANNEL: | ||
case FRAME_TYPES.REQUEST_FNF: | ||
case FRAME_TYPES.REQUEST_RESPONSE: | ||
case FRAME_TYPES.REQUEST_STREAM: | ||
// TODO #18064706: handle requests from server | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.RESERVED: | ||
case FRAME_TYPES.RESERVED: | ||
// No-op | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.RESUME: | ||
case _RSocketFrame.FRAME_TYPES.RESUME_OK: | ||
case FRAME_TYPES.RESUME: | ||
case FRAME_TYPES.RESUME_OK: | ||
// TODO #18065016: support resumption | ||
break; | ||
default: | ||
if (false) { | ||
if (__DEV__) { | ||
console.log( | ||
'RSocketClient: Unsupported frame type `%s` on stream `%s`.', | ||
(0, _RSocketFrame.getFrameTypeName)(frame.type), | ||
_RSocketFrame.CONNECTION_STREAM_ID | ||
getFrameTypeName(frame.type), | ||
CONNECTION_STREAM_ID, | ||
); | ||
@@ -702,7 +716,7 @@ } | ||
*/ | ||
_handleStreamFrame(streamId, frame) { | ||
_handleStreamFrame(streamId: number, frame: Frame): void { | ||
if (this._isRequest(frame.type)) { | ||
const leaseError = this._useLeaseOrError(this._responderLeaseHandler); | ||
if (leaseError) { | ||
this._sendStreamError(streamId, leaseError); | ||
this._sendStreamError(streamId, new Error(leaseError)); | ||
return; | ||
@@ -712,28 +726,28 @@ } | ||
switch (frame.type) { | ||
case _RSocketFrame.FRAME_TYPES.CANCEL: | ||
case FRAME_TYPES.CANCEL: | ||
this._handleCancel(streamId, frame); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_N: | ||
case FRAME_TYPES.REQUEST_N: | ||
this._handleRequestN(streamId, frame); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_FNF: | ||
case FRAME_TYPES.REQUEST_FNF: | ||
this._handleFireAndForget(streamId, frame); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_RESPONSE: | ||
case FRAME_TYPES.REQUEST_RESPONSE: | ||
this._handleRequestResponse(streamId, frame); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_STREAM: | ||
case FRAME_TYPES.REQUEST_STREAM: | ||
this._handleRequestStream(streamId, frame); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.REQUEST_CHANNEL: | ||
case FRAME_TYPES.REQUEST_CHANNEL: | ||
this._handleRequestChannel(streamId, frame); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.ERROR: | ||
const error = (0, _RSocketFrame.createErrorFromFrame)(frame); | ||
case FRAME_TYPES.ERROR: | ||
const error = createErrorFromFrame(frame); | ||
this._handleStreamError(streamId, error); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.PAYLOAD: | ||
case FRAME_TYPES.PAYLOAD: | ||
const receiver = this._receivers.get(streamId); | ||
if (receiver != null) { | ||
if ((0, _RSocketFrame.isNext)(frame.flags)) { | ||
if (isNext(frame.flags)) { | ||
const payload = { | ||
@@ -743,6 +757,5 @@ data: this._serializers.data.deserialize(frame.data), | ||
}; | ||
receiver.onNext(payload); | ||
} | ||
if ((0, _RSocketFrame.isComplete)(frame.flags)) { | ||
if (isComplete(frame.flags)) { | ||
this._receivers.delete(streamId); | ||
@@ -754,7 +767,7 @@ receiver.onComplete(); | ||
default: | ||
if (false) { | ||
if (__DEV__) { | ||
console.log( | ||
'RSocketClient: Unsupported frame type `%s` on stream `%s`.', | ||
(0, _RSocketFrame.getFrameTypeName)(frame.type), | ||
streamId | ||
getFrameTypeName(frame.type), | ||
streamId, | ||
); | ||
@@ -766,3 +779,3 @@ } | ||
_handleCancel(streamId, frame) { | ||
_handleCancel(streamId: number, frame: CancelFrame): void { | ||
const subscription = this._subscriptions.get(streamId); | ||
@@ -775,3 +788,3 @@ if (subscription) { | ||
_handleRequestN(streamId, frame) { | ||
_handleRequestN(streamId: number, frame: RequestNFrame): void { | ||
const subscription = this._subscriptions.get(streamId); | ||
@@ -783,3 +796,3 @@ if (subscription) { | ||
_handleFireAndForget(streamId, frame) { | ||
_handleFireAndForget(streamId: number, frame: RequestFnfFrame): void { | ||
const payload = this._deserializePayload(frame); | ||
@@ -789,10 +802,10 @@ this._requestHandler.fireAndForget(payload); | ||
_handleRequestResponse(streamId, frame) { | ||
_handleRequestResponse(streamId: number, frame: RequestResponseFrame): void { | ||
const payload = this._deserializePayload(frame); | ||
this._requestHandler.requestResponse(payload).subscribe({ | ||
onComplete: (payload) => { | ||
onComplete: payload => { | ||
this._sendStreamPayload(streamId, payload, true); | ||
}, | ||
onError: (error) => this._sendStreamError(streamId, error.message), | ||
onSubscribe: (cancel) => { | ||
onError: error => this._sendStreamError(streamId, error), | ||
onSubscribe: cancel => { | ||
const subscription = { | ||
@@ -802,3 +815,2 @@ cancel, | ||
}; | ||
this._subscriptions.set(streamId, subscription); | ||
@@ -809,9 +821,9 @@ }, | ||
_handleRequestStream(streamId, frame) { | ||
_handleRequestStream(streamId: number, frame: RequestStreamFrame): void { | ||
const payload = this._deserializePayload(frame); | ||
this._requestHandler.requestStream(payload).subscribe({ | ||
onComplete: () => this._sendStreamComplete(streamId), | ||
onError: (error) => this._sendStreamError(streamId, error.message), | ||
onNext: (payload) => this._sendStreamPayload(streamId, payload), | ||
onSubscribe: (subscription) => { | ||
onError: error => this._sendStreamError(streamId, error), | ||
onNext: payload => this._sendStreamPayload(streamId, payload), | ||
onSubscribe: subscription => { | ||
this._subscriptions.set(streamId, subscription); | ||
@@ -823,3 +835,3 @@ subscription.request(frame.requestN); | ||
_handleRequestChannel(streamId, frame) { | ||
_handleRequestChannel(streamId: number, frame: RequestChannelFrame): void { | ||
const existingSubscription = this._subscriptions.get(streamId); | ||
@@ -831,3 +843,3 @@ if (existingSubscription) { | ||
const payloads = new _rsocketFlowable.Flowable((subscriber) => { | ||
const payloads = new Flowable(subscriber => { | ||
let firstRequest = true; | ||
@@ -841,10 +853,9 @@ | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.CANCEL, | ||
type: FRAME_TYPES.CANCEL, | ||
}; | ||
this._connection.sendOne(cancelFrame); | ||
}, | ||
request: (n) => { | ||
if (n > _RSocketFrame.MAX_REQUEST_N) { | ||
n = _RSocketFrame.MAX_REQUEST_N; | ||
request: n => { | ||
if (n > MAX_REQUEST_N) { | ||
n = MAX_REQUEST_N; | ||
} | ||
@@ -860,5 +871,4 @@ if (firstRequest) { | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.REQUEST_N, | ||
type: FRAME_TYPES.REQUEST_N, | ||
}; | ||
this._connection.sendOne(requestNFrame); | ||
@@ -874,8 +884,6 @@ } | ||
}); | ||
}, _RSocketFrame.MAX_REQUEST_N); | ||
const framesToPayloads = new _rsocketFlowable.FlowableProcessor( | ||
payloads, | ||
(frame) => this._deserializePayload(frame) | ||
}, MAX_REQUEST_N); | ||
const framesToPayloads = new FlowableProcessor(payloads, frame => | ||
this._deserializePayload(frame), | ||
); | ||
this._receivers.set(streamId, framesToPayloads); | ||
@@ -885,5 +893,5 @@ | ||
onComplete: () => this._sendStreamComplete(streamId), | ||
onError: (error) => this._sendStreamError(streamId, error.message), | ||
onNext: (payload) => this._sendStreamPayload(streamId, payload), | ||
onSubscribe: (subscription) => { | ||
onError: error => this._sendStreamError(streamId, error), | ||
onNext: payload => this._sendStreamPayload(streamId, payload), | ||
onSubscribe: subscription => { | ||
this._subscriptions.set(streamId, subscription); | ||
@@ -895,43 +903,54 @@ subscription.request(frame.requestN); | ||
_handleMetadataPush(frame) { | ||
_handleMetadataPush(frame: MetadataPushFrame): void { | ||
const payload = this._deserializeMetadataPushPayload(frame); | ||
this._requestHandler.metadataPush(payload).subscribe({ | ||
onComplete: () => {}, | ||
onError: (error) => {}, | ||
onSubscribe: (cancel) => {}, | ||
onError: error => {}, | ||
onSubscribe: cancel => {}, | ||
}); | ||
} | ||
_sendStreamComplete(streamId) { | ||
_sendStreamComplete(streamId: number): void { | ||
this._subscriptions.delete(streamId); | ||
this._connection.sendOne({ | ||
data: null, | ||
flags: _RSocketFrame.FLAGS.COMPLETE, | ||
flags: FLAGS.COMPLETE, | ||
metadata: null, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.PAYLOAD, | ||
type: FRAME_TYPES.PAYLOAD, | ||
}); | ||
} | ||
_sendStreamError(streamId, errorMessage) { | ||
_sendStreamError(streamId: number, err: Error): void { | ||
this._subscriptions.delete(streamId); | ||
this._connection.sendOne({ | ||
code: _RSocketFrame.ERROR_CODES.APPLICATION_ERROR, | ||
code: | ||
err instanceof RSocketError | ||
? err.errorCode | ||
: ERROR_CODES.APPLICATION_ERROR, | ||
flags: 0, | ||
message: errorMessage, | ||
message: err.message, | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.ERROR, | ||
type: FRAME_TYPES.ERROR, | ||
}); | ||
const error = new Error(`terminated from the requester: ${errorMessage}`); | ||
const error = new Error(`terminated from the requester: ${err.message}`); | ||
this._handleStreamError(streamId, error); | ||
} | ||
_sendStreamPayload(streamId, payload, complete = false) { | ||
let flags = _RSocketFrame.FLAGS.NEXT; | ||
_sendStreamPayload( | ||
streamId: number, | ||
payload: Payload<D, M>, | ||
complete?: boolean = false, | ||
): void { | ||
let flags = FLAGS.NEXT; | ||
if (complete) { | ||
// eslint-disable-next-line no-bitwise | ||
flags |= _RSocketFrame.FLAGS.COMPLETE; | ||
flags |= FLAGS.COMPLETE; | ||
this._subscriptions.delete(streamId); | ||
} | ||
if (payload.metadata !== undefined && | ||
payload.metadata !== null) { | ||
// eslint-disable-next-line no-bitwise | ||
flags |= FLAGS.METADATA; | ||
} | ||
const data = this._serializers.data.serialize(payload.data); | ||
@@ -944,11 +963,11 @@ const metadata = this._serializers.metadata.serialize(payload.metadata); | ||
streamId, | ||
type: _RSocketFrame.FRAME_TYPES.PAYLOAD, | ||
type: FRAME_TYPES.PAYLOAD, | ||
}); | ||
} | ||
_deserializePayload(frame) { | ||
_deserializePayload(frame: FrameWithData): Payload<D, M> { | ||
return deserializePayload(this._serializers, frame); | ||
} | ||
_deserializeMetadataPushPayload(frame) { | ||
_deserializeMetadataPushPayload(frame: MetadataPushFrame): Payload<D, M> { | ||
return deserializeMetadataPushPayload(this._serializers, frame); | ||
@@ -960,3 +979,3 @@ } | ||
*/ | ||
_handleStreamError(streamId, error) { | ||
_handleStreamError(streamId: number, error: Error): void { | ||
const receiver = this._receivers.get(streamId); | ||
@@ -970,3 +989,6 @@ if (receiver != null) { | ||
function deserializePayload(serializers, frame) { | ||
function deserializePayload<D, M>( | ||
serializers: PayloadSerializers<D, M>, | ||
frame: FrameWithData, | ||
): Payload<D, M> { | ||
return { | ||
@@ -978,3 +1000,6 @@ data: serializers.data.deserialize(frame.data), | ||
function deserializeMetadataPushPayload(serializers, frame) { | ||
function deserializeMetadataPushPayload<D, M>( | ||
serializers: PayloadSerializers<D, M>, | ||
frame: MetadataPushFrame, | ||
): Payload<D, M> { | ||
return { | ||
@@ -981,0 +1006,0 @@ data: null, |
@@ -15,65 +15,34 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.default = void 0; | ||
var _rsocketFlowable = require('rsocket-flowable'); | ||
var _Invariant = _interopRequireDefault(require('./Invariant')); | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
import type { | ||
ConnectionStatus, | ||
DuplexConnection, | ||
Frame, | ||
SetupFrame, | ||
} from 'rsocket-types'; | ||
import type {ISubject, ISubscription} from 'rsocket-types'; | ||
var _rsocketTypes = require('rsocket-types'); | ||
import {Flowable} from 'rsocket-flowable'; | ||
import invariant from './Invariant'; | ||
import { | ||
createErrorFromFrame, | ||
isResumePositionFrameType, | ||
CONNECTION_STREAM_ID, | ||
FLAGS, | ||
FRAME_TYPES, | ||
} from './RSocketFrame'; | ||
import {CONNECTION_STATUS} from 'rsocket-types'; | ||
import type {Encodable} from 'rsocket-types'; | ||
import {sizeOfFrame} from './RSocketBinaryFraming'; | ||
import type {Encoders} from './RSocketEncoding'; | ||
var _RSocketBinaryFraming = require('./RSocketBinaryFraming'); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object); | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object); | ||
if (enumerableOnly) | ||
symbols = symbols.filter(function (sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable; | ||
}); | ||
keys.push.apply(keys, symbols); | ||
} | ||
return keys; | ||
} | ||
function _objectSpread(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {}; | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function (key) { | ||
_defineProperty(target, key, source[key]); | ||
}); | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); | ||
} else { | ||
ownKeys(Object(source)).forEach(function (key) { | ||
Object.defineProperty( | ||
target, | ||
key, | ||
Object.getOwnPropertyDescriptor(source, key) | ||
); | ||
}); | ||
} | ||
} | ||
return target; | ||
} | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
export type Options = {| | ||
bufferSize: number, | ||
resumeToken: Encodable, | ||
sessionDurationSeconds: number, | ||
|}; | ||
@@ -137,10 +106,34 @@ /** | ||
*/ | ||
class RSocketResumableTransport { | ||
constructor(source, options, encoders) { | ||
(0, _Invariant.default)( | ||
export default class RSocketResumableTransport implements DuplexConnection { | ||
_encoders: ?Encoders<*>; | ||
_bufferSize: number; | ||
_sentFramesSize: number; | ||
_position: { | ||
client: number, // earliest client frame still buffered | ||
server: number, // latest server frame received | ||
}; | ||
_currentConnection: ?DuplexConnection; | ||
_statusSubscription: ?ISubscription; | ||
_receiveSubscription: ?ISubscription; | ||
_receivers: Set<ISubject<Frame>>; | ||
_resumeToken: Encodable; | ||
_sessionTimeoutMillis: number; | ||
_sessionTimeoutHandle: ?TimeoutID; | ||
_senders: Set<ISubscription>; | ||
_sentFrames: Array<Frame>; | ||
_setupFrame: ?SetupFrame; | ||
_source: () => DuplexConnection; | ||
_status: ConnectionStatus; | ||
_statusSubscribers: Set<ISubject<ConnectionStatus>>; | ||
constructor( | ||
source: () => DuplexConnection, | ||
options: Options, | ||
encoders: ?Encoders<*>, | ||
) { | ||
invariant( | ||
options.bufferSize >= 0, | ||
'RSocketResumableTransport: bufferSize option must be >= 0, got `%s`.', | ||
options.bufferSize | ||
options.bufferSize, | ||
); | ||
this._encoders = encoders; | ||
@@ -153,3 +146,2 @@ this._bufferSize = options.bufferSize; | ||
}; | ||
this._currentConnection = null; | ||
@@ -166,18 +158,17 @@ this._statusSubscription = null; | ||
this._source = source; | ||
this._status = _rsocketTypes.CONNECTION_STATUS.NOT_CONNECTED; | ||
this._status = CONNECTION_STATUS.NOT_CONNECTED; | ||
this._statusSubscribers = new Set(); | ||
} | ||
close() { | ||
close(): void { | ||
this._close(); | ||
} | ||
connect() { | ||
(0, _Invariant.default)( | ||
connect(): void { | ||
invariant( | ||
!this._isTerminated(), | ||
'RSocketResumableTransport: Cannot connect(), connection terminated (%s: %s).', | ||
this._status.kind, | ||
this._status.kind === 'ERROR' ? this._status.error.message : 'no message' | ||
this._status.kind === 'ERROR' ? this._status.error.message : 'no message', | ||
); | ||
try { | ||
@@ -188,6 +179,6 @@ this._disconnect(); | ||
this._statusSubscription = null; | ||
this._setConnectionStatus(_rsocketTypes.CONNECTION_STATUS.CONNECTING); | ||
this._setConnectionStatus(CONNECTION_STATUS.CONNECTING); | ||
const connection = this._source(); | ||
connection.connectionStatus().subscribe({ | ||
onNext: (status) => { | ||
onNext: status => { | ||
if (status.kind === this._status.kind) { | ||
@@ -212,12 +203,10 @@ return; | ||
() => this._close(this._resumeTimeoutError()), | ||
this._sessionTimeoutMillis | ||
this._sessionTimeoutMillis, | ||
); | ||
} | ||
this._disconnect(); | ||
this._setConnectionStatus( | ||
_rsocketTypes.CONNECTION_STATUS.NOT_CONNECTED | ||
); | ||
this._setConnectionStatus(CONNECTION_STATUS.NOT_CONNECTED); | ||
} | ||
}, | ||
onSubscribe: (subscription) => { | ||
onSubscribe: subscription => { | ||
this._statusSubscription = subscription; | ||
@@ -227,3 +216,2 @@ subscription.request(Number.MAX_SAFE_INTEGER); | ||
}); | ||
connection.connect(); | ||
@@ -235,4 +223,4 @@ } catch (error) { | ||
connectionStatus() { | ||
return new _rsocketFlowable.Flowable((subscriber) => { | ||
connectionStatus(): Flowable<ConnectionStatus> { | ||
return new Flowable(subscriber => { | ||
subscriber.onSubscribe({ | ||
@@ -250,4 +238,4 @@ cancel: () => { | ||
receive() { | ||
return new _rsocketFlowable.Flowable((subject) => { | ||
receive(): Flowable<Frame> { | ||
return new Flowable(subject => { | ||
let added = false; | ||
@@ -268,3 +256,3 @@ subject.onSubscribe({ | ||
sendOne(frame) { | ||
sendOne(frame: Frame): void { | ||
try { | ||
@@ -277,3 +265,3 @@ this._writeFrame(frame); | ||
send(frames) { | ||
send(frames: Flowable<Frame>): void { | ||
let subscription; | ||
@@ -284,8 +272,8 @@ frames.subscribe({ | ||
}, | ||
onError: (error) => { | ||
onError: error => { | ||
subscription && this._senders.delete(subscription); | ||
this._close(error); | ||
}, | ||
onNext: (frame) => this._writeFrame(frame), | ||
onSubscribe: (_subscription) => { | ||
onNext: frame => this._writeFrame(frame), | ||
onSubscribe: _subscription => { | ||
subscription = _subscription; | ||
@@ -298,3 +286,3 @@ this._senders.add(subscription); | ||
_close(error) { | ||
_close(error?: Error): void { | ||
if (this._isTerminated()) { | ||
@@ -306,10 +294,10 @@ return; | ||
} else { | ||
this._setConnectionStatus(_rsocketTypes.CONNECTION_STATUS.CLOSED); | ||
this._setConnectionStatus(CONNECTION_STATUS.CLOSED); | ||
} | ||
const receivers = this._receivers; | ||
receivers.forEach((r) => r.onComplete()); | ||
receivers.forEach(r => r.onComplete()); | ||
receivers.clear(); | ||
const senders = this._senders; | ||
senders.forEach((s) => s.cancel()); | ||
senders.forEach(s => s.cancel()); | ||
senders.clear(); | ||
@@ -321,3 +309,3 @@ this._sentFrames.length = 0; | ||
_disconnect() { | ||
_disconnect(): void { | ||
if (this._statusSubscription) { | ||
@@ -337,8 +325,8 @@ this._statusSubscription.cancel(); | ||
_handleConnected(connection) { | ||
_handleConnected(connection: DuplexConnection): void { | ||
this._currentConnection = connection; | ||
this._flushFrames(); | ||
this._setConnectionStatus(_rsocketTypes.CONNECTION_STATUS.CONNECTED); | ||
this._setConnectionStatus(CONNECTION_STATUS.CONNECTED); | ||
connection.receive().subscribe({ | ||
onNext: (frame) => { | ||
onNext: frame => { | ||
try { | ||
@@ -350,3 +338,3 @@ this._receiveFrame(frame); | ||
}, | ||
onSubscribe: (subscription) => { | ||
onSubscribe: subscription => { | ||
this._receiveSubscription = subscription; | ||
@@ -358,3 +346,3 @@ subscription.request(Number.MAX_SAFE_INTEGER); | ||
_handleResume(connection) { | ||
_handleResume(connection: DuplexConnection): void { | ||
connection | ||
@@ -364,5 +352,5 @@ .receive() | ||
.subscribe({ | ||
onNext: (frame) => { | ||
onNext: frame => { | ||
try { | ||
if (frame.type === _RSocketFrame.FRAME_TYPES.RESUME_OK) { | ||
if (frame.type === FRAME_TYPES.RESUME_OK) { | ||
const {clientPosition} = frame; | ||
@@ -383,5 +371,4 @@ // clientPosition indicates which frames the server is missing: | ||
const frameSize = this._onReleasedTailFrame( | ||
this._sentFrames[index] | ||
this._sentFrames[index], | ||
); | ||
if (!frameSize) { | ||
@@ -406,9 +393,8 @@ this._close(this._absentLengthError(frame)); | ||
const error = | ||
frame.type === _RSocketFrame.FRAME_TYPES.ERROR | ||
? (0, _RSocketFrame.createErrorFromFrame)(frame) | ||
frame.type === FRAME_TYPES.ERROR | ||
? createErrorFromFrame(frame) | ||
: new Error( | ||
'RSocketResumableTransport: Resumption failed for an ' + | ||
'unspecified reason.' | ||
'unspecified reason.', | ||
); | ||
this._close(error); | ||
@@ -420,3 +406,3 @@ } | ||
}, | ||
onSubscribe: (subscription) => { | ||
onSubscribe: subscription => { | ||
this._receiveSubscription = subscription; | ||
@@ -426,9 +412,7 @@ subscription.request(1); | ||
}); | ||
const setupFrame = this._setupFrame; | ||
(0, _Invariant.default)( | ||
invariant( | ||
setupFrame, | ||
'RSocketResumableTransport: Cannot resume, setup frame has not been sent.' | ||
'RSocketResumableTransport: Cannot resume, setup frame has not been sent.', | ||
); | ||
connection.sendOne({ | ||
@@ -441,10 +425,10 @@ clientPosition: this._position.client, | ||
serverPosition: this._position.server, | ||
streamId: _RSocketFrame.CONNECTION_STREAM_ID, | ||
type: _RSocketFrame.FRAME_TYPES.RESUME, | ||
streamId: CONNECTION_STREAM_ID, | ||
type: FRAME_TYPES.RESUME, | ||
}); | ||
} | ||
_absentLengthError(frame) { | ||
_absentLengthError(frame: Frame) { | ||
return new Error( | ||
'RSocketResumableTransport: absent frame.length for type ' + frame.type | ||
'RSocketResumableTransport: absent frame.length for type ' + frame.type, | ||
); | ||
@@ -455,3 +439,3 @@ } | ||
return new Error( | ||
'RSocketResumableTransport: local frames are inconsistent with remote implied position' | ||
'RSocketResumableTransport: local frames are inconsistent with remote implied position', | ||
); | ||
@@ -463,3 +447,3 @@ } | ||
'RSocketResumableTransport: resumption failed, server is ' + | ||
'missing frames that are no longer in the client buffer.' | ||
'missing frames that are no longer in the client buffer.', | ||
); | ||
@@ -472,7 +456,7 @@ } | ||
_isTerminated() { | ||
_isTerminated(): boolean { | ||
return this._isTerminationStatus(this._status); | ||
} | ||
_isTerminationStatus(status) { | ||
_isTerminationStatus(status: ConnectionStatus): boolean { | ||
const kind = status.kind; | ||
@@ -482,3 +466,3 @@ return kind === 'CLOSED' || kind === 'ERROR'; | ||
_setConnectionStatus(status) { | ||
_setConnectionStatus(status: ConnectionStatus): void { | ||
if (status.kind === this._status.kind) { | ||
@@ -488,7 +472,7 @@ return; | ||
this._status = status; | ||
this._statusSubscribers.forEach((subscriber) => subscriber.onNext(status)); | ||
this._statusSubscribers.forEach(subscriber => subscriber.onNext(status)); | ||
} | ||
_receiveFrame(frame) { | ||
if ((0, _RSocketFrame.isResumePositionFrameType)(frame.type)) { | ||
_receiveFrame(frame: Frame): void { | ||
if (isResumePositionFrameType(frame.type)) { | ||
if (frame.length) { | ||
@@ -499,7 +483,7 @@ this._position.server += frame.length; | ||
// TODO: trim _sentFrames on KEEPALIVE frame | ||
this._receivers.forEach((subscriber) => subscriber.onNext(frame)); | ||
this._receivers.forEach(subscriber => subscriber.onNext(frame)); | ||
} | ||
_flushFrames() { | ||
this._sentFrames.forEach((frame) => { | ||
_flushFrames(): void { | ||
this._sentFrames.forEach(frame => { | ||
const connection = this._currentConnection; | ||
@@ -512,3 +496,3 @@ if (connection) { | ||
_onReleasedTailFrame(frame) { | ||
_onReleasedTailFrame(frame: Frame): ?number { | ||
const removedFrameSize = frame.length; | ||
@@ -522,24 +506,17 @@ if (removedFrameSize) { | ||
_writeFrame(frame) { | ||
_writeFrame(frame: Frame): void { | ||
// Ensure that SETUP frames contain the resume token | ||
if (frame.type === _RSocketFrame.FRAME_TYPES.SETUP) { | ||
frame = _objectSpread( | ||
_objectSpread({}, frame), | ||
{}, | ||
{ | ||
flags: frame.flags | _RSocketFrame.FLAGS.RESUME_ENABLE, // eslint-disable-line no-bitwise | ||
resumeToken: this._resumeToken, | ||
} | ||
); | ||
this._setupFrame = frame; // frame can only be a SetupFrame | ||
if (frame.type === FRAME_TYPES.SETUP) { | ||
frame = { | ||
...frame, | ||
flags: frame.flags | FLAGS.RESUME_ENABLE, // eslint-disable-line no-bitwise | ||
resumeToken: this._resumeToken, | ||
}; | ||
this._setupFrame = (frame: $FlowIssue); // frame can only be a SetupFrame | ||
} | ||
frame.length = (0, _RSocketBinaryFraming.sizeOfFrame)( | ||
frame, | ||
this._encoders | ||
); | ||
frame.length = sizeOfFrame(frame, this._encoders); | ||
// If connected, immediately write frames to the low-level transport | ||
// and consider them "sent". The resumption protocol will figure out | ||
// which frames may not have been received and recover. | ||
if ((0, _RSocketFrame.isResumePositionFrameType)(frame.type)) { | ||
if (isResumePositionFrameType(frame.type)) { | ||
let available = this._bufferSize - this._sentFramesSize; | ||
@@ -579,2 +556,1 @@ const frameSize = frame.length; | ||
} | ||
exports.default = RSocketResumableTransport; |
@@ -15,17 +15,28 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.IdentitySerializers = exports.IdentitySerializer = exports.JsonSerializers = exports.JsonSerializer = void 0; | ||
var _LiteBuffer = require('./LiteBuffer'); | ||
var _Invariant = _interopRequireDefault(require('./Invariant')); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
import type {Encodable} from 'rsocket-types'; | ||
import {LiteBuffer as Buffer} from './LiteBuffer'; | ||
import invariant from './Invariant'; | ||
/** | ||
* A Serializer transforms data between the application encoding used in | ||
* Payloads and the Encodable type accepted by the transport client. | ||
*/ | ||
export type Serializer<T> = {| | ||
deserialize: (data: ?Encodable) => ?T, | ||
serialize: (data: ?T) => ?Encodable, | ||
|}; | ||
export type PayloadSerializers<D, M> = {| | ||
data: Serializer<D>, | ||
metadata: Serializer<M>, | ||
|}; | ||
// JSON serializer | ||
const JsonSerializer = { | ||
deserialize: (data) => { | ||
export const JsonSerializer: Serializer<*> = { | ||
deserialize: data => { | ||
let str; | ||
@@ -36,7 +47,7 @@ if (data == null) { | ||
str = data; | ||
} else if (_LiteBuffer.LiteBuffer.isBuffer(data)) { | ||
const buffer = data; | ||
} else if (Buffer.isBuffer(data)) { | ||
const buffer: Buffer = data; | ||
str = buffer.toString('utf8'); | ||
} else { | ||
const buffer = _LiteBuffer.LiteBuffer.from(data); | ||
const buffer: Buffer = Buffer.from(data); | ||
str = buffer.toString('utf8'); | ||
@@ -48,5 +59,4 @@ } | ||
}; | ||
exports.JsonSerializer = JsonSerializer; | ||
const JsonSerializers = { | ||
export const JsonSerializers = { | ||
data: JsonSerializer, | ||
@@ -57,25 +67,21 @@ metadata: JsonSerializer, | ||
// Pass-through serializer | ||
exports.JsonSerializers = JsonSerializers; | ||
const IdentitySerializer = { | ||
deserialize: (data) => { | ||
(0, _Invariant.default)( | ||
export const IdentitySerializer: Serializer<Encodable> = { | ||
deserialize: data => { | ||
invariant( | ||
data == null || | ||
typeof data === 'string' || | ||
_LiteBuffer.LiteBuffer.isBuffer(data) || | ||
Buffer.isBuffer(data) || | ||
data instanceof Uint8Array, | ||
'RSocketSerialization: Expected data to be a string, Buffer, or ' + | ||
'Uint8Array. Got `%s`.', | ||
data | ||
data, | ||
); | ||
return data; | ||
}, | ||
serialize: (data) => data, | ||
serialize: data => data, | ||
}; | ||
exports.IdentitySerializer = IdentitySerializer; | ||
const IdentitySerializers = { | ||
export const IdentitySerializers = { | ||
data: IdentitySerializer, | ||
metadata: IdentitySerializer, | ||
}; | ||
exports.IdentitySerializers = IdentitySerializers; |
@@ -15,34 +15,51 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.default = void 0; | ||
var _rsocketFlowable = require('rsocket-flowable'); | ||
var _Invariant = _interopRequireDefault(require('./Invariant')); | ||
var _RSocketFrame = require('./RSocketFrame'); | ||
import type { | ||
DuplexConnection, | ||
Frame, | ||
FrameWithData, | ||
Payload, | ||
ReactiveSocket, | ||
PartialResponder, | ||
} from 'rsocket-types'; | ||
import type { | ||
ISubscription, | ||
ISubscriber, | ||
IPartialSubscriber, | ||
} from 'rsocket-types'; | ||
import type {PayloadSerializers} from './RSocketSerialization'; | ||
var _RSocketSerialization = require('./RSocketSerialization'); | ||
var _RSocketMachine = require('./RSocketMachine'); | ||
var _RSocketLease = require('./RSocketLease'); | ||
import {Flowable} from 'rsocket-flowable'; | ||
import invariant from './Invariant'; | ||
import { | ||
getFrameTypeName, | ||
CONNECTION_STREAM_ID, | ||
ERROR_CODES, | ||
FRAME_TYPES, | ||
FLAGS, | ||
} from './RSocketFrame'; | ||
import {IdentitySerializers} from './RSocketSerialization'; | ||
import {createServerMachine} from './RSocketMachine'; | ||
import {Leases} from './RSocketLease'; | ||
import {RequesterLeaseHandler, ResponderLeaseHandler} from './RSocketLease'; | ||
import {ReassemblyDuplexConnection} from './ReassemblyDuplexConnection'; | ||
var _ReassemblyDuplexConnection = require('./ReassemblyDuplexConnection'); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
export interface TransportServer { | ||
start(): Flowable<DuplexConnection>, | ||
stop(): void, | ||
} | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
export type ServerConfig<D, M> = {| | ||
getRequestHandler: ( | ||
socket: ReactiveSocket<D, M>, | ||
payload: Payload<D, M>, | ||
) => PartialResponder<D, M>, | ||
serializers?: PayloadSerializers<D, M>, | ||
transport: TransportServer, | ||
errorHandler?: (Error) => void, | ||
leases?: () => Leases<*>, | ||
|}; | ||
@@ -53,144 +70,9 @@ /** | ||
*/ | ||
class RSocketServer { | ||
constructor(config) { | ||
_defineProperty( | ||
this, | ||
'_handleTransportComplete', | ||
export default class RSocketServer<D, M> { | ||
_config: ServerConfig<D, M>; | ||
_connections: Set<ReactiveSocket<D, M>>; | ||
_started: boolean; | ||
_subscription: ?ISubscription; | ||
() => { | ||
this._handleTransportError( | ||
new Error('RSocketServer: Connection closed unexpectedly.') | ||
); | ||
} | ||
); | ||
_defineProperty( | ||
this, | ||
'_handleTransportError', | ||
(error) => { | ||
this._connections.forEach((connection) => { | ||
// TODO: Allow passing in error | ||
connection.close(); | ||
}); | ||
} | ||
); | ||
_defineProperty( | ||
this, | ||
'_handleTransportConnection', | ||
(connection) => { | ||
const swapper = new SubscriberSwapper(); | ||
let subscription; | ||
connection = new _ReassemblyDuplexConnection.ReassemblyDuplexConnection( | ||
connection | ||
); | ||
connection.receive().subscribe( | ||
swapper.swap({ | ||
onError: (error) => console.error(error), | ||
onNext: (frame) => { | ||
switch (frame.type) { | ||
case _RSocketFrame.FRAME_TYPES.RESUME: | ||
connection.sendOne({ | ||
code: _RSocketFrame.ERROR_CODES.REJECTED_RESUME, | ||
flags: 0, | ||
message: 'RSocketServer: RESUME not supported.', | ||
streamId: _RSocketFrame.CONNECTION_STREAM_ID, | ||
type: _RSocketFrame.FRAME_TYPES.ERROR, | ||
}); | ||
connection.close(); | ||
break; | ||
case _RSocketFrame.FRAME_TYPES.SETUP: | ||
if (this._setupLeaseError(frame)) { | ||
connection.sendOne({ | ||
code: _RSocketFrame.ERROR_CODES.INVALID_SETUP, | ||
flags: 0, | ||
message: 'RSocketServer: LEASE not supported.', | ||
streamId: _RSocketFrame.CONNECTION_STREAM_ID, | ||
type: _RSocketFrame.FRAME_TYPES.ERROR, | ||
}); | ||
connection.close(); | ||
break; | ||
} | ||
const serializers = this._getSerializers(); | ||
let requesterLeaseHandler; | ||
let responderLeaseHandler; | ||
const leasesSupplier = this._config.leases; | ||
if (leasesSupplier) { | ||
const lease = leasesSupplier(); | ||
requesterLeaseHandler = new _RSocketLease.RequesterLeaseHandler( | ||
lease._receiver | ||
); | ||
responderLeaseHandler = new _RSocketLease.ResponderLeaseHandler( | ||
lease._sender, | ||
lease._stats | ||
); | ||
} | ||
const serverMachine = (0, | ||
_RSocketMachine.createServerMachine)( | ||
connection, | ||
(subscriber) => { | ||
swapper.swap(subscriber); | ||
}, | ||
frame.lifetime, | ||
serializers, | ||
this._config.errorHandler, | ||
requesterLeaseHandler, | ||
responderLeaseHandler | ||
); | ||
try { | ||
const requestHandler = this._config.getRequestHandler( | ||
serverMachine, | ||
deserializePayload(serializers, frame) | ||
); | ||
serverMachine.setRequestHandler(requestHandler); | ||
this._connections.add(serverMachine); | ||
connection.connectionStatus().subscribe({ | ||
onNext: (status) => { | ||
if ( | ||
status.kind === 'CLOSED' || | ||
status.kind === 'ERROR' | ||
) { | ||
this._connections.delete(serverMachine); | ||
} | ||
}, | ||
onSubscribe: (subscription) => | ||
subscription.request(Number.MAX_SAFE_INTEGER), | ||
}); | ||
} catch (error) { | ||
connection.sendOne({ | ||
code: _RSocketFrame.ERROR_CODES.REJECTED_SETUP, | ||
flags: 0, | ||
message: | ||
'Application rejected setup, reason: ' + error.message, | ||
streamId: _RSocketFrame.CONNECTION_STREAM_ID, | ||
type: _RSocketFrame.FRAME_TYPES.ERROR, | ||
}); | ||
connection.close(); | ||
} | ||
break; | ||
default: | ||
(0, _Invariant.default)( | ||
false, | ||
'RSocketServer: Expected first frame to be SETUP or RESUME, ' + | ||
'got `%s`.', | ||
(0, _RSocketFrame.getFrameTypeName)(frame.type) | ||
); | ||
} | ||
}, | ||
onSubscribe: (_subscription) => { | ||
subscription = _subscription; | ||
subscription.request(1); | ||
}, | ||
}) | ||
); | ||
} | ||
); | ||
constructor(config: ServerConfig<D, M>) { | ||
this._config = config; | ||
@@ -201,6 +83,7 @@ this._connections = new Set(); | ||
} | ||
start() { | ||
(0, _Invariant.default)( | ||
start(): void { | ||
invariant( | ||
!this._started, | ||
'RSocketServer: Unexpected call to start(), already started.' | ||
'RSocketServer: Unexpected call to start(), already started.', | ||
); | ||
@@ -212,3 +95,3 @@ this._started = true; | ||
onNext: this._handleTransportConnection, | ||
onSubscribe: (subscription) => { | ||
onSubscribe: subscription => { | ||
this._subscription = subscription; | ||
@@ -219,3 +102,4 @@ subscription.request(Number.MAX_SAFE_INTEGER); | ||
} | ||
stop() { | ||
stop(): void { | ||
if (this._subscription) { | ||
@@ -226,15 +110,128 @@ this._subscription.cancel(); | ||
this._handleTransportError( | ||
new Error('RSocketServer: Connection terminated via stop().') | ||
new Error('RSocketServer: Connection terminated via stop().'), | ||
); | ||
} | ||
_getSerializers() { | ||
return ( | ||
this._config.serializers || _RSocketSerialization.IdentitySerializers | ||
_handleTransportComplete = (): void => { | ||
this._handleTransportError( | ||
new Error('RSocketServer: Connection closed unexpectedly.'), | ||
); | ||
}; | ||
_handleTransportError = (error: Error): void => { | ||
this._connections.forEach(connection => { | ||
// TODO: Allow passing in error | ||
connection.close(); | ||
}); | ||
}; | ||
_handleTransportConnection = (connection: DuplexConnection): void => { | ||
const swapper: SubscriberSwapper<Frame> = new SubscriberSwapper(); | ||
let subscription; | ||
connection = new ReassemblyDuplexConnection(connection); | ||
connection.receive().subscribe( | ||
swapper.swap({ | ||
onError: error => console.error(error), | ||
onNext: frame => { | ||
switch (frame.type) { | ||
case FRAME_TYPES.RESUME: | ||
connection.sendOne({ | ||
code: ERROR_CODES.REJECTED_RESUME, | ||
flags: 0, | ||
message: 'RSocketServer: RESUME not supported.', | ||
streamId: CONNECTION_STREAM_ID, | ||
type: FRAME_TYPES.ERROR, | ||
}); | ||
connection.close(); | ||
break; | ||
case FRAME_TYPES.SETUP: | ||
if (this._setupLeaseError(frame)) { | ||
connection.sendOne({ | ||
code: ERROR_CODES.INVALID_SETUP, | ||
flags: 0, | ||
message: 'RSocketServer: LEASE not supported.', | ||
streamId: CONNECTION_STREAM_ID, | ||
type: FRAME_TYPES.ERROR, | ||
}); | ||
connection.close(); | ||
break; | ||
} | ||
const serializers = this._getSerializers(); | ||
let requesterLeaseHandler: RequesterLeaseHandler; | ||
let responderLeaseHandler: ResponderLeaseHandler; | ||
const leasesSupplier = this._config.leases; | ||
if (leasesSupplier) { | ||
const lease = leasesSupplier(); | ||
requesterLeaseHandler = new RequesterLeaseHandler( | ||
(lease: any)._receiver, | ||
); | ||
responderLeaseHandler = new ResponderLeaseHandler( | ||
(lease: any)._sender, | ||
(lease: any)._stats, | ||
); | ||
} | ||
const serverMachine = createServerMachine( | ||
connection, | ||
subscriber => { | ||
swapper.swap(subscriber); | ||
}, | ||
frame.lifetime, | ||
serializers, | ||
this._config.errorHandler, | ||
requesterLeaseHandler, | ||
responderLeaseHandler, | ||
); | ||
try { | ||
const requestHandler = this._config.getRequestHandler( | ||
serverMachine, | ||
deserializePayload(serializers, frame), | ||
); | ||
serverMachine.setRequestHandler(requestHandler); | ||
this._connections.add(serverMachine); | ||
connection.connectionStatus().subscribe({ | ||
onNext: status => { | ||
if (status.kind === 'CLOSED' || status.kind === 'ERROR') { | ||
this._connections.delete(serverMachine); | ||
} | ||
}, | ||
onSubscribe: subscription => | ||
subscription.request(Number.MAX_SAFE_INTEGER), | ||
}); | ||
} catch (error) { | ||
connection.sendOne({ | ||
code: ERROR_CODES.REJECTED_SETUP, | ||
flags: 0, | ||
message: | ||
'Application rejected setup, reason: ' + error.message, | ||
streamId: CONNECTION_STREAM_ID, | ||
type: FRAME_TYPES.ERROR, | ||
}); | ||
connection.close(); | ||
} | ||
break; | ||
default: | ||
invariant( | ||
false, | ||
'RSocketServer: Expected first frame to be SETUP or RESUME, ' + | ||
'got `%s`.', | ||
getFrameTypeName(frame.type), | ||
); | ||
} | ||
}, | ||
onSubscribe: _subscription => { | ||
subscription = _subscription; | ||
subscription.request(1); | ||
}, | ||
}), | ||
); | ||
}; | ||
_getSerializers(): PayloadSerializers<D, M> { | ||
return this._config.serializers || (IdentitySerializers: any); | ||
} | ||
_setupLeaseError(frame) { | ||
const clientLeaseEnabled = | ||
(frame.flags & _RSocketFrame.FLAGS.LEASE) === _RSocketFrame.FLAGS.LEASE; | ||
_setupLeaseError(frame: Frame): boolean { | ||
const clientLeaseEnabled = (frame.flags & FLAGS.LEASE) === FLAGS.LEASE; | ||
const serverLeaseEnabled = this._config.leases; | ||
@@ -244,10 +241,12 @@ return clientLeaseEnabled && !serverLeaseEnabled; | ||
} | ||
exports.default = RSocketServer; | ||
class SubscriberSwapper { | ||
constructor(target) { | ||
class SubscriberSwapper<T> implements ISubscriber<T> { | ||
_target: ?IPartialSubscriber<T>; | ||
_subscription: ?ISubscription; | ||
constructor(target?: IPartialSubscriber<T>) { | ||
this._target = target; | ||
} | ||
swap(next) { | ||
swap(next: IPartialSubscriber<T>): ISubscriber<T> { | ||
this._target = next; | ||
@@ -261,15 +260,15 @@ if (this._subscription) { | ||
onComplete() { | ||
(0, _Invariant.default)(this._target, 'must have target'); | ||
invariant(this._target, 'must have target'); | ||
this._target.onComplete && this._target.onComplete(); | ||
} | ||
onError(error) { | ||
(0, _Invariant.default)(this._target, 'must have target'); | ||
invariant(this._target, 'must have target'); | ||
this._target.onError && this._target.onError(error); | ||
} | ||
onNext(value) { | ||
(0, _Invariant.default)(this._target, 'must have target'); | ||
onNext(value: T) { | ||
invariant(this._target, 'must have target'); | ||
this._target.onNext && this._target.onNext(value); | ||
} | ||
onSubscribe(subscription) { | ||
(0, _Invariant.default)(this._target, 'must have target'); | ||
onSubscribe(subscription: ISubscription) { | ||
invariant(this._target, 'must have target'); | ||
this._subscription = subscription; | ||
@@ -280,3 +279,6 @@ this._target.onSubscribe && this._target.onSubscribe(subscription); | ||
function deserializePayload(serializers, frame) { | ||
function deserializePayload<D, M>( | ||
serializers: PayloadSerializers<D, M>, | ||
frame: FrameWithData, | ||
): Payload<D, M> { | ||
return { | ||
@@ -283,0 +285,0 @@ data: serializers.data.deserialize(frame.data), |
@@ -15,12 +15,8 @@ /** Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* | ||
* @flow | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.MINOR_VERSION = exports.MAJOR_VERSION = void 0; | ||
const MAJOR_VERSION = 1; | ||
exports.MAJOR_VERSION = MAJOR_VERSION; | ||
const MINOR_VERSION = 0; | ||
exports.MINOR_VERSION = MINOR_VERSION; | ||
export const MAJOR_VERSION = 1; | ||
export const MINOR_VERSION = 0; |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.TYPES_BY_AUTH_STRING = exports.TYPES_BY_AUTH_ID = exports.BEARER = exports.SIMPLE = exports.UNKNOWN_RESERVED_AUTH_TYPE = exports.UNPARSEABLE_AUTH_TYPE = exports.default = void 0; | ||
// @flow | ||
class WellKnownAuthType { | ||
constructor(str, identifier) { | ||
export default class WellKnownAuthType { | ||
_identifier: number; | ||
_string: string; | ||
constructor(str: string, identifier: number) { | ||
this._string = str; | ||
@@ -25,3 +27,3 @@ this._identifier = identifier; | ||
*/ | ||
static fromIdentifier(id) { | ||
static fromIdentifier(id: number): WellKnownAuthType { | ||
if (id < 0x00 || id > 0x7f) { | ||
@@ -42,3 +44,3 @@ return UNPARSEABLE_AUTH_TYPE; | ||
*/ | ||
static fromString(authTypeString) { | ||
static fromString(authTypeString: string): WellKnownAuthType { | ||
if (!authTypeString) { | ||
@@ -57,3 +59,3 @@ throw new Error('type must be non-null'); | ||
/** @return the byte identifier of the mime type, guaranteed to be positive or zero. */ | ||
get identifier() { | ||
get identifier(): number { | ||
return this._identifier; | ||
@@ -66,3 +68,3 @@ } | ||
*/ | ||
get string() { | ||
get string(): string { | ||
return this._string; | ||
@@ -72,31 +74,23 @@ } | ||
/** @see #string() */ | ||
toString() { | ||
toString(): string { | ||
return this._string; | ||
} | ||
} | ||
exports.default = WellKnownAuthType; | ||
const UNPARSEABLE_AUTH_TYPE = new WellKnownAuthType( | ||
export const UNPARSEABLE_AUTH_TYPE: WellKnownAuthType = new WellKnownAuthType( | ||
'UNPARSEABLE_AUTH_TYPE_DO_NOT_USE', | ||
-2 | ||
-2, | ||
); | ||
exports.UNPARSEABLE_AUTH_TYPE = UNPARSEABLE_AUTH_TYPE; | ||
const UNKNOWN_RESERVED_AUTH_TYPE = new WellKnownAuthType( | ||
export const UNKNOWN_RESERVED_AUTH_TYPE: WellKnownAuthType = new WellKnownAuthType( | ||
'UNKNOWN_YET_RESERVED_DO_NOT_USE', | ||
-1 | ||
-1, | ||
); | ||
exports.UNKNOWN_RESERVED_AUTH_TYPE = UNKNOWN_RESERVED_AUTH_TYPE; | ||
const SIMPLE = new WellKnownAuthType('simple', 0x00); | ||
exports.SIMPLE = SIMPLE; | ||
const BEARER = new WellKnownAuthType('bearer', 0x01); | ||
exports.BEARER = BEARER; | ||
export const SIMPLE: WellKnownAuthType = new WellKnownAuthType('simple', 0x00); | ||
export const BEARER: WellKnownAuthType = new WellKnownAuthType('bearer', 0x01); | ||
const TYPES_BY_AUTH_ID = new Array(128); | ||
exports.TYPES_BY_AUTH_ID = TYPES_BY_AUTH_ID; | ||
const TYPES_BY_AUTH_STRING = new Map(); | ||
exports.TYPES_BY_AUTH_STRING = TYPES_BY_AUTH_STRING; | ||
export const TYPES_BY_AUTH_ID: WellKnownAuthType[] = new Array(128); | ||
export const TYPES_BY_AUTH_STRING: Map<string, WellKnownAuthType> = new Map(); | ||
const ALL_MIME_TYPES = [ | ||
const ALL_MIME_TYPES: WellKnownAuthType[] = [ | ||
UNPARSEABLE_AUTH_TYPE, | ||
@@ -103,0 +97,0 @@ UNKNOWN_RESERVED_AUTH_TYPE, |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', {value: true}); | ||
exports.TYPES_BY_MIME_STRING = exports.TYPES_BY_MIME_ID = exports.MESSAGE_RSOCKET_COMPOSITE_METADATA = exports.MESSAGE_RSOCKET_ROUTING = exports.MESSAGE_RSOCKET_TRACING_ZIPKIN = exports.MESSAGE_RSOCKET_AUTHENTICATION = exports.MESSAGE_RSOCKET_ACCEPT_MIMETYPES = exports.MESSAGE_RSOCKET_MIMETYPE = exports.APPLICATION_CLOUDEVENTS_JSON = exports.APPLICATION_JAVA_OBJECT = exports.APPLICATION_HESSIAN = exports.VIDEO_VP8 = exports.VIDEO_H265 = exports.VIDEO_H264 = exports.TEXT_XML = exports.TEXT_PLAIN = exports.TEXT_HTML = exports.TEXT_CSV = exports.TEXT_CSS = exports.MULTIPART_MIXED = exports.IMAGE_TIFF = exports.IMAGE_PNG = exports.IMAGE_JPEG = exports.IMAGE_HEIF = exports.IMAGE_HEIF_SEQUENCE = exports.IMAGE_HEIC = exports.IMAGE_HEIC_SEQUENCE = exports.IMAGE_GIG = exports.IMAGE_BMP = exports.AUDIO_VORBIS = exports.AUDIO_OPUS = exports.AUDIO_OGG = exports.AUDIO_MPEG = exports.AUDIO_MPEG3 = exports.AUDIO_MP4 = exports.AUDIO_MP3 = exports.AUDIO_AAC = exports.APPLICATION_ZIP = exports.APPLICATION_XML = exports.APPLICATION_PROTOBUF = exports.APPLICATION_THRIFT = exports.APPLICATION_PDF = exports.APPLICATION_OCTET_STREAM = exports.APPLICATION_JSON = exports.APPLICATION_JAVASCRIPT = exports.APPLICATION_GZIP = exports.APPLICATION_GRAPHQL = exports.APPLICATION_CBOR = exports.APPLICATION_AVRO = exports.UNKNOWN_RESERVED_MIME_TYPE = exports.UNPARSEABLE_MIME_TYPE = exports.default = void 0; | ||
// @flow | ||
class WellKnownMimeType { | ||
constructor(str, identifier) { | ||
export default class WellKnownMimeType { | ||
_identifier: number; | ||
_string: string; | ||
constructor(str: string, identifier: number) { | ||
this._string = str; | ||
@@ -25,3 +27,3 @@ this._identifier = identifier; | ||
*/ | ||
static fromIdentifier(id) { | ||
static fromIdentifier(id: number): WellKnownMimeType { | ||
if (id < 0x00 || id > 0x7f) { | ||
@@ -42,3 +44,3 @@ return UNPARSEABLE_MIME_TYPE; | ||
*/ | ||
static fromString(mimeType) { | ||
static fromString(mimeType: string): WellKnownMimeType { | ||
if (!mimeType) { | ||
@@ -57,3 +59,3 @@ throw new Error('type must be non-null'); | ||
/** @return the byte identifier of the mime type, guaranteed to be positive or zero. */ | ||
get identifier() { | ||
get identifier(): number { | ||
return this._identifier; | ||
@@ -66,3 +68,3 @@ } | ||
*/ | ||
get string() { | ||
get string(): string { | ||
return this._string; | ||
@@ -72,207 +74,211 @@ } | ||
/** @see #getString() */ | ||
toString() { | ||
toString(): string { | ||
return this._string; | ||
} | ||
} | ||
exports.default = WellKnownMimeType; | ||
const UNPARSEABLE_MIME_TYPE = new WellKnownMimeType( | ||
export const UNPARSEABLE_MIME_TYPE: WellKnownMimeType = new WellKnownMimeType( | ||
'UNPARSEABLE_MIME_TYPE_DO_NOT_USE', | ||
-2 | ||
-2, | ||
); | ||
exports.UNPARSEABLE_MIME_TYPE = UNPARSEABLE_MIME_TYPE; | ||
const UNKNOWN_RESERVED_MIME_TYPE = new WellKnownMimeType( | ||
export const UNKNOWN_RESERVED_MIME_TYPE: WellKnownMimeType = new WellKnownMimeType( | ||
'UNKNOWN_YET_RESERVED_DO_NOT_USE', | ||
-1 | ||
-1, | ||
); | ||
exports.UNKNOWN_RESERVED_MIME_TYPE = UNKNOWN_RESERVED_MIME_TYPE; | ||
const APPLICATION_AVRO = new WellKnownMimeType('application/avro', 0x00); | ||
exports.APPLICATION_AVRO = APPLICATION_AVRO; | ||
const APPLICATION_CBOR = new WellKnownMimeType('application/cbor', 0x01); | ||
exports.APPLICATION_CBOR = APPLICATION_CBOR; | ||
const APPLICATION_GRAPHQL = new WellKnownMimeType('application/graphql', 0x02); | ||
exports.APPLICATION_GRAPHQL = APPLICATION_GRAPHQL; | ||
const APPLICATION_GZIP = new WellKnownMimeType('application/gzip', 0x03); | ||
exports.APPLICATION_GZIP = APPLICATION_GZIP; | ||
const APPLICATION_JAVASCRIPT = new WellKnownMimeType( | ||
export const APPLICATION_AVRO: WellKnownMimeType = new WellKnownMimeType( | ||
'application/avro', | ||
0x00, | ||
); | ||
export const APPLICATION_CBOR: WellKnownMimeType = new WellKnownMimeType( | ||
'application/cbor', | ||
0x01, | ||
); | ||
export const APPLICATION_GRAPHQL: WellKnownMimeType = new WellKnownMimeType( | ||
'application/graphql', | ||
0x02, | ||
); | ||
export const APPLICATION_GZIP: WellKnownMimeType = new WellKnownMimeType( | ||
'application/gzip', | ||
0x03, | ||
); | ||
export const APPLICATION_JAVASCRIPT: WellKnownMimeType = new WellKnownMimeType( | ||
'application/javascript', | ||
0x04 | ||
0x04, | ||
); | ||
exports.APPLICATION_JAVASCRIPT = APPLICATION_JAVASCRIPT; | ||
const APPLICATION_JSON = new WellKnownMimeType('application/json', 0x05); | ||
exports.APPLICATION_JSON = APPLICATION_JSON; | ||
const APPLICATION_OCTET_STREAM = new WellKnownMimeType( | ||
export const APPLICATION_JSON: WellKnownMimeType = new WellKnownMimeType( | ||
'application/json', | ||
0x05, | ||
); | ||
export const APPLICATION_OCTET_STREAM: WellKnownMimeType = new WellKnownMimeType( | ||
'application/octet-stream', | ||
0x06 | ||
0x06, | ||
); | ||
exports.APPLICATION_OCTET_STREAM = APPLICATION_OCTET_STREAM; | ||
const APPLICATION_PDF = new WellKnownMimeType('application/pdf', 0x07); | ||
exports.APPLICATION_PDF = APPLICATION_PDF; | ||
const APPLICATION_THRIFT = new WellKnownMimeType( | ||
export const APPLICATION_PDF: WellKnownMimeType = new WellKnownMimeType( | ||
'application/pdf', | ||
0x07, | ||
); | ||
export const APPLICATION_THRIFT: WellKnownMimeType = new WellKnownMimeType( | ||
'application/vnd.apache.thrift.binary', | ||
0x08 | ||
0x08, | ||
); | ||
exports.APPLICATION_THRIFT = APPLICATION_THRIFT; | ||
const APPLICATION_PROTOBUF = new WellKnownMimeType( | ||
export const APPLICATION_PROTOBUF: WellKnownMimeType = new WellKnownMimeType( | ||
'application/vnd.google.protobuf', | ||
0x09 | ||
0x09, | ||
); | ||
exports.APPLICATION_PROTOBUF = APPLICATION_PROTOBUF; | ||
const APPLICATION_XML = new WellKnownMimeType('application/xml', 0x0a); | ||
exports.APPLICATION_XML = APPLICATION_XML; | ||
const APPLICATION_ZIP = new WellKnownMimeType('application/zip', 0x0b); | ||
exports.APPLICATION_ZIP = APPLICATION_ZIP; | ||
const AUDIO_AAC = new WellKnownMimeType('audio/aac', 0x0c); | ||
exports.AUDIO_AAC = AUDIO_AAC; | ||
const AUDIO_MP3 = new WellKnownMimeType('audio/mp3', 0x0d); | ||
exports.AUDIO_MP3 = AUDIO_MP3; | ||
const AUDIO_MP4 = new WellKnownMimeType('audio/mp4', 0x0e); | ||
exports.AUDIO_MP4 = AUDIO_MP4; | ||
const AUDIO_MPEG3 = new WellKnownMimeType('audio/mpeg3', 0x0f); | ||
exports.AUDIO_MPEG3 = AUDIO_MPEG3; | ||
const AUDIO_MPEG = new WellKnownMimeType('audio/mpeg', 0x10); | ||
exports.AUDIO_MPEG = AUDIO_MPEG; | ||
const AUDIO_OGG = new WellKnownMimeType('audio/ogg', 0x11); | ||
exports.AUDIO_OGG = AUDIO_OGG; | ||
const AUDIO_OPUS = new WellKnownMimeType('audio/opus', 0x12); | ||
exports.AUDIO_OPUS = AUDIO_OPUS; | ||
const AUDIO_VORBIS = new WellKnownMimeType('audio/vorbis', 0x13); | ||
exports.AUDIO_VORBIS = AUDIO_VORBIS; | ||
const IMAGE_BMP = new WellKnownMimeType('image/bmp', 0x14); | ||
exports.IMAGE_BMP = IMAGE_BMP; | ||
const IMAGE_GIG = new WellKnownMimeType('image/gif', 0x15); | ||
exports.IMAGE_GIG = IMAGE_GIG; | ||
const IMAGE_HEIC_SEQUENCE = new WellKnownMimeType('image/heic-sequence', 0x16); | ||
exports.IMAGE_HEIC_SEQUENCE = IMAGE_HEIC_SEQUENCE; | ||
const IMAGE_HEIC = new WellKnownMimeType('image/heic', 0x17); | ||
exports.IMAGE_HEIC = IMAGE_HEIC; | ||
const IMAGE_HEIF_SEQUENCE = new WellKnownMimeType('image/heif-sequence', 0x18); | ||
exports.IMAGE_HEIF_SEQUENCE = IMAGE_HEIF_SEQUENCE; | ||
const IMAGE_HEIF = new WellKnownMimeType('image/heif', 0x19); | ||
exports.IMAGE_HEIF = IMAGE_HEIF; | ||
const IMAGE_JPEG = new WellKnownMimeType('image/jpeg', 0x1a); | ||
exports.IMAGE_JPEG = IMAGE_JPEG; | ||
const IMAGE_PNG = new WellKnownMimeType('image/png', 0x1b); | ||
exports.IMAGE_PNG = IMAGE_PNG; | ||
const IMAGE_TIFF = new WellKnownMimeType('image/tiff', 0x1c); | ||
exports.IMAGE_TIFF = IMAGE_TIFF; | ||
const MULTIPART_MIXED = new WellKnownMimeType('multipart/mixed', 0x1d); | ||
exports.MULTIPART_MIXED = MULTIPART_MIXED; | ||
const TEXT_CSS = new WellKnownMimeType('text/css', 0x1e); | ||
exports.TEXT_CSS = TEXT_CSS; | ||
const TEXT_CSV = new WellKnownMimeType('text/csv', 0x1f); | ||
exports.TEXT_CSV = TEXT_CSV; | ||
const TEXT_HTML = new WellKnownMimeType('text/html', 0x20); | ||
exports.TEXT_HTML = TEXT_HTML; | ||
const TEXT_PLAIN = new WellKnownMimeType('text/plain', 0x21); | ||
exports.TEXT_PLAIN = TEXT_PLAIN; | ||
const TEXT_XML = new WellKnownMimeType('text/xml', 0x22); | ||
exports.TEXT_XML = TEXT_XML; | ||
const VIDEO_H264 = new WellKnownMimeType('video/H264', 0x23); | ||
exports.VIDEO_H264 = VIDEO_H264; | ||
const VIDEO_H265 = new WellKnownMimeType('video/H265', 0x24); | ||
exports.VIDEO_H265 = VIDEO_H265; | ||
const VIDEO_VP8 = new WellKnownMimeType('video/VP8', 0x25); | ||
exports.VIDEO_VP8 = VIDEO_VP8; | ||
const APPLICATION_HESSIAN = new WellKnownMimeType( | ||
export const APPLICATION_XML: WellKnownMimeType = new WellKnownMimeType( | ||
'application/xml', | ||
0x0a, | ||
); | ||
export const APPLICATION_ZIP: WellKnownMimeType = new WellKnownMimeType( | ||
'application/zip', | ||
0x0b, | ||
); | ||
export const AUDIO_AAC: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/aac', | ||
0x0c, | ||
); | ||
export const AUDIO_MP3: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/mp3', | ||
0x0d, | ||
); | ||
export const AUDIO_MP4: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/mp4', | ||
0x0e, | ||
); | ||
export const AUDIO_MPEG3: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/mpeg3', | ||
0x0f, | ||
); | ||
export const AUDIO_MPEG: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/mpeg', | ||
0x10, | ||
); | ||
export const AUDIO_OGG: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/ogg', | ||
0x11, | ||
); | ||
export const AUDIO_OPUS: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/opus', | ||
0x12, | ||
); | ||
export const AUDIO_VORBIS: WellKnownMimeType = new WellKnownMimeType( | ||
'audio/vorbis', | ||
0x13, | ||
); | ||
export const IMAGE_BMP: WellKnownMimeType = new WellKnownMimeType( | ||
'image/bmp', | ||
0x14, | ||
); | ||
export const IMAGE_GIG: WellKnownMimeType = new WellKnownMimeType( | ||
'image/gif', | ||
0x15, | ||
); | ||
export const IMAGE_HEIC_SEQUENCE: WellKnownMimeType = new WellKnownMimeType( | ||
'image/heic-sequence', | ||
0x16, | ||
); | ||
export const IMAGE_HEIC: WellKnownMimeType = new WellKnownMimeType( | ||
'image/heic', | ||
0x17, | ||
); | ||
export const IMAGE_HEIF_SEQUENCE: WellKnownMimeType = new WellKnownMimeType( | ||
'image/heif-sequence', | ||
0x18, | ||
); | ||
export const IMAGE_HEIF: WellKnownMimeType = new WellKnownMimeType( | ||
'image/heif', | ||
0x19, | ||
); | ||
export const IMAGE_JPEG: WellKnownMimeType = new WellKnownMimeType( | ||
'image/jpeg', | ||
0x1a, | ||
); | ||
export const IMAGE_PNG: WellKnownMimeType = new WellKnownMimeType( | ||
'image/png', | ||
0x1b, | ||
); | ||
export const IMAGE_TIFF: WellKnownMimeType = new WellKnownMimeType( | ||
'image/tiff', | ||
0x1c, | ||
); | ||
export const MULTIPART_MIXED: WellKnownMimeType = new WellKnownMimeType( | ||
'multipart/mixed', | ||
0x1d, | ||
); | ||
export const TEXT_CSS: WellKnownMimeType = new WellKnownMimeType( | ||
'text/css', | ||
0x1e, | ||
); | ||
export const TEXT_CSV: WellKnownMimeType = new WellKnownMimeType( | ||
'text/csv', | ||
0x1f, | ||
); | ||
export const TEXT_HTML: WellKnownMimeType = new WellKnownMimeType( | ||
'text/html', | ||
0x20, | ||
); | ||
export const TEXT_PLAIN: WellKnownMimeType = new WellKnownMimeType( | ||
'text/plain', | ||
0x21, | ||
); | ||
export const TEXT_XML: WellKnownMimeType = new WellKnownMimeType( | ||
'text/xml', | ||
0x22, | ||
); | ||
export const VIDEO_H264: WellKnownMimeType = new WellKnownMimeType( | ||
'video/H264', | ||
0x23, | ||
); | ||
export const VIDEO_H265: WellKnownMimeType = new WellKnownMimeType( | ||
'video/H265', | ||
0x24, | ||
); | ||
export const VIDEO_VP8: WellKnownMimeType = new WellKnownMimeType( | ||
'video/VP8', | ||
0x25, | ||
); | ||
export const APPLICATION_HESSIAN: WellKnownMimeType = new WellKnownMimeType( | ||
'application/x-hessian', | ||
0x26 | ||
0x26, | ||
); | ||
exports.APPLICATION_HESSIAN = APPLICATION_HESSIAN; | ||
const APPLICATION_JAVA_OBJECT = new WellKnownMimeType( | ||
export const APPLICATION_JAVA_OBJECT: WellKnownMimeType = new WellKnownMimeType( | ||
'application/x-java-object', | ||
0x27 | ||
0x27, | ||
); | ||
exports.APPLICATION_JAVA_OBJECT = APPLICATION_JAVA_OBJECT; | ||
const APPLICATION_CLOUDEVENTS_JSON = new WellKnownMimeType( | ||
export const APPLICATION_CLOUDEVENTS_JSON: WellKnownMimeType = new WellKnownMimeType( | ||
'application/cloudevents+json', | ||
0x28 | ||
0x28, | ||
); | ||
// ... reserved for future use ... | ||
exports.APPLICATION_CLOUDEVENTS_JSON = APPLICATION_CLOUDEVENTS_JSON; | ||
const MESSAGE_RSOCKET_MIMETYPE = new WellKnownMimeType( | ||
export const MESSAGE_RSOCKET_MIMETYPE: WellKnownMimeType = new WellKnownMimeType( | ||
'message/x.rsocket.mime-type.v0', | ||
0x7a | ||
0x7a, | ||
); | ||
exports.MESSAGE_RSOCKET_MIMETYPE = MESSAGE_RSOCKET_MIMETYPE; | ||
const MESSAGE_RSOCKET_ACCEPT_MIMETYPES = new WellKnownMimeType( | ||
export const MESSAGE_RSOCKET_ACCEPT_MIMETYPES: WellKnownMimeType = new WellKnownMimeType( | ||
'message/x.rsocket.accept-mime-types.v0', | ||
0x7b | ||
0x7b, | ||
); | ||
exports.MESSAGE_RSOCKET_ACCEPT_MIMETYPES = MESSAGE_RSOCKET_ACCEPT_MIMETYPES; | ||
const MESSAGE_RSOCKET_AUTHENTICATION = new WellKnownMimeType( | ||
export const MESSAGE_RSOCKET_AUTHENTICATION: WellKnownMimeType = new WellKnownMimeType( | ||
'message/x.rsocket.authentication.v0', | ||
0x7c | ||
0x7c, | ||
); | ||
exports.MESSAGE_RSOCKET_AUTHENTICATION = MESSAGE_RSOCKET_AUTHENTICATION; | ||
const MESSAGE_RSOCKET_TRACING_ZIPKIN = new WellKnownMimeType( | ||
export const MESSAGE_RSOCKET_TRACING_ZIPKIN: WellKnownMimeType = new WellKnownMimeType( | ||
'message/x.rsocket.tracing-zipkin.v0', | ||
0x7d | ||
0x7d, | ||
); | ||
exports.MESSAGE_RSOCKET_TRACING_ZIPKIN = MESSAGE_RSOCKET_TRACING_ZIPKIN; | ||
const MESSAGE_RSOCKET_ROUTING = new WellKnownMimeType( | ||
export const MESSAGE_RSOCKET_ROUTING: WellKnownMimeType = new WellKnownMimeType( | ||
'message/x.rsocket.routing.v0', | ||
0x7e | ||
0x7e, | ||
); | ||
exports.MESSAGE_RSOCKET_ROUTING = MESSAGE_RSOCKET_ROUTING; | ||
const MESSAGE_RSOCKET_COMPOSITE_METADATA = new WellKnownMimeType( | ||
export const MESSAGE_RSOCKET_COMPOSITE_METADATA: WellKnownMimeType = new WellKnownMimeType( | ||
'message/x.rsocket.composite-metadata.v0', | ||
0x7f | ||
0x7f, | ||
); | ||
exports.MESSAGE_RSOCKET_COMPOSITE_METADATA = MESSAGE_RSOCKET_COMPOSITE_METADATA; | ||
const TYPES_BY_MIME_ID = new Array(128); | ||
exports.TYPES_BY_MIME_ID = TYPES_BY_MIME_ID; | ||
const TYPES_BY_MIME_STRING = new Map(); | ||
exports.TYPES_BY_MIME_STRING = TYPES_BY_MIME_STRING; | ||
export const TYPES_BY_MIME_ID: WellKnownMimeType[] = new Array(128); | ||
export const TYPES_BY_MIME_STRING: Map<string, WellKnownMimeType> = new Map(); | ||
const ALL_MIME_TYPES = [ | ||
const ALL_MIME_TYPES: WellKnownMimeType[] = [ | ||
UNPARSEABLE_MIME_TYPE, | ||
@@ -279,0 +285,0 @@ UNKNOWN_RESERVED_MIME_TYPE, |
{ | ||
"name": "rsocket-core", | ||
"description": "RSocket core", | ||
"version": "0.0.27", | ||
"version": "0.0.28", | ||
"repository": { | ||
@@ -12,6 +12,6 @@ "type": "git", | ||
"dependencies": { | ||
"rsocket-flowable": "^0.0.27", | ||
"rsocket-types": "^0.0.27" | ||
"rsocket-flowable": "^0.0.28", | ||
"rsocket-types": "^0.0.28" | ||
}, | ||
"gitHead": "23da9b0e9377ba52d3294cf4763cbbf3de7ba7b1" | ||
"gitHead": "1dd3eb28183991d663392d87877225bf862946e2" | ||
} |
@@ -0,0 +0,0 @@ # rsocket-core |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Deprecated
MaintenanceThe maintainer of the package marked it as deprecated. This could indicate that a single version should not be used, or that the package is no longer maintained and any new vulnerabilities will not be fixed.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
385854
25
11646
1
+ Addedrsocket-flowable@0.0.28(transitive)
+ Addedrsocket-types@0.0.28(transitive)
- Removedrsocket-flowable@0.0.27(transitive)
- Removedrsocket-types@0.0.27(transitive)
Updatedrsocket-flowable@^0.0.28
Updatedrsocket-types@^0.0.28