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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,229 changes: 1,093 additions & 136 deletions dist/web/pubnub.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/web/pubnub.min.js

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions dist/web/pubnub.worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -1861,6 +1861,10 @@
* Request will be sent using `PATCH` method.
*/
TransportMethod["PATCH"] = "PATCH";
/**
* Request will be sent using `PUT` method.
*/
TransportMethod["PUT"] = "PUT";
/**
* Request will be sent using `DELETE` method.
*/
Expand Down
2 changes: 1 addition & 1 deletion dist/web/pubnub.worker.min.js

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion lib/core/components/request.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ class AbstractRequest {
if (headers)
request.headers = headers;
// Attach body (if required).
if (request.method === transport_request_1.TransportMethod.POST || request.method === transport_request_1.TransportMethod.PATCH) {
if (request.method === transport_request_1.TransportMethod.POST ||
request.method === transport_request_1.TransportMethod.PATCH ||
request.method === transport_request_1.TransportMethod.PUT) {
const [body, formData] = [this.body, this.formData];
if (formData)
request.formData = formData;
Expand Down
51 changes: 51 additions & 0 deletions lib/core/constants/operations.js
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,57 @@ var RequestOperation;
*/
RequestOperation["PNSetMembershipsOperation"] = "PNSetMembershipsOperation";
// --------------------------------------------------------
// ------------------- DataSync API ----------------------
// --------------------------------------------------------
/**
* Create entity REST API operation.
*/
RequestOperation["PNCreateEntityOperation"] = "PNCreateEntityOperation";
/**
* Get entity REST API operation.
*/
RequestOperation["PNGetEntityOperation"] = "PNGetEntityOperation";
/**
* Get all entities REST API operation.
*/
RequestOperation["PNGetAllEntitiesOperation"] = "PNGetAllEntitiesOperation";
/**
* Update entity REST API operation.
*/
RequestOperation["PNUpdateEntityOperation"] = "PNUpdateEntityOperation";
/**
* Patch entity REST API operation.
*/
RequestOperation["PNPatchEntityOperation"] = "PNPatchEntityOperation";
/**
* Remove entity REST API operation.
*/
RequestOperation["PNRemoveEntityOperation"] = "PNRemoveEntityOperation";
/**
* Create relationship REST API operation.
*/
RequestOperation["PNCreateRelationshipOperation"] = "PNCreateRelationshipOperation";
/**
* Get relationship REST API operation.
*/
RequestOperation["PNGetRelationshipOperation"] = "PNGetRelationshipOperation";
/**
* Get all relationships REST API operation.
*/
RequestOperation["PNGetAllRelationshipsOperation"] = "PNGetAllRelationshipsOperation";
/**
* Update relationship REST API operation.
*/
RequestOperation["PNUpdateRelationshipOperation"] = "PNUpdateRelationshipOperation";
/**
* Patch relationship REST API operation.
*/
RequestOperation["PNPatchRelationshipOperation"] = "PNPatchRelationshipOperation";
/**
* Remove relationship REST API operation.
*/
RequestOperation["PNRemoveRelationshipOperation"] = "PNRemoveRelationshipOperation";
// --------------------------------------------------------
// -------------------- File Upload API -------------------
// --------------------------------------------------------
/**
Expand Down
52 changes: 52 additions & 0 deletions lib/core/endpoints/data_sync/entity/create.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"use strict";
/**
* Create Entity REST API module.
*
* @internal
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateEntityRequest = void 0;
const transport_request_1 = require("../../../types/transport-request");
const request_1 = require("../../../components/request");
const operations_1 = __importDefault(require("../../../constants/operations"));
// endregion
/**
* Create Entity request.
*
* @internal
*/
class CreateEntityRequest extends request_1.AbstractRequest {
constructor(parameters) {
super({ method: transport_request_1.TransportMethod.POST });
this.parameters = parameters;
}
operation() {
return operations_1.default.PNCreateEntityOperation;
}
validate() {
if (!this.parameters.entity)
return 'Entity cannot be empty';
if (!this.parameters.entity.entityClass)
return 'Entity class cannot be empty';
if (this.parameters.entity.entityClassVersion === undefined || this.parameters.entity.entityClassVersion === null)
return 'Entity class version cannot be empty';
}
get headers() {
var _a;
let headers = (_a = super.headers) !== null && _a !== void 0 ? _a : {};
if (this.parameters.idempotencyKey)
headers = Object.assign(Object.assign({}, headers), { 'Idempotency-Key': this.parameters.idempotencyKey });
return Object.assign(Object.assign({}, headers), { 'Content-Type': 'application/vnd.pubnub.objects.entity+json;version=1' });
}
get path() {
const { keySet: { subscribeKey }, } = this.parameters;
return `/subkeys/${subscribeKey}/entities`;
}
get body() {
return JSON.stringify({ data: this.parameters.entity });
}
}
exports.CreateEntityRequest = CreateEntityRequest;
51 changes: 51 additions & 0 deletions lib/core/endpoints/data_sync/entity/get-all.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"use strict";
/**
* Get All Entities REST API module.
*
* @internal
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetAllEntitiesRequest = void 0;
const request_1 = require("../../../components/request");
const operations_1 = __importDefault(require("../../../constants/operations"));
// --------------------------------------------------------
// ----------------------- Defaults -----------------------
// --------------------------------------------------------
// region Defaults
/**
* Default number of items per page.
*/
const DEFAULT_LIMIT = 20;
// endregion
/**
* Get All Entities request.
*
* @internal
*/
class GetAllEntitiesRequest extends request_1.AbstractRequest {
constructor(parameters) {
var _a;
super();
this.parameters = parameters;
// Apply defaults.
(_a = parameters.limit) !== null && _a !== void 0 ? _a : (parameters.limit = DEFAULT_LIMIT);
}
operation() {
return operations_1.default.PNGetAllEntitiesOperation;
}
validate() {
if (!this.parameters.entityClass)
return 'Entity class cannot be empty';
}
get path() {
return `/subkeys/${this.parameters.keySet.subscribeKey}/entities`;
}
get queryParameters() {
const { entityClass, entityClassVersion, cursor, limit, filter, sort, filterAdvanced } = this.parameters;
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ entity_class: entityClass }, (entityClassVersion !== undefined ? { entity_class_version: `${entityClassVersion}` } : {})), (cursor ? { cursor } : {})), (limit ? { limit: `${limit}` } : {})), (filter ? { filter } : {})), (sort ? { sort } : {})), (filterAdvanced ? { filter_advanced: filterAdvanced } : {}));
}
}
exports.GetAllEntitiesRequest = GetAllEntitiesRequest;
38 changes: 38 additions & 0 deletions lib/core/endpoints/data_sync/entity/get.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"use strict";
/**
* Get Entity REST API module.
*
* @internal
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetEntityRequest = void 0;
const request_1 = require("../../../components/request");
const operations_1 = __importDefault(require("../../../constants/operations"));
const utils_1 = require("../../../utils");
// endregion
/**
* Get Entity request.
*
* @internal
*/
class GetEntityRequest extends request_1.AbstractRequest {
constructor(parameters) {
super();
this.parameters = parameters;
}
operation() {
return operations_1.default.PNGetEntityOperation;
}
validate() {
if (!this.parameters.id)
return 'Entity id cannot be empty';
}
get path() {
const { keySet: { subscribeKey }, id, } = this.parameters;
return `/subkeys/${subscribeKey}/entities/${(0, utils_1.encodeString)(id)}`;
}
}
exports.GetEntityRequest = GetEntityRequest;
68 changes: 68 additions & 0 deletions lib/core/endpoints/data_sync/entity/patch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"use strict";
/**
* Patch Entity REST API module.
*
* Partial update via JSON Patch (RFC 6902).
* Accepts `set` (dot-notation key-value pairs) and `remove` (dot-notation paths)
* and converts them to JSON Patch operations on the wire.
*
* @internal
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PatchEntityRequest = void 0;
const transport_request_1 = require("../../../types/transport-request");
const request_1 = require("../../../components/request");
const operations_1 = __importDefault(require("../../../constants/operations"));
const data_sync_1 = require("../../../types/api/data-sync");
const utils_1 = require("../../../utils");
// endregion
/**
* Patch Entity request.
*
* @internal
*/
class PatchEntityRequest extends request_1.AbstractRequest {
constructor(parameters) {
super({ method: transport_request_1.TransportMethod.PATCH });
this.parameters = parameters;
}
operation() {
return operations_1.default.PNPatchEntityOperation;
}
validate() {
if (!this.parameters.id)
return 'Entity id cannot be empty';
const hasSet = this.parameters.set && Object.keys(this.parameters.set).length > 0;
const hasRemove = this.parameters.remove && this.parameters.remove.length > 0;
if (!hasSet && !hasRemove)
return 'At least one of set or remove must be provided';
}
get headers() {
var _a;
let headers = (_a = super.headers) !== null && _a !== void 0 ? _a : {};
if (this.parameters.ifMatchesEtag)
headers = Object.assign(Object.assign({}, headers), { 'If-Match': this.parameters.ifMatchesEtag });
if (this.parameters.idempotencyKey)
headers = Object.assign(Object.assign({}, headers), { 'Idempotency-Key': this.parameters.idempotencyKey });
return Object.assign(Object.assign({}, headers), { 'Content-Type': 'application/json-patch+json' });
}
get path() {
const { keySet: { subscribeKey }, id, } = this.parameters;
return `/subkeys/${subscribeKey}/entities/${(0, utils_1.encodeString)(id)}`;
}
get body() {
// Prefix all field paths with 'payload.' so users write simple field names
// (e.g., 'standards') and the SDK produces '/payload/standards' on the wire.
const prefixedSet = this.parameters.set
? Object.fromEntries(Object.entries(this.parameters.set).map(([key, value]) => [`payload.${key}`, value]))
: undefined;
const prefixedRemove = this.parameters.remove ? this.parameters.remove.map((key) => `payload.${key}`) : undefined;
// Convert set/remove (dot notation) to JSON Patch operations (JSON Pointer notation).
const jsonPatchOps = (0, data_sync_1.toJsonPatchOperations)(prefixedSet, prefixedRemove);
return JSON.stringify(jsonPatchOps);
}
}
exports.PatchEntityRequest = PatchEntityRequest;
60 changes: 60 additions & 0 deletions lib/core/endpoints/data_sync/entity/remove.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
"use strict";
/**
* Remove Entity REST API module.
*
* @internal
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RemoveEntityRequest = void 0;
const transport_request_1 = require("../../../types/transport-request");
const request_1 = require("../../../components/request");
const operations_1 = __importDefault(require("../../../constants/operations"));
const utils_1 = require("../../../utils");
// endregion
/**
* Remove Entity request.
*
* @internal
*/
class RemoveEntityRequest extends request_1.AbstractRequest {
constructor(parameters) {
super({ method: transport_request_1.TransportMethod.DELETE });
this.parameters = parameters;
}
operation() {
return operations_1.default.PNRemoveEntityOperation;
}
validate() {
if (!this.parameters.id)
return 'Entity id cannot be empty';
}
get headers() {
var _a;
let headers = (_a = super.headers) !== null && _a !== void 0 ? _a : {};
if (this.parameters.ifMatchesEtag)
headers = Object.assign(Object.assign({}, headers), { 'If-Match': this.parameters.ifMatchesEtag });
return Object.keys(headers).length > 0 ? headers : undefined;
}
parse(response) {
return __awaiter(this, void 0, void 0, function* () {
return { status: response.status };
});
}
get path() {
const { keySet: { subscribeKey }, id, } = this.parameters;
return `/subkeys/${subscribeKey}/entities/${(0, utils_1.encodeString)(id)}`;
}
}
exports.RemoveEntityRequest = RemoveEntityRequest;
Loading
Loading